﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-糊言乱语-文章分类-Oracle Database</title><link>http://www.blogjava.net/coolingverse/category/26253.html</link><description>志未半斤, 才无八两. 有苦有乐, 糊涂过活。</description><language>zh-cn</language><lastBuildDate>Fri, 28 Sep 2007 14:52:49 GMT</lastBuildDate><pubDate>Fri, 28 Sep 2007 14:52:49 GMT</pubDate><ttl>60</ttl><item><title>Oracle SQL性能优化技巧大总结</title><link>http://www.blogjava.net/coolingverse/articles/148458.html</link><dc:creator>Stanley Sun</dc:creator><author>Stanley Sun</author><pubDate>Wed, 26 Sep 2007 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/coolingverse/articles/148458.html</guid><wfw:comment>http://www.blogjava.net/coolingverse/comments/148458.html</wfw:comment><comments>http://www.blogjava.net/coolingverse/articles/148458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolingverse/comments/commentRss/148458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolingverse/services/trackbacks/148458.html</trackback:ping><description><![CDATA[<div class="postText"><strong>（1） 选择最有效率的表名顺序(只在基于规则的优化器中有效)：</strong><br/>ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名，FROM子句中写在最后的表(基础表 driving table)将被最先处理，在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.<br/><strong>（2） WHERE子句中的连接顺序．：</strong><br/>ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.<br/><strong>（3） SELECT子句中避免使用 ' * '：</strong><br/>ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间<br/>（<strong>4） 减少访问数据库的次数：<br/></strong> ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等；<br/><strong>（5） 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200<br/></strong> <strong>（6） 使用DECODE函数来减少处理时间：</strong><br/>使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.<br/><strong>（7） 整合简单,无关联的数据库访问：</strong><br/>如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)<br/><strong>（8） 删除重复记录：</strong><br/>最高效的删除重复记录方法 ( 因为使用了ROWID)例子：<br/>DELETE FROM EMP E WHERE E.ROWID &gt; (SELECT MIN(X.ROWID)<br/>FROM EMP X WHERE X.EMP_NO = E.EMP_NO);<br/><strong>（9） 用TRUNCATE替代DELETE：</strong><br/>当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)<br/><strong>（10） 尽量多使用COMMIT：</strong><br/>只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:<br/>COMMIT所释放的资源:<br/>a. 回滚段上用于恢复数据的信息.<br/>b. 被程序语句获得的锁<br/>c. redo log buffer 中的空间<br/>d. ORACLE为管理上述3种资源中的内部花费
<p><strong>（11） 用Where子句替换HAVING子句：</strong><br/>避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中，on是最先执行，where次之，having最后，因为on是先把不符合条件的记录过滤后才进行统计，它就可以减少中间运算要处理的数据，按理说应该速度是最快的，where也应该比having快点的，因为它过滤数据后才进行sum，在两个表联接时才用on的，所以在一个表的时候，就剩下where跟having比较了。在这单表查询统计的情况下，如果要过滤的条件没有涉及到要计算字段，那它们的结果是一样的，只是where可以使用rushmore技术，而having就不能，在速度上后者要慢如果要涉及到计算的字段，就表示在没计算之前，这个字段的值是不确定的，根据上篇写的工作流程，where的作用时间是在计算之前就完成的，而having就是在计算后才起作用的，所以在这种情况下，两者的结果会不同。在多表联接查询时，on比where更早起作用。系统首先根据各个表之间的联接条件，把多个表合成一个临时表后，再由where进行过滤，然后再计算，计算完后再由having进行过滤。由此可见，要想过滤条件起到正确的作用，首先要明白这个条件应该在什么时候起作用，然后再决定放在那里<br/><strong>（12） 减少对表的查询：</strong><br/>在含有子查询的SQL语句中,要特别注意减少对表的查询.例子：<br/>SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT<br/>TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)<br/><strong>（13） 通过内部函数提高SQL效率.：</strong><br/>复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的<br/><strong>（14） 使用表的别名(Alias)：<br/></strong> 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.<br/><strong>（15） 用EXISTS替代IN、用NOT EXISTS替代NOT IN：</strong><br/>在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.<br/>例子：<br/>（高效）SELECT * FROM EMP (基础表) WHERE EMPNO &gt; 0 AND EXISTS (SELECT 'X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'MELB')<br/>(低效)SELECT * FROM EMP (基础表) WHERE EMPNO &gt; 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = 'MELB')<br/><strong>（16） 识别'低效执行'的SQL语句：</strong><br/>虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法：<br/>SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,<br/>SQL_TEXT FROM V$SQLAREA WHERE EXECUTIONS&gt;0 AND BUFFER_GETS &gt; 0 AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8 ORDER BY 4 DESC;<br/><strong>（17） 用索引提高效率</strong>：<br/>索引是表的一个概念部分,用来提高检索数据的效率，ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.：<br/>ALTER INDEX &lt;INDEXNAME&gt; REBUILD &lt;TABLESPACENAME&gt;<br/><strong>（18） 用EXISTS替换DISTINCT：</strong><br/>当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子：<br/>(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E<br/>WHERE D.DEPT_NO = E.DEPT_NO (高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT 'X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);<br/><strong>（19） sql语句用大写的；因为oracle总是先解析sql语句，把小写的字母转换成大写的再执行</strong><br/><strong>（20） 在java代码中尽量少用连接符"＋"连接字符串！</strong></p>
<p><strong>（21） 避免在索引列上使用NOT 通常，</strong>　<br/>我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE"遇到"NOT,他就会停止使用索引转而执行全表扫描.<br/><br/><strong>（22） 避免在索引列上使用计算．</strong><br/>WHERE子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描． 举例: 低效：<br/><br clear="all"/></p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed" xml:space="preserve">
</pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">&#8230;</span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">DEPT</span> <span style="COLOR: #0000ff">WHERE</span> <span style="COLOR: #000000">SAL</span> <span style="COLOR: #808080">*</span> <span style="FONT-WEIGHT: bold; COLOR: #800000">12</span> <span style="COLOR: #808080">&gt;</span> <span style="FONT-WEIGHT: bold; COLOR: #800000">25000</span><span style="COLOR: #000000">; 高效:</span> <span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">&#8230;</span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">DEPT</span> <span style="COLOR: #0000ff">WHERE</span> <span style="COLOR: #000000">SAL</span> <span style="COLOR: #808080">&gt;</span> <span style="FONT-WEIGHT: bold; COLOR: #800000">25000</span><span style="COLOR: #808080">/</span><span style="FONT-WEIGHT: bold; COLOR: #800000">12</span><span style="COLOR: #000000">;</span></div>
<pre xml:space="preserve">

</pre></div>
<p><strong>（23） 用&gt;=替代&gt;<br/></strong> 高效:<br/>SELECT * FROM EMP WHERE DEPTNO &gt;=4 低效:<br/>SELECT * FROM EMP WHERE DEPTNO &gt;3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.<br/><br/><strong>（24） 用UNION替换OR (适用于索引列)</strong><br/>通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. 高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = "MELBOURNE" 低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = "MELBOURNE" 如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.<br/><br/><strong>（25） 用IN来替换OR</strong><br/>这是一条简单易记的规则，但是实际的执行效果还须检验，在ORACLE8i下，两者的执行路径似乎是相同的．　<br/>低效: SELECT&#8230;. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 高效 SELECT&#8230; FROM LOCATION WHERE LOC_IN IN (10,20,30);<br/><br/><strong>（26） 避免在索引列上使用IS NULL和IS NOT NULL</strong><br/>避免在索引中使用任何可以为空的列，ORACLE将无法使用该索引．对于单列索引，如果列包含空值，索引中将不存在此记录. 对于复合索引，如果每个列都为空，索引中同样不存在此记录.　如果至少有一个列不为空，则记录存在于索引中．举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值（123,null）的记录(插入). 然而如果所有的索引列都为空，ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.<br/>低效: (索引失效) SELECT &#8230; FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; 高效: (索引有效) SELECT &#8230; FROM DEPARTMENT WHERE DEPT_CODE &gt;=0;<br/><br/><strong>（27） 总是使用索引的第一个列：<br/></strong> 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则，当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引<br/><br/><strong>（28） 用UNION-ALL 替换UNION ( 如果有可能的话)：</strong><br/>当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是，UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量<br/>低效：<br/></p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 777px; HEIGHT: 249px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed" xml:space="preserve">
</pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">ACCT_NUM, BALANCE_AMT</span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">DEBIT_TRANSACTIONS<br/></span> <span style="COLOR: #0000ff">WHERE</span> <span style="COLOR: #000000">TRAN_DATE</span> <span style="COLOR: #808080">=</span> <span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">31-DEC-95</span><span style="COLOR: #ff0000">'</span> <span style="COLOR: #0000ff">UNION</span> <span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">ACCT_NUM, BALANCE_AMT<br/></span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">DEBIT_TRANSACTIONS</span> <span style="COLOR: #0000ff">WHERE</span> <span style="COLOR: #000000">TRAN_DATE</span> <span style="COLOR: #808080">=</span> <span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">31-DEC-95</span><span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">高效:</span> <span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">ACCT_NUM, BALANCE_AMT<br/><br/></span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">DEBIT_TRANSACTIONS</span> <span style="COLOR: #0000ff">WHERE</span> <span style="COLOR: #000000">TRAN_DATE</span> <span style="COLOR: #808080">=</span> <span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">31-DEC-95</span><span style="COLOR: #ff0000">'</span> <span style="COLOR: #0000ff">UNION</span> <span style="COLOR: #808080">ALL</span> <span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">ACCT_NUM, BALANCE_AMT<br/></span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">DEBIT_TRANSACTIONS</span> <span style="COLOR: #0000ff">WHERE</span> <span style="COLOR: #000000">TRAN_DATE</span> <span style="COLOR: #808080">=</span> <span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">31-DEC-95</span><span style="COLOR: #ff0000">'</span></div>
<pre xml:space="preserve">

</pre></div>
<p><br/><br/><strong>（29） 用WHERE替代ORDER BY：</strong><br/>ORDER BY 子句只在两种严格的条件下使用索引.<br/>ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.<br/>ORDER BY中所有的列必须定义为非空.<br/>WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.<br/>例如: 表DEPT包含以下列:<br/>DEPT_CODE PK NOT NULL<br/>DEPT_DESC NOT NULL<br/>DEPT_TYPE NULL<br/>低效: (索引不被使用) SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE 高效: (使用索引) SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE &gt; 0<br/><br/><strong>（30） 避免改变索引列的类型.:</strong><br/>当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.<br/>假设 EMPNO是一个数值类型的索引列. SELECT &#8230; FROM EMP WHERE EMPNO = '123' 实际上,经过ORACLE类型转换, 语句转化为: SELECT &#8230; FROM EMP WHERE EMPNO = TO_NUMBER('123') 幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. 现在,假设EMP_TYPE是一个字符类型的索引列. SELECT &#8230; FROM EMP WHERE EMP_TYPE = 123 这个语句被ORACLE转换为: SELECT &#8230; FROM EMP WHERETO_NUMBER(EMP_TYPE)=123 因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型</p>
<strong>（31） 需要当心的WHERE子句:</strong><br/>某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. 在下面的例子里, (1)'!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) '||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) '+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.<br/><strong>（32） a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.<br/></strong> b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!<br/><strong>（33） 避免使用耗费资源的操作:</strong><br/>带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强<br/><strong>（34） 优化GROUP BY:</strong><br/>提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.<br/>低效:<br/><div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 807px; HEIGHT: 152px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed" xml:space="preserve">
</pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">JOB ,</span> <span style="COLOR: #ff00ff">AVG</span><span style="COLOR: #000000">(SAL)</span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">EMP</span> <span style="COLOR: #0000ff">GROUP</span> <span style="COLOR: #000000">JOB</span> <span style="COLOR: #0000ff">HAVING</span> <span style="COLOR: #000000">JOB</span> <span style="COLOR: #808080">=</span> <span style="COLOR: #000000">'PRESIDENT</span><span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">OR JOB = 'MANAGER</span><span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">高效:</span> <span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000">JOB ,</span> <span style="COLOR: #ff00ff">AVG</span><span style="COLOR: #000000">(SAL)</span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000">EMP</span> <span style="COLOR: #0000ff">WHERE</span> <span style="COLOR: #000000">JOB</span> <span style="COLOR: #808080">=</span> <span style="COLOR: #000000">'PRESIDENT</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">OR JOB = 'MANAGER</span><span style="COLOR: #ff0000">'</span> <span style="COLOR: #0000ff">GROUP</span> <span style="COLOR: #000000">JOB</span></div>
<pre xml:space="preserve">

</pre></div>
</div>
 <img src ="http://www.blogjava.net/coolingverse/aggbug/148458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolingverse/" target="_blank">Stanley Sun</a> 2007-09-26 22:51 <a href="http://www.blogjava.net/coolingverse/articles/148458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle笔记整理四[物理结构管理]</title><link>http://www.blogjava.net/coolingverse/articles/135278.html</link><dc:creator>Stanley Sun</dc:creator><author>Stanley Sun</author><pubDate>Wed, 08 Aug 2007 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/coolingverse/articles/135278.html</guid><wfw:comment>http://www.blogjava.net/coolingverse/comments/135278.html</wfw:comment><comments>http://www.blogjava.net/coolingverse/articles/135278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolingverse/comments/commentRss/135278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolingverse/services/trackbacks/135278.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 0.75em">来自：<a href="http://blog.csdn.net/iori_guojun">http://blog.csdn.net/iori_guojun</a></span></p>
<!--more-->
<p><span style="FONT-SIZE: 0.75em">1、参数文件<br/>--每个实例启动时都要读入一个初始化参数文件<br/>--#注释<br/>--可以以任意顺序指定参数<br/>--若想在一行输入若干参数，要用空格分开，例如<br/>--PROCESSES=100 CPU_COUNT=1 OPEN_CURSORS=10<br/>--若想为某一参数设置多重值，多重值要包含在圆括号中，并用逗号隔开，例如<br/>--ROLLBACK_SEGMENTS=(SEG1,SEG2,SEG3,SEG4,SEG5)<br/>--参数文件中任何变化只有在实例重启后生效<br/>--有些参数可以用ALTER SYSTEM、ALTER SESSION立即设置，称为动态初始化参数<br/>--立即修改实例中所有会话的参数，并保持到实例关闭<br/>ALTER SYSTEM SET parameter_name=value DEFERRED;<br/>--修改整个实例的参数，但已保持的会话参数不变，直到重新连接为止<br/>ALTER SYSTEM SET parameter_name=value;<br/>--在当前会话内改变参数<br/>ALTER SESSION SET parameter_name=value;<br/>--显示所有初始化参数的当前设置<br/>SHOW PARAMETERS;<br/>--显示特定的初始化参数当前设置<br/>SHOW PARAMETERS parameter_name;</span></p>
<p>2、数据文件<br/>1&gt;、增加数据文件<br/>--Oracle数据库必须至少有一个数据文件且至少应150M，这时只有SYSTEM一个表空间<br/>--增加数据文件受到的限制：<br/>--操作系统限定了每个进程打开的文件数<br/>--Oracle限定了实例打开的数据库的最大打开的数据文件数<br/>--当发出CREATE DATABASE或CREATE CONTROLFILE时，MAXDATAFILES参数指定了控制<br/>--文件的数据文件的初始大小，以后增加的数据文件数若大于该参数但小于初始参数<br/>--文件中的DB_FILES参数设置，则系统会自动调整。DB_FILES设置过小，以后调整时<br/>--要先关闭数据库，若设置太大，会造成内存消耗<br/>--初始参数文件中SGA上限设置<br/>ALTER TABLESPACE mytab ADD DATAFILE 'mydb1.dbf' SIZE 100M;<br/>2&gt;、改变数据文件大小<br/>--方法一，启用数据文件的自动扩展功能<br/>--通过查看DBA_DAT_FILES视图的AUTOEXTENSIBLE列可知数据文件是否为自动扩展<br/>--方法二，手工改变数据文件大小<br/>ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' RESIZE 100M;<br/>3&gt;、改变数据文件的可用性<br/>--归档模式下使数据文件脱机或联机<br/>ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' ONLINE;<br/>ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' OFFLINE;<br/>--不归档模式下使数据文件脱机并立即删除<br/>ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' OFFLINE DROP;<br/>--改变表空间所有数据文件和临时文件可用性<br/>ALTER TABLESPACE tablespacename DATAFILE {ONLINE/OFFLINE};<br/>ALTER TABLESPACE tablespacename TEMPFILE {ONLINE/OFFLINE};<br/>4&gt;、重命名和定位数据文件<br/>a.确定要操作的数据文件的名称<br/>SELECT FILE_NAME,BYTES FROM DBA_DATA_FILES<br/>WHERE TABLESPACE_NAME='mytabname';<br/>b.将包含该数据文件的表空间脱机<br/>c.使用操作系统命令拷贝数据文件到新位置并重新命名<br/>d.在Oracle中重新命名该数据文件<br/>ALTER TABLESPACE mytabname RENAME DATAFILE<br/>'/u02/oracle/rbdb1/users01.dbf',<br/>'/u02/oracle/rbdb1/users02.dbf' TO<br/>'/u03/oracle/rbdb1/users01.dbf',<br/>'/u03/oracle/rbdb1/users02.dbf';<br/>e.使表空间联机<br/>5&gt;、校验数据文件的数据块<br/>--通常将设置DB_BLOCK_CHECKSUM设为FALSE<br/>6&gt;、查看数据文件信息<br/>DBA_DATA_FILES<br/>DBA_EXTENTS<br/>USER_EXTENTES<br/>DBA_FREE_SPACE<br/>USER_FREE_SPACE<br/>V$DATAFILE<br/>V$DATAFILE_HEADER</p>
<p>3、控制文件<br/>1&gt;、创建控制文件拷贝/重命名/重定位控制文件<br/>a.关闭实例<br/>b.使用操作系统命令拷贝控制文件备份到新位置并重新命名<br/>c.修改初始化参数文件中的CONTROL_FILES，增加新控制文件或改变指向<br/>d.重启数据库<br/>2&gt;、使用备份恢复被损坏的控制文件<br/>a.关闭实例<br/>b.使用操作系统命令拷贝控制文件备份覆盖被损坏的控制文件<br/>c.重启数据库<br/>3&gt;、删除控制文件<br/>a.关闭实例<br/>b.修改初始化参数文件，删除CONTROL_FILES中相应条目<br/>c.重启数据库<br/>4&gt;、查看控制文件<br/>V$CONTROLFILE<br/>V$CONTROLFILE_RECORD_SECTION<br/>V$PARAMETER</p>
<p>4、重做日志文件<br/>1&gt;、增加重做日志文件组<br/>ALTER DATABASE ADD LOGFILE('/oracle/dbs/log1c.rdo',<br/>'/oracle/dbs/log2c.rdo') SIZE 500K;<br/>--也可指定组号，组号应在1和MAXLOGFILES设置之间<br/>ALTER DATABASE ADD LOGFILE GROUP 10('/oracle/dbs/log1c.rdo',<br/>'/oracle/dbs/log2c.rdo') SIZE 500K;<br/>2&gt;、增加重做日志文件组成员<br/>ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2b.rdo' TO GROUP 2;<br/>--也可通过指定组中所有其他成员来识别<br/>ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2c.rdo'<br/>('/oracle/dbs/log2a.rdo','/oracle/dbs/log2b.rdo');<br/>3&gt;、重命名和重定位联机重做日志文件成员<br/>a.关闭数据库<br/>SQL&gt;SHUTDOWN;<br/>b.用操作系统命令拷贝日志文件到新位置并重命名<br/>cp /diska/logs/log1a.rdo /diskc/logs/log1c.rdo<br/>cp /diska/logs/log2a.rdo /diskc/logs/log2c.rdo<br/>c.启动并装配数据库，但不打开它<br/>CONNECT / as SYSDBA<br/>STARTUP MOUNT<br/>d.重命名联机重做日志文件成员<br/>ALTER DATABASE RENAME FILE '/diska/logs/log1a.rdo',<br/>'/diska/logs/log2a.rdo'<br/>TO '/diska/logs/log1c.rdo',<br/>'/diska/logs/log2c.rdo';<br/>e.正常打开数据库，此时转换立即生效<br/>ALTER DATABASE OPEN;<br/>4&gt;、删除重做日志文件组<br/>--删除日志文件组时要考虑以下限制<br/>--一个实例至少需要两组联机重做日志文件<br/>--删除之前要使该日志文件组变为不活动，可以强制重做日志文件转换<br/>--删除之前，必须保证它是归档了的，可查看V$LOG<br/>ALTER DATABASE DROP LOGFILE GROUP 3;<br/>5&gt;、删除重做日志文件组成员<br/>ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo';<br/>6&gt;、强制重做日志文件转换<br/>ALTER SYSTEM SWITCH LOGFILE;<br/>7&gt;、清空联机重做日志文件内容<br/>ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;<br/>8&gt;、查看联机重做日志文件信息<br/>V$LOG<br/>V$LOGFILE<br/>V$LOG_HISTORY</p>
<p>5、归档重做日志文件</p>
    <img src ="http://www.blogjava.net/coolingverse/aggbug/135278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolingverse/" target="_blank">Stanley Sun</a> 2007-08-08 16:30 <a href="http://www.blogjava.net/coolingverse/articles/135278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle笔记整理五[创建数据库]</title><link>http://www.blogjava.net/coolingverse/articles/135279.html</link><dc:creator>Stanley Sun</dc:creator><author>Stanley Sun</author><pubDate>Wed, 08 Aug 2007 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/coolingverse/articles/135279.html</guid><wfw:comment>http://www.blogjava.net/coolingverse/comments/135279.html</wfw:comment><comments>http://www.blogjava.net/coolingverse/articles/135279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolingverse/comments/commentRss/135279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolingverse/services/trackbacks/135279.html</trackback:ping><description><![CDATA[<p><span style="font-size: 0.75em;"><span style="font-size: 0.75em;">来自：<a href="http://blog.csdn.net/iori_guojun">http://blog.csdn.net/iori_guojun</a></span></span></p>
<!--more-->
<p>1、声明Oracle SID名<br />
WIN下：set ORACLE_SID=mydb<br />
UNIX下：export ORACLE_SID=mydb<br />
2、与实例连接<br />
服务器端：<br />
$SQLPLUS /nolog<br />
SQL&gt;CONNECT SYS/password AS SYSDBA<br />
客户端：<br />
SQL&gt;CONNECT <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#83;&#89;&#83;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#83;&#73;&#68;" target="_blank"><span style="color: rgb(0, 44, 153);">SYS/password@SID</span></a> AS SYSDBA<br />
3、创建初始化参数文件（每个实例启动时都要装载一个）<br />
1&gt;、使用缺省文件名并在缺省位置存放该文件，则启动数据库时无须指定PFILE<br />
缺省文件名为init$Oracle_SID.ora，如initMYDB.ora<br />
缺省位置：WIN下$Oracle_HOME\database<br />
UNIX下$Oracle_HOME\dbs<br />
2&gt;、自己定义文件名和存放位置，启动数据库时须指定PFILE参数<br />
4、在不装配数据库的情况下启动实例，并根据步骤3确定是否要指定PFILE参数<br />
STARTUP NOMOUNT pfile='d:\oracle\admin\mydb\scripts\initMYDB.ora';<br />
5、创建数据库<br />
CREATE DATABASE mynewdb<br />
--指定可以同时装配和打开的数据库实例最大数量，比初始参数INSTANCES优先级高<br />
MAXINSTANCES 1<br />
--只有在实时应用集群情况下和归档模式中，此参数才有用<br />
MAXLOGHISTORY 1<br />
--指定该数据库能够创建的重做日志文件组的最大数量<br />
MAXLOGFILES 5<br />
--指定该数据库重做日志文件组的最大成员数量<br />
MAXLOGMEMBERS 5<br />
--Oracle使用该值来确定在控制文件中分配数据文件名需要的空间<br />
MAXDATAFILES 100<br />
--指定一个或多个数据文件，这些都作为SYSTEM表空间一部分<br />
DATAFILE '/vobs/oracle/oradata/mynewdb/system01.dbf' SIZE 325 REUSE<br />
--创建一个撤消表空间用于重做数据<br />
UNDO TABLESPACE undotbs DATAFILE<br />
'/vobs/oracle/oradata/mynewdb/undotbs01.dbf'<br />
SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED<br />
--创建缺省的临时表空间<br />
DEFAULT TEMPORARY TABLESPACE tempts1<br />
--指定数据库保存数据时使用的字符集<br />
CHARACTER SET US7ASCII<br />
--指定NCHAR、NCLOB、NVARCHAR2类型列保存数据时需要使用的字符集<br />
NATIONAL CHARACTER AL16UTF16<br />
--指定的重做日志文件<br />
LOGFILE GROUP 1 ('/vobs/oracle/oradata/mynewdb/redo01.log') SIZE 100M,<br />
GROUP 2 ('/vobs/oracle/oradata/mynewdb/redo02.log') SIZE 100M,<br />
GROUP 3 ('/vobs/oracle/oradata/mynewdb/redo03.log') SIZE 100M;<br />
6、创建附加的表空间<br />
--如果不创建附加表空间并把数据库对象存储在其上，则会缺省使用系统表空间<br />
--创建缺省的用户表空间<br />
CREATE TABLESPACE user LOGGING<br />
DATAFILE '/vobs/Oracle/oradata/mynewdb/users01.dbf'<br />
--设置表空间自动增长<br />
SIZE 25M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED<br />
--采用本地管理表空间<br />
EXTENT MANAGEMENT LOCAL;<br />
--为用户索引等数据库对象创建缺省表空间<br />
CREATE TABLESPACE indx LOGGING<br />
DATAFILE '/vobs/Oracle/oradata/mynewdb/indx01.dbf'<br />
SIZE 25M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED<br />
EXTENT MANAGEMENT LOCAL;<br />
7、运行脚本来创建数据字典视图<br />
CONNECT SYS/password AS SYSDBA<br />
@/vobs/Oracle/rdbms/admin/catalog.sql;<br />
@/vobs/Oracle/rdbms/admin/catproc.sql;<br />
@/vobs/Oracle/rdbms/admin/catexp.sql;<br />
EXIT<br />
</p>
   <img src ="http://www.blogjava.net/coolingverse/aggbug/135279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolingverse/" target="_blank">Stanley Sun</a> 2007-08-08 16:30 <a href="http://www.blogjava.net/coolingverse/articles/135279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle笔记整理三[配置]</title><link>http://www.blogjava.net/coolingverse/articles/135277.html</link><dc:creator>Stanley Sun</dc:creator><author>Stanley Sun</author><pubDate>Wed, 08 Aug 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/coolingverse/articles/135277.html</guid><wfw:comment>http://www.blogjava.net/coolingverse/comments/135277.html</wfw:comment><comments>http://www.blogjava.net/coolingverse/articles/135277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolingverse/comments/commentRss/135277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolingverse/services/trackbacks/135277.html</trackback:ping><description><![CDATA[<p><span style="font-size: 0.75em;"><span style="font-size: 1.2em;"><span style="font-size: 0.75em;">来自：</span><a href="http://blog.csdn.net/iori_guojun"><span style="font-size: 0.75em;">http://blog.csdn.net/iori_guojun</span></a></span></span></p>
<!--more-->
<p><span style="font-size: 0.75em;">1、Oracle Net配置<br />
1&gt;、WIN下<br />
"开始-&gt;程序-&gt;Oracle-&gt;HOME NAME-&gt;网络管理<br />
-&gt;Oracle Net Configuration Assistant"<br />
2&gt;、创建监听程序（如果选择TCP/IP协议进行监听，要设置端口为1521）<br />
--仅服务器端<br />
3&gt;、listener.ora文件<br />
--该文件每个服务器一个，由Oracle Net工具自动生成，也可直接编辑<br />
--该文件列出了机器中所有监听进程的名字和地址及它们所支持的实例<br />
LISTENER=<br />
(ADDRESS_LIST=<br />
(ADDRESS=<br />
(PROTOCOL=IPC)<br />
(KEY=loc.world)<br />
)<br />
(ADDRESS=<br />
(PROTOCOL=TCP)<br />
(HOST=HR)<br />
(PORT=1521)<br />
)<br />
)<br />
SID_LIST_LISTENER=<br />
(SID_DESC=<br />
(GLOBAL_DBNAME=loc.world)<br />
(ORACLE_HOME=D:\oracle\ora90)<br />
(SID_NAME=loc)<br />
)<br />
)<br />
--该脚本的第一部分是地址列表，每个实例一个条目，本例共两个条目<br />
--本例监听器使用内部进程调用(IPC)正在监听对标识为loc.world的服务的<br />
--连接，同时监听任何使用TCP/IP协议，来自HR机器1521端口的请求<br />
--该脚本第二部分（以SID_LIST_LISTENER开始），定义了在init.ora文件中<br />
--为该数据库使用的全局数据库名、监听器正在服务的每个实例的Oracle软件<br />
--主目录及实例名或SID，如果改变Oracle软件主目录，需要更改该文件</span></p>
<p>4&gt;、配置连接描述符的服务名（别名）<br />
a.本地tnsnames.ora文件方式<br />
--该文件必须存在于所有的服务器和客户端中<br />
--在服务器上，该文件被存放在由TNS_ADMIN环境变量指定的目录中，<br />
--通常为一公共目录，如UNIX下$ORACLE_HOME/network/admin目录<br />
--WIN下或客户端则为Oracle软件主目录下\network\admin<br />
--下为该文件中一个条目，为LOC服务名设置连接描述符<br />
LOC=(DESCRIPTION=<br />
(ADDRESS=<br />
(PROTOCOL=TCP)<br />
(HOST=HR)<br />
(PORT=1521))<br />
(CONNECT DATA=<br />
(SERVICE_NAME=LOC)))<br />
--想连接到HR服务器上LOC实例的用户可以使用LOC服务名<br />
--@告诉数据库使用紧跟其后的服务名确定要登录到哪个数据库<br />
sqlplus <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#104;&#114;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#76;&#79;&#67;" target="_blank"><span style="color: rgb(0, 44, 153);">hr/password@LOC</span></a>;</p>
<p>b.互联网目录方式<br />
<br />
2、Oracle进程配置<br />
1&gt;、使用DCA工具配置专用/共享服务器<br />
WIN下<br />
"开始-&gt;程序-&gt;Oracle[OracleHome]-&gt;Configuration and Migration Tools<br />
-&gt;Database Configuration Assistant"-》"在数据库中配置数据库选项"<br />
2&gt;、通过初始化参数配置专用/共享服务器<br />
--文件init.ora中配置<br />
设置专用服务器（为每个用户建立单独的服务器连接进程）：<br />
设置以下参数为NULL<br />
MTS_SERVICE<br />
MTS_DISPATCHERS<br />
MTS_SERVERS<br />
MTS_LISTENER_ADDRESS<br />
为了请求专用数据库连接，用户必须在监听的连接字符串中包括SRVR=DEDICATED<br />
<br />
设置共享服务器：<br />
--实例启动时的调度数，每1000个连接可设置1个调度<br />
DISPATCHERS<br />
例：在IP 144.25.16.201上启动2个调度<br />
DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)\(HOST=144.25.16.201))(DISPATCHERS=2)"<br />
可动态改变调度进程的数量：<br />
例：设置TCP/IP协议调度进程数为5，SSL（TCPS）协议的TCP/IP调度进程数为2<br />
ALTER SYSTEM<br />
SET DISPATCHERS=<br />
'(PROTOCOL=TCP)(DISPATCHERS=5) (INDEX=0)',<br />
'(PROTOCOL=TCPS)(DISPATCHERS=2) (INDEX=1)';<br />
--实例启动时创建的共享服务器进程数量，每10个连接可设1个共享服务器进程<br />
SHARED_SERVERS<br />
--实例启动时能创建的最大共享服务器进程数量<br />
MAX_SHARED_SERVERS<br />
--指定网络会话可用的虚拟电路的全部数量<br />
CIRCUITS<br />
--指定共享服务器用户会话允许的全部数量<br />
--设置这个参数使你能够为专用服务器保留用户会话<br />
SHARED_SERVER_SESSIONS<br />
--指定能在系统被创建的会话的最大数量，可以因需要被共享服务器调整<br />
SESSIONS</p>
   <img src ="http://www.blogjava.net/coolingverse/aggbug/135277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolingverse/" target="_blank">Stanley Sun</a> 2007-08-08 16:29 <a href="http://www.blogjava.net/coolingverse/articles/135277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle笔记整理六[数据库启动与关闭]</title><link>http://www.blogjava.net/coolingverse/articles/135274.html</link><dc:creator>Stanley Sun</dc:creator><author>Stanley Sun</author><pubDate>Wed, 08 Aug 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/coolingverse/articles/135274.html</guid><wfw:comment>http://www.blogjava.net/coolingverse/comments/135274.html</wfw:comment><comments>http://www.blogjava.net/coolingverse/articles/135274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolingverse/comments/commentRss/135274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolingverse/services/trackbacks/135274.html</trackback:ping><description><![CDATA[<p>来自：<a href="http://blog.csdn.net/iori_guojun">http://blog.csdn.net/iori_guojun</a></p>
<!--more-->
<p><span style="font-size: 0.75em;">&lt;一&gt;、数据库启动<br />
1、启动SQL*PLUS不与数据库连接<br />
SQLPLUS /NOLOG<br />
2、以SYSDBA角色与Oracle连接<br />
CONNECT username/password AS SYSDBA<br />
3、启动实例<br />
1&gt;、启动一个实例，装配和打开一个数据库<br />
STARTUP;或<br />
STARTUP PFILE='d:\oracle\admin\mydb\scripts\initMYDB.ora';<br />
2&gt;、启动一个实例但不装配数据库<br />
--典型应用为数据库创建<br />
STARTUP NOMOUNT;<br />
3&gt;、启动一个实例，装配数据库但不打开<br />
--该模式下允许你执行特定的维护操作，包括<br />
--重命名数据库、增删或重命名日志文件、启用和停用重做归档日志文件选项、<br />
--执行完整的数据库恢复<br />
STARTUP MOUNT;<br />
4&gt;、在启动时限制一个数据库的存取<br />
--该模式使管理员可用数据库，但一般操作员不可用，应用于<br />
--执行导入导出、执行SQL*loader的数据装载、临时阻止典型用户使用数据<br />
--升迁或升级<br />
--在正常模式下，有CREATE SESSION系统特权的用户可以连接到数据库<br />
--限制模式下，同时具有CREATE SESSION和RESTRICTED SESSION两个系统特权的用户<br />
--才可以存取数据<br />
STARTUP RESTRICT;<br />
--关闭限制模式<br />
ALTER SYSTEM DISABLE RESTRICTED SESSION;<br />
--将正在运行的正常模式改变为限制模式<br />
ALTER SYSTEM ENABLE RESTRICTED SESSION;<br />
5&gt;、强制一个实例启动（用于启动时出现问题情况，少用！）<br />
STARTUP FORCE;<br />
6&gt;、启动实例，装配数据库和启动完全的介质恢复<br />
STARTUP OPEN RECOVER;<br />
4、改变数据库可用性<br />
1&gt;、装配数据库<br />
ALTER DATABASE MOUNT;<br />
2&gt;、打开数据库<br />
ALTER DATABASE OPEN;<br />
3&gt;、以只读或只写或读写方式打开数据库<br />
ALTER DATABASE OPEN READ ONLY;<br />
ALTER DATABASE WRITE READ ONLY;<br />
ALTER DATABASE OPEN READ WRITE;</span></p>
<p>&lt;二&gt;、数据库关闭<br />
1、正常关闭<br />
SHUTDOWN NORMAL；<br />
2、事务性关闭<br />
--不许新连接，但等待现有的事务执行结束<br />
SHUTDOWN TRANSACTIONAL；<br />
3、立即关闭<br />
SHUTDOWN IMMEDIATE；<br />
4、强制关闭<br />
--该模式关闭下次启动时要进行实例恢复过程<br />
SHUTDOWN ABORT；<br />
5、停顿数据库<br />
--该状态下只允许DBA会话，不允许新的非DBA连接建立<br />
ALTER SYSTEM QUIESCE RESTRICTED;<br />
--取消停顿<br />
ALTER SYSTEM UNQUIESCE;<br />
--查看实例的停顿状态<br />
--列ACTIVE_STATE说明：NORMAL未停顿QUIESCING正在停顿，但仍有非DBA会话<br />
--QUIESCED已停顿<br />
select ACTIVE_STATE from V$INSTANCE;<br />
6、挂起数据库<br />
--暂停对数据文件和控制文件的所有IO，可以在无IO干扰情况先进行备份<br />
--挂起命令可以挂起数据库而并不指定一个实例<br />
ALTER SYSTEM SUSPEND;<br />
--恢复到非挂起状态<br />
ALTER SYSTEM RESUME;<br />
--查看挂起状态<br />
SELECT DATABASE_STATUS FROM V$INSTANCE;</p>
   <img src ="http://www.blogjava.net/coolingverse/aggbug/135274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolingverse/" target="_blank">Stanley Sun</a> 2007-08-08 16:29 <a href="http://www.blogjava.net/coolingverse/articles/135274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle笔记整理一[体系结构简介]</title><link>http://www.blogjava.net/coolingverse/articles/135275.html</link><dc:creator>Stanley Sun</dc:creator><author>Stanley Sun</author><pubDate>Wed, 08 Aug 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/coolingverse/articles/135275.html</guid><wfw:comment>http://www.blogjava.net/coolingverse/comments/135275.html</wfw:comment><comments>http://www.blogjava.net/coolingverse/articles/135275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolingverse/comments/commentRss/135275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolingverse/services/trackbacks/135275.html</trackback:ping><description><![CDATA[<p><span style="font-size: 0.75em;">来自：<a href="http://blog.csdn.net/iori_guojun">http://blog.csdn.net/iori_guojun</a></span></p>
<!--more-->
<p><span style="font-size: 0.75em;">一、物理存储结构<br />
1、数据文件<br />
存放数据库数据，以dbf为扩展名。将数据放在多个数据文件中，<br />
再将数据文件分放在不同的硬盘中，可以提高存取速度。数据文<br />
件由数据块构成，块大小由数据库创建时确定。</span></p>
<p>2、重做日志文件，以rdo为扩展名。含对数据库所做的更改记录，<br />
这样万一出现故障可以启用数据恢复。一个数据库至少需要两个<br />
重做日志文件。重做日志在日志文件中以循环的方式工作。有<br />
归档日志模式和非归档日志模式。</p>
<p>3、控制文件，以ctl或ctrl为扩展名。控制文件维护数据库的全局<br />
物理结构，记录数据库中所有文件的控制信息，每个数据库至少<br />
要有一个控制文件，建议用户使用两个或更多控制文件，并存放<br />
在不同的磁盘上。Oracle系统通过控制文件保持数据库的完整性，<br />
以及决定恢复数据时使用哪些重做日志。</p>
<p>4、参数文件，以ora为扩展名。在一个数据库启动时，每个参数都有<br />
一个默认值，而参数文件中的设置值被用来更改默认值，参数值<br />
极大影响了oracle如何去执行其不同的任务。参数文件包括以下<br />
几种：<br />
&lt;1&gt;、初始化参数文件。当创建一个数据库时，oracle创建了一个<br />
默认的init.ora文件，如果不修改任何参数，oracle将用所有的<br />
缺省值来启动数据库，通常根据实际的应用修改参数设置以提高<br />
性能。<br />
&lt;2&gt;、配置参数文件。一般被命名为config.ora，它被用于特定实<br />
例的信息。这个文件是一个由init.ora文件调用或激活的文本文<br />
件，init.ora中包含一个ifile参数以设置config.ora文件的位置。<br />
既然一个数据库可以有一个或多个实例与之关联，那么配置文件中<br />
每一个参数对于不同的实例配置可能不同，当然，如果和数据库关<br />
联的实例只有一个，所有信息都保存在文件init.ora中，那么<br />
config.ora文件就不是必需的了。<br />
&lt;3&gt;、服务器参数文件（spfile）。它被设计为一个服务器端的参<br />
数文件，可以被认为是在oracle数据库服务器执行的机器上被管理<br />
的初始化参数的仓库。一个服务器参数文件可以用语句CREATE<br />
SPFILE从一个传统的文件参数文件创建。<br />
<br />
5、跟踪文件与警告日志。<br />
在实例中运行的每一个后台进程都有一个跟踪文件与之相连，跟踪<br />
文件记载后台进程遇到的重大事件信息。oracle还有一个称做警告<br />
日志的文件，用于记录数据库文件运行中主要事件的命令与结果。</p>
<p>6、归档文件，以arc为扩展名，是重做日志文件的脱机副本，这些副本<br />
可能对于从介质失败中进行恢复很必要。</p>
<p>二、逻辑存储结构<br />
1、表空间。<br />
一个表空间对应一个或多个数据文件组成。一个表空间由段组成，<br />
段由范围组成，范围由一组连续的数据块组成，它们对应磁盘上<br />
的一个或多个物理块。一个表空间只能属于一个数据库，每个数据<br />
库最少有一个表空间（SYSTEM表空间），该表空间包含整个数据库<br />
的数据字典表，在数据库建立时自动创建。利用增加数据文件的形<br />
式可以扩大表空间。表空间的大小为组成该表空间的数据文件的大<br />
下之和。一个数据文件只能属于一个表空间，一个数据文件一旦被<br />
加入到一个表空间中，就不能再从这个表空间中移走，也不能再加<br />
入到其他表空间中，建立新的表空间需要建立新的数据文件。<br />
<br />
2、段：是逻辑数据库对象的物理副本，段存储数据，例如索引段存储<br />
与索引相关的数据。段是一个物理实体，它被放到表空间的一个数<br />
据文件上。一个段segment只能属于一个表空间，但可以属于多个数<br />
据文件。</p>
<p>3、范围：段由范围组成，范围由一组连续的数据块组成。一旦段中的<br />
现有范围不能容纳新数据，该段将获取新的范围，如果需要的话，<br />
该过程持续下去，直到表空间中的数据文件没有自由空间或已达到<br />
每个段内部的范围最大数量为止。</p>
<p>4、块：ORACLE最基本的存储单位，在建立数据库的时候指定，通常为<br />
操作系统块大小的倍数。<br />
<br />
三、内存结构<br />
oracle内存结构大致具有四个区：软件代码区、系统全局区、程序全局<br />
区和排序区。</p>
<p>1、系统全局区。（SGA）<br />
系统全局区为一组由oracle分配的共享数据结构，它是实例的主要部<br />
分，它含有数据维护、SQL语句分析与重做缓存所必须的所有内存结<br />
构，系统全局区的数据是共享的，也就是说，多个进程可以在同一时<br />
间对SGA中的数据进行访问和修改。它包含以下内容：<br />
&lt;1&gt;、数据块缓冲区<br />
该区存放最近使用过的数据块，使用LRU（最近最好使用算法）<br />
进行管理。<br />
&lt;2&gt;、字典缓冲区<br />
该区用于保存数据字典中的行，数据字典中存放oracle系统管<br />
理自身所需的所有信息。该区也使用LRU算法管理。<br />
&lt;3&gt;、重做日志缓冲区<br />
任何事务在记录到重做日志之前都先放到该区，数据库系统定期<br />
将该区内容写入到联机重做日志中。<br />
&lt;4&gt;、SQL共享池<br />
存放所有通过SQL语法分析、准备执行的SQL语句。<br />
&lt;5&gt;、JAVA池<br />
为JAVA命令提供语法分析。<br />
&lt;6&gt;、多缓冲池<br />
可以在SGA中创建多个缓冲池，能够用多个缓冲池把的数据集与其<br />
他的应用程序分开，以减少它们争夺数据块缓冲区相同资源的可<br />
能性。</p>
<p>2、程序全局区（PGA）<br />
包含单个服务器进程或单个后台进程的数据和控制信息，与几个进程共<br />
享的SGA 正相反PGA 是只被一个进程使用的区域，PGA 在创建进程时分<br />
配在终止进程时回收。<br />
<br />
3、排序区<br />
排序需要内存，这部分空间成为排序区，排序区存在于请求排序的用户<br />
进程的内存中，该空间的大小为适应排序数据量的大小，可增长，但受<br />
初始化参数SORT_AREA_SIZER所限制。</p>
<p>4、软件代码区<br />
用于存储正在执行或可以执行的程序代码。</p>
<p>四、进程结构<br />
进程分为两类：用户进程和oracle进程。oracle为每一个连接的用户运行的<br />
应用建立一个用户进程。<br />
1、SMON<br />
当启动一个数据库时，SMON（系统监控进程）执行所需的实例恢复操作（使<br />
用联机重做日志文件），它也可以清除数据库（如不再使用的临时段），取<br />
消系统不再需要的事务对象。<br />
<br />
2、PMON<br />
PMON（进程监控程序）后台进程清除失败的用户进程，负责清理内存储区和<br />
释放该进程使用的资源。同SMON一样，它被周期唤起检测它是否需要被使用。</p>
<p>3、DBRW<br />
数据库写进程。负责将被修改的数据块和字典缓冲内容写入到文件。</p>
<p>4、LGWR。负责把联机重做日志缓冲内容写入到文件。</p>
<p>5、CKPT<br />
检查点进程：负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,<br />
更新控制文件和数据文件中的数据库状态信息。</p>
<p>6、ARCH<br />
归档进程：在每次日志切换时把已满的日志组进行备份或归档</p>
   <img src ="http://www.blogjava.net/coolingverse/aggbug/135275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolingverse/" target="_blank">Stanley Sun</a> 2007-08-08 16:29 <a href="http://www.blogjava.net/coolingverse/articles/135275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle笔记整理二[安装]</title><link>http://www.blogjava.net/coolingverse/articles/135276.html</link><dc:creator>Stanley Sun</dc:creator><author>Stanley Sun</author><pubDate>Wed, 08 Aug 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/coolingverse/articles/135276.html</guid><wfw:comment>http://www.blogjava.net/coolingverse/comments/135276.html</wfw:comment><comments>http://www.blogjava.net/coolingverse/articles/135276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolingverse/comments/commentRss/135276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolingverse/services/trackbacks/135276.html</trackback:ping><description><![CDATA[<p>来自：<a href="http://blog.csdn.net/iori_guojun">http://blog.csdn.net/iori_guojun</a></p>
<!--more-->
<p><span style="font-size: 0.75em;">本文以Oracle 9i在Linux下的安装过程为例。</span></p>
<p>一、系统要求：<br />
以下的系统要求适用于典型的Oracle安装和创建简单数据库的方式。<br />
1、内存：<br />
安装Oralce 9i软件至少需要512M内存，用以下命令可以查看机子的内存大小：<br />
grep MemTotal /proc/meminfo<br />
MemTotal: 900252 kB<br />
900252kB就是你系统的内存大小。<br />
2、交换区：<br />
交换区的大小一般要求是内存的两倍，至少要求达到400M以上，当然是越大越好，<br />
用以下的命令可以查看系统交换区的大小：<br />
/sbin/swapon -s<br />
Filename Type Size Used Priority<br />
/dev/sda6 partition 105221 686976 -1<br />
其中105221就是系统交换区的大小。<br />
3、光驱：<br />
如果你使用光盘安装Oracle9i则你的机子上需要8速以上的CDROM，如果你是下载<br />
了oracle9i的包文件，则不需要使用的CDROM。<br />
4、硬盘空间：<br />
安装Oracle9i数据库至少要有2.5GB以上的剩余空间。<br />
5、临时硬盘空间：<br />
Oracle安装程序在安装过程中需要400M以上的临时硬盘空间，建议使用/tmp文件<br />
夹作为零时文件夹，如果/tmp文件没有足够的硬盘，可以新创建一个文件夹作为<br />
安装的临时目录，之后设置环境变量TEMP和TMPDIR指向相应的位置，例如：<br />
使用bash<br />
mkdir /home/temp<br />
TEMP=/home/temp ; export TEMP<br />
TMPDIR=/home/temp ; export TMPDIR<br />
使用csh<br />
mkdir /home/temp<br />
setenv TEMP /home/temp<br />
setenv TMPDIR /home/temp<br />
6、操作系统：<br />
Oracle公司官方公布的资料指出Oracle 9i只在安装SuSuSe 7.1, 内核 2.4.4 和<br />
glibc2.2的系统上测试通过，经过本人的测试，Oracle在Linux<br />
Mandrake release 8.0，内核2.4.3-20和glibc-2.2.2的版本上也可以顺利安装，<br />
本文将以Linux Mandrake8.0为例介绍Oracle9i的安装过程。<br />
7、虚拟x-windows软件：<br />
这个软件不是必要的！所谓虚拟x-windows软件指的是可在远程终端允许服务器<br />
x-windows的虚拟软件，现在流行的x-windows软件有exceed、x-win32等软件，<br />
如果你嫌在控制台安装oracle系统麻烦，可以使用虚拟x-windows软件在远程终端<br />
在图形界面下安装oralce9i，本文将以x-win32 5.0为例介绍用虚拟x-windows安装<br />
oracle9i的过程。<br />
8、JDK<br />
如果你要安装Oracle HTTP Server还需要用到blackdown的JDK1.3.1，请到以下<br />
地址下载：<br />
<a href="ftp://ftp.progsoc.uts.edu.au/pub/Linux/java/JDK-1.3.0/i386/rc1/" target="_blank"><span style="color: rgb(0, 44, 153);">ftp://ftp.progsoc.uts.edu.au/pub/Linux/java/JDK-1.3.0/i386/rc1/</span></a><br />
j2sdk-1.3.0-RC1-linux-i386.tar.bz2<br />
9、配置内核参数<br />
oracle9i使用Linux的共享内存、交换区等资源进行工作，如果你的内核参数设置<br />
不能满足oracle的要求，那在安装oracel9i或使用过程就会频频出现问题，因此<br />
配置系统内核的参数就显得尤为重要和关键了。<br />
内核参数的配置一般在/proc文件夹下配置：<br />
1. 以root用户允许以下命令；<br />
2. 进入目录/proc/sys/kernel；<br />
3. 用cat命令或more命令查看semaphore当前参数的值：<br />
cat sem<br />
命令运行后将会出现如下的结果：<br />
250 32000 32 128<br />
其中, 250 是参数SEMMSL的值,32000是参数SEMMNS的值, 32是参数SEMOPM的值，<br />
而128则是参数SEMMNI的值。<br />
4. 用以下的命令可以对上述参数进行修改<br />
echo SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value &gt; sem<br />
其中SEMMSL_value、SEMMNS_value、SEMOPM_value、SEMMNI_value分别用相应<br />
的值进行替换，并且这些值的顺序不能调换</p>
<p>　　 5. 设置共享内存大小，共享内存大小一般设为物理内存的一半，在这里我们假设<br />
物理内存为512M则共享内存的值4294967295以此类推，如果你的物理内存是1G<br />
则这里的值则是8589934590：<br />
echo 4294967295 &gt; shmmax<br />
6、添加用户<br />
Oracle在安装和使用中需要用特定用户（非root用户），按照oracle的标准说<br />
明是需要添加三个专门用户和用户组，为了简便大家的安装和使用我们把oracle<br />
的安装和使用归到一个特定用户来完成。<br />
首先创建oracle用户组，我们架设这个用户组命名为dba：<br />
以root用户登陆系统；<br />
运行groupadd dba命令添加dba用户组；<br />
添加oracle用户：<br />
以root用户登陆系统；<br />
运行useradd -g dba -p password -d /oracle -s /bin/bash oracle<br />
运行后系统创建了一个属于dba用户组的用户oracle，密码为password，主目录<br />
为/oracle使用bash，这个用户将作为系统的安装和使用指定用户。<br />
7、创建安装点(mount point)<br />
oracle9i的典型安装需要至少两个安装点：一个安装基本的运行程序，要求至少<br />
要有850M的硬盘空间；一个为存放数据库，至少要求有450M的硬盘空间。为了简<br />
化安装我们可以把运行程序和数据库装在同一个安装点下。<br />
在你的文件系统上找到有足够空间的分区，在分区下创建文件夹，我们假设这个<br />
文件夹为/oracle。<br />
8、配置系统环境变量<br />
很多网友安装oracle失败都是因为环境变量没有配置正确，环境变量的配置直接<br />
影响到以后oracle9i的安装和配置，在配置的时候要尤为小心！<br />
1&gt;、配置x-windows变量<br />
确认oracle9i在安装过程中是否使用本地x-windows安装还是远程虚拟<br />
x－windows安装，如果需要远程x-windows安装，则需要配置DISPLAY变量，<br />
这个变量用于告诉系统屏幕的图形将输出到什么位置，默认情况下是本机，<br />
如果你使用虚拟x－windows进行安装，则在这里指明远程终端的显示情况，<br />
比如你远程终端的IP地址是xxx.xxx.xxx.xxx则DISPLAY的变量应设为<br />
"xxx.xxx.xxx.xxx:0"后面的":0"表示该终端的第一个显示器。<br />
2&gt;、确定安装临时目录<br />
前面我们提到过oracle9i的安装需要一个临时的可写空间，我们在这里把<br />
/tmp作为临时的可写目录。如果你不是使用/tmp作为临时可写目录则需要配<br />
置相应的值TMPDIR=/path。<br />
3&gt;、配置oracle的环境变量<br />
下面提供一个例子可以供大家参照使用<br />
export DISPLAY="192.9.200.24:0.0"<br />
export BASH_ENV=$HOME/.bashrc<br />
ORACLE_HOME=/oracle/product/9.0.1; export ORACLE_HOME<br />
ORACLE_SID=oracle; export ORACLE_SID<br />
ORACLE_TERM=xterm; export ORACLE_TERM<br />
TNS_ADMIN=/home/oracle/config/9.0.1; export TNS_ADMIN<br />
NLS_LANG=american_america.ZHS16GBK; export NLS_LANG<br />
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data; export ORA_NLS33<br />
LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH<br />
PATH=$PATH:/bin:/usr/bin:/usr/sbin:/etc:/opt/bin:<br />
/usr/ccs/bin:/usr/openwin<br />
PATH=$PATH:/opt/local/bin:/opt/NSCPnav/bin:$ORACLE_HOME/bin<br />
PATH=$PATH:/usr/local/samba/bin:/usr/ucb:<br />
export PATH<br />
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:<br />
$ORACLE_HOME/rdbms/jlib<br />
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib<br />
TMPDIR=/tmp;export TMPDIR<br />
umask 022<br />
其中：<br />
ORACLE_HOME为系统软件的安装目录；<br />
ORACLE_SID 为数据库的SID，这里可以自行设置；<br />
NLS_LANG 为数据库的字符集，为了保证数据库能够输出输入数据库，我们<br />
需要在这里把字符集设为american_america.ZHS16GBK，其中<br />
american_america英文字符集，ZHS16GBK为中文字符集。<br />
以oracle用户登陆系统，<br />
vi $HOME/.bash_profile<br />
把以上环境变量的设置粘贴到文件中，确认相应的内容并修改，存盘退出。<br />
重新登陆oracle用户<br />
使用set|more命令查看oracle用户的环境变量是否生效<br />
CLASSPATH=/oracle/product/9.0.1/JRE:/oracle/product/9.0.1/jlib:<br />
/oracle/product/9.0.1/rdbms/jlib:<br />
/oracle/product/9.0.1/network/jlib<br />
DISPLAY=192.9.200.24:0.0<br />
LD_LIBRARY_PATH=/oracle/product/9.0.1/lib:/lib:/usr/lib:<br />
NLS_LANG=american_america.ZHS16GBK<br />
ORACLE_HOME=/oracle/product/9.0.1<br />
ORACLE_SID=oracle<br />
ORACLE_TERM=xterm<br />
ORA_NLS33=/oracle/product/9.0.1/ocommon/nls/admin/data<br />
OSTYPE=linux-gnu<br />
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/games:<br />
/bin:/usr/bin:/usr/sbin:/etc:/opt/bin:/usr/ccs/bin:/usr/openwin:<br />
/opt/local/bin:/opt/NSCPnav/bin:<br />
/oracle/product/9.0.1/bin:/usr/local/samba/bin:/usr/ucb:<br />
TNS_ADMIN=/home/oracle/config/9.0.1</p>
<p>二、安装Oralce9i<br />
1、安装JDK1.3.1<br />
把下载的j2sdk-1.3.0-RC1-linux-i386.tar.bz2文件上传到服务器的/usr/<br />
local/目录下，以root用户登陆，用bzip -d j2sdk-1.3.0-RC1-linux-i386.<br />
tar.bz2命令先把文件解成tar格式，再使用tar xvf j2sdk-1.3.0-RC1-linux-<br />
i386.tar.bz2解压出来，为了便于操作可以把文件夹名改成jdk.。<br />
2、配置x-windows<br />
oracle9i的安装几乎支持所有的x-windows，也支持远程的虚拟x－windows安装，<br />
如果你要在本机安装在控制台上以我们先前创建的oracle用户登陆（注意要先<br />
设置好环境变量，并把DISPLAY的值设为空export DISPLAY=""）运行startx命令<br />
进入x-windows。<br />
如果需要在远程终端使用虚拟x-windows进行安装，需要在客户端先安装x-win32<br />
软件，x-win32的安装过程我们就不多介绍了，安装完成后运行x－win32命令在你的<br />
任务栏会出现一个x的标致。使用neterm等终端攻击以oracle用户登陆系统确认环境<br />
变量都已经生效并且DISPLAY变量的值为你终端机的IP地址，运行startkde命令启动<br />
x-windows，运行完毕后系统会出现一大堆的出错信息，忽略不管，过了几秒后在你<br />
的远程终端上会出现Linux的kde界面。<br />
3、下载Oracle安装软件<br />
Oracle网站（<a href="http://otn.oracle.com/" target="_blank"><span style="color: rgb(0, 44, 153);">http://otn.oracle.com</span></a>）现在提供Oracle9i for Linux软件下载，<br />
在下载前请仔细阅读他的Licence，这样在今后的使用中才不会有版权问题。在下载<br />
前你需要一个otn的账户，申请是免费的，只要简单回答几个问题就可以，oracle9i<br />
的安装程序共有三个文件包分别是：<br />
Linux9i_Disk1.cpio.gz (412,092kb)<br />
Linux9i_Disk2.cpio.gz (638,547kb)<br />
Linux9i_Disk3.cpio.gz (82,956kb)<br />
下载完这三个文件后，把这三个文件上传到服务器/oracle目录下，并保证这三个<br />
文件的属主是oracle用户。如果你有Oracle9i的安装CD那就可以省下大把下载时间了。<br />
4、安装Oracle 9i 数据库<br />
以oracle用户登陆系统，启动本地x-windows或虚拟x-windows，打开一个控制台窗口，<br />
进入到刚才存放oracle文件的目录下，分别使用gunzip Linux9i_Disk1.cpio.gz<br />
cpio -idmv命令解包，把三个文件包解压缩成三个安装文件夹分别为Disk1、Disk2、<br />
Disk3。<br />
进入Disk1目录<br />
cd Disk1<br />
在控制台窗口敲入<br />
./runInstaller &amp;<br />
运行后会出现一个OUI的图形界面，中间绿色的窗口就是oracle的安装图形界面了。<br />
下面我们来进行oracle9i最基本的安装，在进入安装界面后点Next进入下一步：<br />
Source指的是包含Oracle产品信息的文件，一般情况下他会自动识别到，如果找不到<br />
可以用Browse按钮来手工指定路径。Destination指的是9i将要安装的路径这里就是<br />
我们在环境变量里设的$ORACLE_HOME，如果这一栏里是空白的则要重新检查环境变量<br />
中各值的设定是否有误。确认正确后按Next进行下一步：<br />
这一步有三个安装选项供选择：<br />
1&gt;Oracle9i Database 9.0.1.0.0，安装oracle9i的数据库服务器版本、管理工具、<br />
网络服务以及基本的客户端软件；<br />
2&gt;Oracle9i Client 9.0.1.0.0 ，企业版的客户端软件，网络服务以及开发工具等。<br />
3&gt;Oracle9i Mangement and Integration 9.0.1.0.0，安装Management Server，<br />
管理工具Oracle的网络目录、综合服务、网络服务以及基本的客户端软件。<br />
我们选第一项安装Oracle9i数据库服务其，接着安Next按钮；<br />
这一步是选择Oracle安装的类型，有三个类型供选择Enterprise Edition，企业版，<br />
Standstard Edition标致版，Custom自定义安装，我们选择企业版的安装，如果你对<br />
Oracle这一系列的产品比较熟悉的化可以选择Custom自定义安装，按自己的需求选择<br />
组件进行安装，确认后安Next进入到下一步；<br />
这里可以选择一种适合你的数据库模版，一般我们选第一种通用的数据库模版，如果<br />
你需要使用数据仓库，则可以使用选择数据仓库的模版进行安装。确认后按Next进入<br />
下一步；<br />
这一步是确认Oracle9i的SID和全局数据库的名字，SID的值我们在环境变量中已经设<br />
好了，所以这里就自动显示了，全局数据库名（Global Database Name）我们可以也<br />
指定成和SID的值相同，确认后按Next进入下一步；<br />
前面我们提到了，数据库的字符类型在数据库超作中是很关键的，这一步就是设置<br />
数据库的字符集，前面我们设置的是NLS_LANG=american_america.ZHS16GBK，所以<br />
我们选择Simplifiled Chinese ZHS16GBK，按Next进入下一步；<br />
因为我们在前面选择了Enterprise的版本进行安装，系统会安装Oracle Web Server，<br />
安装Oracle Web Server需要使用JDK，我们使用Browse按钮把前面安装JDK的目录指定<br />
好以便系统能在安装过程中找到需要的应用程序，确认按Next进入下一步；<br />
进行完所有选择后，系统会给出一个安装概要，这里列举了你选择安装的组件，确认<br />
你要安装的东西都在列表内后，安Install钮进行安装，如果不需要安装其它的程序，<br />
则按Exit退出安装界面。<br />
Oracle的安装速度视服务器的性能一般来说需要装30分钟的时间，在安装过程中可能<br />
会有对话框弹出，对话框内会有一些需要root运行的命令要求你执行，这时候另外开<br />
一个控制台窗口，su成root并运行提示框内的命令，运行完毕后按确定继续安装；<br />
安装完数据库后系统会运行配置工具对系统进行网络和数据库的配置。配置完成后，<br />
系统会自动启动数据库，并开启Oracle Web Server。所有配置完后，按Next完成安装。<br />
如果一切正常，OUI会出现The Installation Of Oracle9i Database Was successful.<br />
的字样，这表明你的Oracle9i数据库安装正常了，如果需要安装其它的内容按Next<br />
Install钮进行其它内容的安装，否则按Exit退出安装。</p>
<p>三、使用Oracle 9i 数据库<br />
安装完毕后Oracle数据库会自动启动，下面我们用实际超作来说明一下Oracle 9i数据库<br />
的启动和关闭。<br />
以oracle用户登陆数据库，开个控制台窗口；</p>
<p>　1、关闭Oracle 9i 数据库<br />
[oracle@wing /oracle]$ sqlplus " / as sysdba" //以sysdba用户登陆数据库<br />
SQL*Plus: Release 9.0.1.0.0 - Production on Wed Jul 11 15:35:31 2001<br />
(c) Copyright 2001 Oracle Corporation. All rights reserved.<br />
Connected to:<br />
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production<br />
With the Partitioning option<br />
JServer Release 9.0.1.0.0 - Production<br />
运行shudown命令关闭数据库<br />
SQL&gt; shutdown<br />
Database closed.<br />
Database dismounted.<br />
ORACLE instance shut down.<br />
SQL&gt;</p>
<p>　2、启动Oracle 9i 数据库<br />
[oracle@wing bin]$ sqlplus " / as sysdba"<br />
SQL*Plus: Release 9.0.1.0.0 - Production on Wed Jul 11 16:00:59 2001<br />
(c) Copyright 2001 Oracle Corporation. All rights reserved.<br />
Connected to an idle instance.<br />
SQL&gt; startup<br />
ORACLE instance started.</p>
<p>Total System Global Area 336356520 bytes<br />
Fixed Size 279720 bytes<br />
Variable Size 268435456 bytes<br />
Database Buffers 67108864 bytes<br />
Redo Buffers 532480 bytes<br />
Database mounted.<br />
Database opened.<br />
SQL&gt;</p>
<p>　3、启动Oracle 9i监听程序<br />
Oracle的监听程序主要是为客户端的连接提供接口<br />
[oracle@wing bin]$ lsnrctl<br />
LSNRCTL for Linux: Version 9.0.1.0.0 - Production on 11-JUL-2001 16:12:17<br />
Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.<br />
Welcome to LSNRCTL, type "help" for information.<br />
LSNRCTL&gt; start<br />
Starting /oracle/product/9.0.1/bin/tnslsnr: please wait...<br />
TNSLSNR for Linux: Version 9.0.1.0.0 - Production<br />
System parameter file is /oracle/product/9.0.1/network/admin/listener.ora<br />
Log messages written to /oracle/product/9.0.1/network/log/listener.log<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=wing)(PORT=1521)))<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))<br />
STATUS of the LISTENER<br />
Alias LISTENER<br />
Version TNSLSNR for Linux: Version 9.0.1.0.0 - Production<br />
Start Date 11-JUL-2001 16:12:58<br />
Uptime 0 days 0 hr. 0 min. 0 sec<br />
Trace Level off<br />
Security OFF<br />
SNMP OFF<br />
Listener Parameter File /oracle/product/9.0.1/network/admin/listener.ora<br />
Listener Log File /oracle/product/9.0.1/network/log/listener.log<br />
Listening Endpoints Summary...<br />
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))<br />
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=wing)(PORT=1521)))<br />
Services Summary...<br />
Service "PLSExtProc" has 1 instance(s).<br />
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...<br />
Service "oracle" has 1 instance(s).<br />
Instance "oracle", status UNKNOWN, has 1 handler(s) for this service...<br />
The command completed successfully<br />
LSNRCTL&gt;</p>
<p>　4、关闭Oracle 9i监听程序<br />
[oracle@wing bin]$ lsnrctl<br />
LSNRCTL for Linux: Version 9.0.1.0.0 - Production on 11-JUL-2001 16:12:17<br />
Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.<br />
Welcome to LSNRCTL, type "help" for information.<br />
LSNRCTL&gt; stop<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))<br />
The command completed successfully<br />
LSNRCTL&gt;</p>
<p>　5、关闭Oracle Web Server<br />
cd $ORACLE_HOME/Apache/Apache/bin<br />
./stopJServ.sh<br />
/oracle/product/9.0.1/Apache/Apache/bin/apachectl stop: httpd stopped</p>
<p>　6、启动Oracle Web Server<br />
cd $ORACLE_HOME/Apache/Apache/bin<br />
[oracle@wing bin]$ ./startJServ.sh<br />
/oracle/product/9.0.1/Apache/Apache/bin/apachectl start: httpd started<br />
启动Oracle Web Server后默认的端口号是7777<br />
在客户端浏览器地址栏输入<a href="http://xxx.xx.xxx.xxx:7777/" target="_blank"><span style="color: rgb(0, 44, 153);">http://xxx.xx.xxx.xxx:7777/</span></a><br />
如果浏览器出现以下界面则表示Oracle Web Server运行正常</p>
   <img src ="http://www.blogjava.net/coolingverse/aggbug/135276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolingverse/" target="_blank">Stanley Sun</a> 2007-08-08 16:29 <a href="http://www.blogjava.net/coolingverse/articles/135276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>