﻿<?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-XZC.Log-随笔分类-Oracle</title><link>http://www.blogjava.net/xzclog/category/17323.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 09 Feb 2015 15:29:03 GMT</lastBuildDate><pubDate>Mon, 09 Feb 2015 15:29:03 GMT</pubDate><ttl>60</ttl><item><title> MySQL数据导出与导入</title><link>http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 09 Feb 2015 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/422827.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/422827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/422827.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://blog.chinaunix.net/uid-16844903-id-3411118.html工具mysqlmysqldump应用举例导出导出全库备份到本地的目录mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --lock-all-tables --ad...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/422827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2015-02-09 10:52 <a href="http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle to_char格式化函数</title><link>http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 20 Mar 2012 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/372238.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/372238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/372238.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Postgres&nbsp;格式化函数提供一套有效的工具用于把各种数据类型（日期/时间，int，float，numeric）转换成格式化的字符串以及反过来从格式化的字符串转换成原始的数据类型。注意：所有格式化函数的第二个参数是用于转换的模板。表 5-7. 格式化函数&nbsp;&nbsp;函数返回描述例子to_char(timestamp, text)text把 timestamp 转换成 str...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/372238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2012-03-20 09:09 <a href="http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ociuldr</title><link>http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 03 Mar 2012 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/371168.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/371168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/371168.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #336666; font-family: Arial; font-size: 12px; line-height: normal; background-color: #f1f5f8; "><p style="line-height: normal; "><font size="3" style="line-height: normal; ">将ociuldr.exe复制到H:\oracle\product\10.2.0\db_1\BIN下, 或者path中的某个文件夹中</font></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">用法:<br style="line-height: normal; " />C:\Documents and Settings\tgm&gt;ociuldr</font></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">Usage: ociuldr user=... query=... field=... record=... file=...<br style="line-height: normal; " />(@) Copyright Lou Fangxin 2004/2005, all rights reserved.<br style="line-height: normal; " />Notes:<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -si&nbsp;&nbsp; = enable logon as SYSDBA<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user = username/password@tnsname<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql&nbsp;&nbsp; = SQL file name,one sql per file, do not include ";"<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query = select statement<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field = seperator string between fields<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record= seperator string between records<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file = output file name(default: uldrdata.txt)<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read = set DB_FILE_MULTIBLOCK_READ_COUNT at session level<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sort = set SORT_AREA_SIZE &amp; SORT_AREA_RETAINED_SIZE at session level (UNIT:MB)<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash = set HASH_AREA_SIZE at session level (UNIT:MB)<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serial= set _serial_direct_read to TRUE at session level<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace = set event 10046 to given level at session level<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table = table name in the sqlldr control file<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode = sqlldr option, INSERT or APPEND or REPLACE or TRUNCATE<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log&nbsp;&nbsp; = log file name, prefix with + to append mode<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long = maximum long field size<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array = array fetch size<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; head = 第一行是否为字段名(head=on), 默认为off</font></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">for field and record, you can use '0x' to specify hex character code,<br style="line-height: normal; " />\r=0x0d \n=0x0a |=0x7c ,=0x2c \t=0x09</font></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">一、导出数据</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">d:\&gt;ociuldr&nbsp;</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#61;&#116;&#101;&#115;&#116;&#47;&#116;&#101;&#115;&#116;&#64;&#97;&#99;&#102;" style="line-height: 20px; color: #336666; font-size: 14px; text-decoration: none; "><font color="#108ac6" size="3" style="line-height: normal; ">user=test/test@acf</font></a><font size="3" style="line-height: normal; ">&nbsp;query="select * from test" file=test.txt table=test</font></p><p style="line-height: normal; "></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">二、查看导出内容</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">1,a<br style="line-height: normal; " />2,b<br style="line-height: normal; " />3,c<br style="line-height: normal; " />4,d<br style="line-height: normal; " />5,e<br style="line-height: normal; " />6,f</font></p><p style="line-height: normal; "></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">三、查看自动生成的控制文件</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">--<br style="line-height: normal; " />-- Generated by OCIULDR<br style="line-height: normal; " />--<br style="line-height: normal; " />OPTIONS(BINDSIZE=8388608,READSIZE=8388608,ERRORS=-1,ROWS=50000)<br style="line-height: normal; " />LOAD DATA<br style="line-height: normal; " />INFILE 'test.txt' "STR X'0a'"<br style="line-height: normal; " />INTO TABLE test<br style="line-height: normal; " />FIELDS TERMINATED BY X'2c' TRAILING NULLCOLS&nbsp;<br style="line-height: normal; " />(<br style="line-height: normal; " />ID CHAR(40),<br style="line-height: normal; " />NAME CHAR(10)<br style="line-height: normal; " />)</font></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">四、可以尝试使用这个控制文件将数据加载到数据库中</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">d:\&gt;sqlldr&nbsp;</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#47;&#116;&#101;&#115;&#116;&#64;&#97;&#99;&#102;" style="line-height: 20px; color: #336666; font-size: 14px; text-decoration: none; "><font color="#108ac6" size="3" style="line-height: normal; ">test/test@acf</font></a><font size="3" style="line-height: normal; ">&nbsp;control=test_sqlldr.ctl</font></p><p style="line-height: normal; "></p><p style="line-height: normal; "><span style="line-height: normal; color: #ff0000; "><font size="3" style="line-height: normal; ">这样数据就加载到数据库中。对于大数据库表的导出ociuldr工具还支持按照不同的批量导出数据，这通过一个参数batch来实现，默认一个batch是50万条记录，如果不指定batch为2就表示100万条记录换一个文件，默认这个选项值是0，就是指不生成多个文件。</font></span></p><p style="line-height: normal; "><span style="line-height: normal; color: #ff0000; "><font size="3" style="line-height: normal; ">在指定batch选项后，需要指定file选项来定义生成的文件名，文件名中间需要包含&#8220;%d&#8221;字样，在生成文件时，&#8220;%d&#8221;会打印成序号，请看以下一个测试：</font></span></p><p style="line-height: normal; "></p><p style="line-height: normal; "><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">D:\&gt;ociuldr&nbsp;</font></span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#61;&#116;&#101;&#115;&#116;&#47;&#116;&#101;&#115;&#116;&#64;&#97;&#99;&#102;" style="line-height: 20px; color: #336666; font-size: 14px; text-decoration: none; "><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">user=test/test@acf</font></span></a><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">&nbsp;query="select * from test" batch=1 file=test_%d.txt table=test</font></span></p><p style="line-height: normal; "><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">刚才测试了一下,果然是强悍, 用spool按要求导出10万条记录要好几分钟, 用ociuldr导出来用了一秒,或许一秒都不到, NB!</font></span></p></span><img src ="http://www.blogjava.net/xzclog/aggbug/371168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2012-03-03 15:39 <a href="http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE确定当前记录和下一条记录之间的差值 </title><link>http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 09 Dec 2011 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/365946.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/365946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/365946.html</trackback:ping><description><![CDATA[<div class="article_content" id="article_content">
<p>转自：<a href="http://blog.csdn.net/wh62592855/article/details/4988336">http://blog.csdn.net/wh62592855/article/details/4988336</a><br />例如说吧，对DEPTNO 10中的每个员工，确定聘用他们的日期及聘用下一个员工（可能是其他部门的员工）的日期之间相差的天数。</p>
<p>SQL&gt; select ename,hiredate,deptno from emp order by hiredate;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPTNO<br />---------- --------------- ----------<br />SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-DEC-80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20-FEB-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22-FEB-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 02-APR-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01-MAY-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />TURNER&nbsp;&nbsp;&nbsp;&nbsp; 08-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />MARTIN&nbsp;&nbsp;&nbsp;&nbsp; 28-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPTNO<br />---------- --------------- ----------<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19-APR-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23-MAY-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20</p>
<p>14 rows selected.</p>
<p>&nbsp;</p>
<p>SQL&gt; select ename,hiredate,next_hd,<br />&nbsp; 2&nbsp; next_hd-hiredate diff<br />&nbsp; 3&nbsp; from<br />&nbsp; 4&nbsp; (<br />&nbsp; 5&nbsp; select deptno,ename,hiredate,<br />&nbsp; 6&nbsp; lead(hiredate) over(order by hiredate) next_hd<br />&nbsp; 7&nbsp; from emp<br />&nbsp; 8&nbsp; )<br />&nbsp; 9&nbsp; where deptno=10;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NEXT_HD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIFF<br />---------- --------------- --------------- ----------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 08-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19-APR-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1912</p>
<p>这里的LEAD OVER非常有用，它能够访问&#8220;未来的&#8221;行（&#8220;未来的&#8221;行相对于当前行，由ORDER BY子句决定）。这种无需添加联接就能够访问当前行附近行的功能，提高了代码的可读性和有效性。<span style="color: #ff0000">在采用窗口函数时，一定要记住，它在WHERE子句之后求值</span>，因此在该解决方案中，需要使用内联视图。如果把对DEPTNO的筛选移到内联视图，则结果会发生改变（仅考虑了DETPNO 10中的HIREDATE）。</p>
<p>所以下面的结果是错误的：</p>
<p>SQL&gt; select ename,hiredate,next_hd,<br />&nbsp; 2&nbsp; next_hd-hiredate diff<br />&nbsp; 3&nbsp; from<br />&nbsp; 4&nbsp; (<br />&nbsp; 5&nbsp; select deptno,ename,hiredate,<br />&nbsp; 6&nbsp; lead(hiredate) over(order by hiredate) next_hd<br />&nbsp; 7&nbsp; from emp<br />&nbsp; 8&nbsp; where deptno=10<br />&nbsp; 9&nbsp; );</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NEXT_HD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIFF<br />---------- --------------- --------------- ----------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 161<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 67<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82</p>
<p>&nbsp;</p>
<p>对于ORACLE的LEAD和LAG函数还需要特别注意，它们的结果中可能会有重复。在上面的例子中表EMP内不包含重复的HIREDATE，所以&#8220;看起来&#8221;似乎没有什么问题。下面我们向表中插入4个重复值来看看</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(1,'a',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(2,'b',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(3,'c',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(4,'d',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; select ename,hiredate<br />&nbsp; 2&nbsp; from emp<br />&nbsp; 3&nbsp; where deptno=10<br />&nbsp; 4&nbsp; order by 2;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE<br />---------- ---------------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81<br />b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82</p>
<p>7 rows selected.</p>
<p>现在还是用以前那个查询语句来试试</p>
<p>SQL&gt; select ename,hiredate,next_hd,<br />&nbsp; 2&nbsp; next_hd-hiredate diff<br />&nbsp; 3&nbsp; from<br />&nbsp; 4&nbsp; (<br />&nbsp; 5&nbsp; select deptno,ename,hiredate,<br />&nbsp; 6&nbsp; lead(hiredate) over(order by hiredate) next_hd<br />&nbsp; 7&nbsp; from emp<br />&nbsp; 8&nbsp; )<br />&nbsp; 9&nbsp; where deptno=10;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NEXT_HD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIFF<br />---------- --------------- --------------- ----------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 08-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91<br />d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19-APR-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1912</p>
<p>7 rows selected.</p>
<p>可以看到其中有4个员工的DIFF列值都是0，这是错误的，同一天聘用的所有员工都应该跟下一个聘用其他员工的HIREDATE进行计算。</p>
<p>幸运的是ORACLE针对这类情况提供了一个非常简单的措施：当调用LEAD函数时，可以给LEAD传递一个参数，以便准确的指定&#8220;未来的&#8221;行（是下一行？10行之后？等等）。</p>
<p>select ename,hiredate,next_hd,<br />next_hd-hiredate diff<br />from<br />(<br />select deptno,ename,hiredate,<br />lead(hiredate,cnt-rn+1) over(order by hiredate) next_hd<br />from<br />(<br />select deptno,ename,hiredate,<br />count(*) over(partition by hiredate) cnt,<br />row_number() over(partition by hiredate order by empno) rn<br />from emp<br />where deptno=10<br />)<br />)</p>
<p>&nbsp;</p></div><img src ="http://www.blogjava.net/xzclog/aggbug/365946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-12-09 10:40 <a href="http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SYS_CONNECT_BY_PATH函数用法 ORACLE </title><link>http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 05 Aug 2011 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/355850.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/355850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/355850.html</trackback:ping><description><![CDATA[<p>SELECT ename&nbsp;&nbsp; <br />FROM scott.emp&nbsp;&nbsp;&nbsp; <br />START WITH ename = 'KING'&nbsp;&nbsp;&nbsp; <br />CONNECT BY PRIOR empno = mgr;&nbsp;&nbsp;&nbsp; <br />&nbsp; <br />--得到结果为：&nbsp;&nbsp; <br />&nbsp; <br />KING&nbsp;&nbsp; <br />JONES&nbsp;&nbsp; <br />SCOTT&nbsp;&nbsp; <br />ADAMS&nbsp;&nbsp; <br />FORD&nbsp;&nbsp; <br />SMITH&nbsp;&nbsp; <br />BLAKE&nbsp;&nbsp; <br />ALLEN&nbsp;&nbsp; <br />WARD&nbsp;&nbsp; <br />MARTIN&nbsp;&nbsp; <br />TURNER&nbsp;&nbsp; <br />JAMES&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />而：&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />SELECT SYS_CONNECT_BY_PATH(ename, '&gt;') "Path"&nbsp;&nbsp;&nbsp; <br />FROM scott.emp&nbsp;&nbsp;&nbsp; <br />START WITH ename = 'KING'&nbsp;&nbsp;&nbsp; <br />CONNECT BY PRIOR empno = mgr;&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />--得到结果为：&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />&gt;KING&nbsp;&nbsp; <br />&gt;KING&gt;JONES&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;SCOTT&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;SCOTT&gt;ADAMS&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;FORD&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;FORD&gt;SMITH&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;ALLEN&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;WARD&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;MARTIN&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;TURNER&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;JAMES&nbsp;&nbsp; <br />&gt;KING&gt;CLARK&nbsp;&nbsp; <br />&gt;KING&gt;CLARK&gt;MILLER&nbsp; <br />SELECT ename<br />FROM scott.emp <br />START WITH ename = 'KING' <br />CONNECT BY PRIOR empno = mgr; </p>
<p>--得到结果为：</p>
<p>KING<br />JONES<br />SCOTT<br />ADAMS<br />FORD<br />SMITH<br />BLAKE<br />ALLEN<br />WARD<br />MARTIN<br />TURNER<br />JAMES</p>
<p>&nbsp;</p>
<p>而：</p>
<p>&nbsp;</p>
<p>SELECT SYS_CONNECT_BY_PATH(ename, '&gt;') "Path" <br />FROM scott.emp <br />START WITH ename = 'KING' <br />CONNECT BY PRIOR empno = mgr;</p>
<p>&nbsp;</p>
<p>--得到结果为：</p>
<p>&nbsp;</p>
<p>&gt;KING<br />&gt;KING&gt;JONES<br />&gt;KING&gt;JONES&gt;SCOTT<br />&gt;KING&gt;JONES&gt;SCOTT&gt;ADAMS<br />&gt;KING&gt;JONES&gt;FORD<br />&gt;KING&gt;JONES&gt;FORD&gt;SMITH<br />&gt;KING&gt;BLAKE<br />&gt;KING&gt;BLAKE&gt;ALLEN<br />&gt;KING&gt;BLAKE&gt;WARD<br />&gt;KING&gt;BLAKE&gt;MARTIN<br />&gt;KING&gt;BLAKE&gt;TURNER<br />&gt;KING&gt;BLAKE&gt;JAMES<br />&gt;KING&gt;CLARK<br />&gt;KING&gt;CLARK&gt;MILLER<br />&nbsp;</p>
<p><br />其实SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的！<br />它一定要和connect by子句合用！<br />第一个参数是形成树形式的字段，第二个参数是父级和其子级分隔显示用的分隔符！</p>
<p>START WITH 代表你要开始遍历的的节点！</p>
<p>CONNECT BY PRIOR 是标示父子关系的对应！</p>
<p>如下例子：</p>
<p>view plaincopy to clipboardprint?<br />select max(&nbsp;&nbsp; <br />substr(&nbsp;&nbsp; <br />sys_connect_by_path(column_name,',')&nbsp;&nbsp; <br />,2)&nbsp;&nbsp; <br />)&nbsp;&nbsp; <br />from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')&nbsp;&nbsp; <br />start with rn=1 connect by rn=rownum ;&nbsp; <br />select max(<br />substr(<br />sys_connect_by_path(column_name,',')<br />,2)<br />)<br />from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')<br />start with rn=1 connect by rn=rownum ;</p>
<p>&nbsp;</p>
<p>是将列用,进行分割成为一行，然后将首个，去掉，只取取最大的那个数据。</p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>下面是别人的例子：</p>
<p>1、带层次关系</p>
<p>view plaincopy to clipboardprint?<br />SQL&gt; create table dept(deptno number,deptname varchar2(20),mgrno number);&nbsp;&nbsp; <br />&nbsp; <br />Table created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; insert into dept values(1,'总公司',null);&nbsp;&nbsp; <br />&nbsp; <br />1 row created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; insert into dept values(2,'浙江分公司',1);&nbsp;&nbsp; <br />&nbsp; <br />1 row created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; insert into dept values(3,'杭州分公司',2);&nbsp;&nbsp; <br />&nbsp; <br />1 row created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; commit;&nbsp;&nbsp; <br />&nbsp; <br />Commit complete.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;&nbsp;&nbsp; <br />&nbsp; <br />MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))&nbsp;&nbsp; <br />--------------------------------------------------------------------------------&nbsp;&nbsp; <br />总公司,浙江分公司,杭州分公司&nbsp; <br />SQL&gt; create table dept(deptno number,deptname varchar2(20),mgrno number);</p>
<p>Table created.</p>
<p>SQL&gt; insert into dept values(1,'总公司',null);</p>
<p>1 row created.</p>
<p>SQL&gt; insert into dept values(2,'浙江分公司',1);</p>
<p>1 row created.</p>
<p>SQL&gt; insert into dept values(3,'杭州分公司',2);</p>
<p>1 row created.</p>
<p>SQL&gt; commit;</p>
<p>Commit complete.</p>
<p>SQL&gt; select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;</p>
<p>MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))<br />--------------------------------------------------------------------------------<br />总公司,浙江分公司,杭州分公司 </p>
<p>2、行列转换</p>
<p><br />如把一个表的所有列连成一行，用逗号分隔:</p>
<p>view plaincopy to clipboardprint?<br />SQL&gt; select max(substr(sys_connect_by_path(column_name,','),2))&nbsp;&nbsp; <br />from (select column_name,rownum rn from user_tab_columns where table_name ='DEPT')&nbsp;&nbsp; <br />start with rn=1 connect by rn=rownum ;&nbsp;&nbsp; <br />&nbsp; <br />MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,','),2))&nbsp;&nbsp; <br />--------------------------------------------------------------------------------&nbsp;&nbsp; <br />DEPTNO,DEPTNAME,MGRNO&nbsp; </p><img src ="http://www.blogjava.net/xzclog/aggbug/355850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-08-05 11:03 <a href="http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Oracle 10G手工创建数据库 </title><link>http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 18 Jul 2011 10:50:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/354554.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/354554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/354554.html</trackback:ping><description><![CDATA[<div>转自：<a href="http://blog.csdn.net/tianlesoftware/article/details/4680230">http://blog.csdn.net/tianlesoftware/article/details/4680230</a><br />
<p><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">在Oracle中建库，通常有两种方法。一是使用Oracle的建库工</span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">且DBCA，这是一个图形界面工且，使用起来方便且很容易理解，因为它的界面友好、美观，而且提示也比较齐全。在Ｗindows系统中，这个工具可以在Oracle程序组中打开（&#8221;开始&#8221;&#8212;&#8220;程序&#8221;&#8212;&#8220; Oracle OraDb10g_home1&#8221;&#8212;&#8220; Configuration and Migration Tools&#8221;&#8212;&#8220; Database ConfigurationAssistant&#8221;），也可以在命令行（&#8221;开始&#8221;&#8212;&#8220;运行&#8221;&#8212;&#8220;cmd&#8221;）工具中直接输入dbca来打开。另一种方法就是手工建库，这也就是下面所要讲的内容。 手工建库比起使用DBCA建库来说，是比较麻烦的，但是如果我们学好了手工建库的话，就可以使我们更好地理解Oracle数据库的体系结构。手工建库须要经过几个步骤，每一个步骤都非常关键。它包括： </span><br /><span style="font-size: 18px; line-height: 1.3em">１、 <span style="line-height: 1.3em; font-family: '宋体'">创建必要的相关目录 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">２、 <span style="line-height: 1.3em; font-family: '宋体'">创建初始化参数文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">３、 <span style="line-height: 1.3em; font-family: '宋体'">设置环境变量Oracle_sid </span></span><br /><span style="font-size: 18px; line-height: 1.3em">４、 <span style="line-height: 1.3em; font-family: '宋体'">创建实例 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">５、 <span style="line-height: 1.3em; font-family: '宋体'">创建口令文件</span></span><br /><span style="font-size: 18px; line-height: 1.3em">６、 <span style="line-height: 1.3em; font-family: '宋体'">启动数据库到nomount(实例)状态 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">７、 <span style="line-height: 1.3em; font-family: '宋体'">执行建库脚本 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">８、 <span style="line-height: 1.3em; font-family: '宋体'">执行catalog脚步本创建数据字典 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">９、 <span style="line-height: 1.3em; font-family: '宋体'">执行catproc创建package包 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">１０、 <span style="line-height: 1.3em; font-family: '宋体'">执行pupbld </span></span><br /><span style="font-size: 18px; line-height: 1.3em">１１、 <span style="line-height: 1.3em; font-family: '宋体'">由初始化参数文件创建spfile文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">１２、 <span style="line-height: 1.3em; font-family: '宋体'">执行scott脚本创建scott模式 </span></span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">做完了以上的步骤之后就可以使用&#8220;SQL&gt;alterdatabase open;&#8221;打开数据库正常的使用了。下面，我将具体地把以上的几个步骤用实验展开来讲。 实验系统平台：Windows Server 2000　数据库系统版本：Oracle Database 10Ｇ Oracle的安装路径：D盘　</span>.<span style="line-height: 1.3em; font-family: '宋体'">创建的数据库名称：book １、打开命令行工具，创建必要有相关目录 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book</span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/bdump </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/udump </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/cdump</span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/pfile </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/create </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/oradata/book</span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">上面创建目录的过程也可以在Windows的图形界面中去创建。其中</span></span><br /><span style="font-size: 18px; line-height: 1.3em">D:/oracle/product/10.1.0/admin/book<span style="line-height: 1.3em; font-family: '宋体'">目录下的几个子目录主要用于存放数据库运行过程中的跟踪信息。最重要的两上子目录是bdump和udump目录，bdump目录存放的是数据库动行过程中的各个后台进程的跟踪信息，当中alert文件是警告文件，其文件名称为alert_book.log，当数据库出现问题时，首先就可以去查看此文件以找出原因，手工创建过程中出现的各种问题往往也可以通过查看这个文件找到原因。Udump目录存放特定会话相关的跟踪信息D:/oracle/product/10.1.0/oradata/book目录存放各种数据库文件，包括控制文件、数据文件、重做日志文件。</span></span><br /><br /><span style="font-size: 18px; line-height: 1.3em">2<span style="line-height: 1.3em; font-family: '宋体'">、创建初始化参数文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">数据库系统启动时须要用初始化参数文件的设置分配内存、启动必要的后台进程的。因此，初始化参数文件创建的是否正确、参数设置是否正确关系着整个建库的&#8220;命运&#8221;。 创建初始化参数文件可以通过拷贝现在的初始化参数文件并将其做适当的修改即可，从而不必要用</span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">手工去一句一句地写出来，因为初始化参数文件的结构体系基本上都是一样的。在我们安装Oracle的时候，系统已经为我们安装了一个名为orcl的数据库，于是我们可以从它那里得到一份初始化参数文件。打开D:/oracle/product/10.1.0/admin/orcl/pfile，找到init.ora文件，把它拷贝到D:/oracle/product/10.1.0/bd_1/databse下，并将其改名为initbook.ora。接着用记事本的方式打开initbook.ora，修改以下的内容： db_domain=""</span><br /><span style="font-size: 18px; line-height: 1.3em">db_name=book</span><br /><span style="font-size: 18px; line-height: 1.3em">control_files=("D:/oracle/product/10.1.0/oradata/book/control01.ctl", </span><br /><span style="font-size: 18px; line-height: 1.3em">"D:/oracle/product/10.1.0/oradata/book/control02.ctl", </span><br /><span style="font-size: 18px; line-height: 1.3em">"D:/oracle/product/10.1.0/oradata/book/control03.ctl") undo_management=AUTO</span><br /><span style="font-size: 18px; line-height: 1.3em">undo_tablespace=UNDOTBS1<span style="line-height: 1.3em; font-family: '宋体'">　</span></span><br /><span style="font-size: 18px; line-height: 1.3em">&#8213;&#8213;<span style="line-height: 1.3em; font-family: '宋体'">注意此处的&#8220;UNDOTBS1&#8221;要和建库脚步本中对应 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">background_dump_dest=D:/oracle/product/10.1.0/admin/book/bdump </span><br /><span style="font-size: 18px; line-height: 1.3em">core_dump_dest=D:/oracle/product/10.1.0/admin/book/cdump</span><br /><span style="font-size: 18px; line-height: 1.3em">user_dump_dest=D:/oracle/product/10.1.0/admin/book/udump</span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">３、打开命令行，设置环境变量oracle_sid </span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;set oracle_sid=book <span style="line-height: 1.3em; font-family: '宋体'">设置环境变量的目地是在默认的情况下，指定命令行中所操作的数据库实例是book。</span></span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">４、创建实例（即后台控制服务）</span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;oradim &#8211;new &#8211;sid book oradim<span style="line-height: 1.3em; font-family: '宋体'">是创建实例的工具程序名称，-new表明执行新建实例，-delete表明执行删掉实例，-sid指定害例的名称。 ５、创建口令文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;orapwd file=D:/oracle/product/10.1.0/db_1/database/pwdbook.ora password=bookstore entries=2 </span><br /><span style="font-size: 18px; line-height: 1.3em">orapwd<span style="line-height: 1.3em; font-family: '宋体'">是创建口令文件的工肯程序各称，file参数指定口令文件所在的目录和文件名称，password参数指定sys用户的口令，entries参数指定数据库拥用DBA权限的用户的个数，当然还有一个force参数，相信您不指即明，这里就不再细述。 请注意，这里的命令要一行输入，中间不得换行，否则会出现不必要的错误。 口令文件是专门存放sys用户的口令，因为sys用户要负责建库、启动数据库、关闭数据库等特殊任务，把以sys用户的中令单独存放于口令文件中，这样数据库末打开时也能进行口令验证。</span></span><br /><span style="font-size: 18px; line-height: 1.3em">6<span style="line-height: 1.3em; font-family: '宋体'">、启动数据</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">库到nomount(实例)状态 C:/&gt;sqlplus /nolog SQL*Plus:Release 10.1.0.2.0 - Production on 星期三 6月 29 </span><br /><br /><span style="font-size: 18px; line-height: 1.3em">23:09:35 2005 Copyright 1982,2004,Oracle. All rights reserved. SQL&gt;connect sys/bookstore as sysdba</span><br /><span style="font-size: 18px; line-height: 1.3em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---<span style="line-height: 1.3em; font-family: '宋体'">这里是用sys连接数据库 已连接到空闲例程 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;startup nomount ORACLE <span style="line-height: 1.3em; font-family: '宋体'">例程已经启动。</span></span><br /><span style="font-size: 18px; line-height: 1.3em">Total System Global Area 319888364 </span><br /><span style="font-size: 18px; line-height: 1.3em">bytes Fixed Size 453612bytes </span><br /><span style="font-size: 18px; line-height: 1.3em">Variable Size 209715200bytes </span><br /><span style="font-size: 18px; line-height: 1.3em">DatabaseBuffers 109051904bytes </span><br /><span style="font-size: 18px; line-height: 1.3em">Redo Buffers 667648bytes</span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;</span><br /><span style="font-size: 18px; line-height: 1.3em">7<span style="line-height: 1.3em; font-family: '宋体'">、执行建库脚本 </span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">执行建库脚本，首先要有建库的脚本。（去哪找建库脚本呢？我又没有！）不用着急，请接着往下看。 得到一个符合自己要求的建库脚本有两种方法，一种方法是在自己的电脑上用DBCA来建，接照它的提示一步步地去做，在做到第十二步的时候，请选择&#8220;生成建库脚本&#8221;，然后就大功告成，你就可以到相应的目录上去找到那个脚本并适当地修它便可便用。另一种方法就是自己手工去写一份建库脚本，这也是这里要见意使用的方法，用记事本编辑如下的内容，并将其保存为文件名任取而后缀名为（*.sql）的SQL脚本，这里保存到E盘根本录下且文件名称为book.sql。 </span><br /><br /><span style="font-size: 18px; line-height: 1.3em">Create database book datafile 'D:/oracle/product/10.1.0/oradata/book/system01.dbf' size 300M reuse </span><br /><span style="font-size: 18px; line-height: 1.3em">autoextend on next 10240Kmaxsize unlimited extent management local sysaux datafile </span><br /><span style="font-size: 18px; line-height: 1.3em">'D:/oracle/product/10.1.0/oradata/book/sysaux01.dbf' size 120M reuse autoextend on next 10240K </span><br /><span style="font-size: 18px; line-height: 1.3em">maxsize unlimited default temporary tablespace temp tempfile </span><br /><span style="font-size: 18px; line-height: 1.3em">'D:/oracle/product/10.1.0/oradata/book/temp01.dbf' size 20M reuse autoextend on next 640Kmaxsize unlimited undo tablespace "UNDOTBS1" </span><br /><span style="font-size: 18px; line-height: 1.3em">--<span style="line-height: 1.3em; font-family: '宋体'">请注意这里的undo表空间要和参数文件对应 datafile </span></span><br /><span style="font-size: 18px; line-height: 1.3em">'D:/oracle/product/10.1.0/oradata/book/undotbs01.dbf' size 200M reuse autoextend on next 5120K</span><br /><span style="font-size: 18px; line-height: 1.3em">maxsize unlimited logfile</span><br /><span style="font-size: 18px; line-height: 1.3em">group 1 ('D:/oracle/product/10.1.0/oradata/book/redo01.log') size 10240K, </span><br /><span style="font-size: 18px; line-height: 1.3em">group 2 ('D:/oracle/product/10.1.0/oradata/book/redo02.log') size 10240K, group 3('D:/oracle/product/10.1.0/oradata/book/redo03.log') size 10240K <span style="line-height: 1.3em; font-family: '宋体'">接着就执行刚建的建库脚本：</span></span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;start E:/book.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">8、<span style="line-height: 1.3em; font-family: '宋体'">执行catalog脚步本创建数据字典 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;start D:/oracle/product/10.1.0/db_1/rdbms/admin/catalog.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">9<span style="line-height: 1.3em; font-family: '宋体'">、执行catproc创建package包 SQL&gt;start</span></span><br /><span style="font-size: 18px; line-height: 1.3em">D:/oracle/product/10.1.0/db_1/rdbms/admin/catproc.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">10、<span style="line-height: 1.3em; font-family: '宋体'">执行pupbld </span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">在执行pupbld之前要把当前用户（sys）转换成system,即以system账户连接数据库。因为此数据库是刚建的，所以system的口令是系统默认的口令，即manager。你可以在数据库建好以后再来重新设置此账户的口令。 </span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;connectsystem/manager</span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;start D:/oracle/product/10.1.0/db_1/sqlplus/admin/pupbld.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">11<span style="line-height: 1.3em; font-family: '宋体'">、由初始化参</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">数文件创建spfile文件 SQL&gt;create spfile from pfile;</span><br /><span style="font-size: 18px; line-height: 1.3em">12<span style="line-height: 1.3em; font-family: '宋体'">、执行scott脚本创建scott模式 SQL&gt;start</span></span><br /><span style="font-size: 18px; line-height: 1.3em">D:/oracle/product/10.1.0/db_1/rdbms/admin/scott.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">13、<span style="line-height: 1.3em; font-family: '宋体'">把数据库打开到正常状态 SQL&gt;alterdatabase open; </span></span><br /><span style="font-size: 18px; line-height: 1.3em">14<span style="line-height: 1.3em; font-family: '宋体'">、以scott连接到数据库（口令为tiger），测试新建数据库是否可以正常运行 至此，整个数据库就已经建好了。接着你就可以在此数据库上建立自己的账户和表空间啦以及数据库对象，这里就不再作更</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">多地叙述。 </span><br /><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">附：本意是想在linux上创建个oracle实例的，用这个文档捣鼓了半天，都快结束了才发现这个方法只能在window上使用。晕死了。自己机子上装的oracle 11i的，看了下与oracle 10g还是有点区别的：</span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">没仔细研究，就发现amin下目录不一样：</span><br /><span style="font-size: 18px; line-height: 1.3em">Oracle 10G<span style="line-height: 1.3em; font-family: '宋体'">下有</span>bdump <span style="line-height: 1.3em; font-family: '宋体'">，</span>udump <span style="line-height: 1.3em; font-family: '宋体'">，</span>cdump<span style="line-height: 1.3em; font-family: '宋体'">，</span>pfile<span style="line-height: 1.3em; font-family: '宋体'">，</span>create </span><br /><span style="font-size: 18px; line-height: 1.3em">Oracle 11i <span style="line-height: 1.3em; font-family: '宋体'">只有 adump，dpdump，pfile 三个。有空在研究吧。</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">还是想在linux下手动创建个。</span><br /><br /><span style="font-size: 18px; line-height: 1.3em">unix<span style="line-height: 1.3em; font-family: '宋体'">和linux下没有oradim命令</span><span style="line-height: 1.3em; font-family: '宋体'">，</span><span style="line-height: 1.3em; font-family: '宋体'">因为没用，oradim主要就是用来控制服务的，unix/linux上oracle 实例不需要建立服务，所以就没有</span><span style="line-height: 1.3em; font-family: '宋体'">。</span></span></p></div><img src ="http://www.blogjava.net/xzclog/aggbug/354554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-07-18 18:50 <a href="http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈WINDOWS下重装系统后oracle的恢复</title><link>http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sun, 17 Jul 2011 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/354473.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/354473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/354473.html</trackback:ping><description><![CDATA[<p><font size="2">WINDOWS是很脆弱的系统，可能装完没几天就会崩溃，如果你在WINDOWS下装有oracle，那怎么来恢复这个数据库呢？</font></p><br />
<p><font size="2">一种方法是重装数据库后用IMP来导入原来的数据，但使用这种方法的前提是你有以前数据的备份，并且这种方法还有许多不足的地方，如备份过旧，可能会丢失许多数据、导入数据太长等。</font></p>
<p><br /><font size="2">一般情况下我们可以采用重用原来的数据库的方法来恢复。在讲步骤前先说说这种方法的原理。</font></p>
<p><font size="2">数据库与实例对应，当数据库服务启动后，我们可以用SQLPLUS "/AS SYSDBA"方法连接到一个空闲的例程，当执行startup启动数据库时，首先会在%ORACLE_HOME%/database下找当前SID对应的参数文件（PFILE或者SPFILE）和密码文件，然后启动例程；接着根据参数文件记录的信息找到控制文件，读取控制文件的信息，这就是mount数据库了；最终根据控制文件的信息打开数据库。这个过程相当于对数据库着了一次冷备份的恢复。</font></p>
<p><font size="2">下面的具体步骤：（我们假设原库的所有相关文件都存在）<br />1、安装数据库软件<br />只需安装同版本的数据库软件即可，不需要创建数据库。最好安装在和原来数据库同样的%ORACLE_HOME%下，省得还要修改参数文件路径等。（直接覆盖原来的oracle即可）<br />再次强调，只安装软件，不创建数据库，否则将数据库软件安装在同样的目录下旧的部分数据文件会被覆盖，这样数据库也不能被恢复了。</font></p>
<p><font size="2">2、新建一个实例<br />在cmd窗口执行<br />oradim -new -sid oracle9i<br />注意，这个SID名称最好与你以前的SID一样，否则在启动的数据需要指明pfile，并且需要重建密码文件，比较麻烦。（当然，如果你就不想用原来的SID也可以，把参数文件、密码文件的名称都改成与新SID对应的名称）。</font></p>
<p><font size="2">3、启动数据库<br />做完以上两步，就可以启动数据库了。<br />用net start 检查oracle服务是否已经启动，如果oracle服务没有启动，则在cmd下运行如下命令：<br />net start oracleserviceoracle9i<br />然后设定必要的环境变量，在cmd窗口运行<br />set ORACLE_SID=oracle9i</font></p>
<p><font size="2">接着连接数据库<br />sqlplus "/as sysdba"<br />startup</font></p>
<p><font size="2">如果正常的话，数据库应该就能起来了</font></p>
<p><font size="2">4、启动监听<br />lsnrctl start</font></p>
<p><font size="2">5、后续工作<br />经过以上几步后，基本上就可以使用oracle了，但是使用起来有点不方便，如每次在cmd中启动数据库都需要先SET ORACLE_SID、在本机连接数据库也都需要加上@TNSNAME等。我们可以修改注册表，添加ORACLE_SID的信息，避免这些麻烦。</font></p>
<p><font size="2">在注册表的HKEY_LOCAL_MACHINESOFTWAREORACLE下新建字符串值，名称为ORACLE_SID,值为oracle9i。<br />也可以将以下内容保持成一个后缀名为reg的文件（文件名随便起），然后双击，即可将信息导入到注册表中。</font></p>
<p><font size="2">Windows Registry Editor Version 5.00</font></p>
<p><font size="2">[HKEY_LOCAL_MACHINESOFTWAREORACLE]<br />"ORACLE_SID"="oracle9i"</font></p>
<p><br /><font size="2">注意，以上步骤都是在%ORACLE_HOME%、%ORACLE_SID%都与原库一样的情况下讨论的，虽然%ORACLE_HOME%和%ORACLE_SID%可以与原库不一样，但为了减少麻烦和出错的几率，建议不要改变则两个值。</font></p><img src ="http://www.blogjava.net/xzclog/aggbug/354473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-07-17 13:45 <a href="http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DML、DDL、DCL区别</title><link>http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 27 Jun 2011 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/353057.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/353057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/353057.html</trackback:ping><description><![CDATA[<p>总体解释：<br />DML（data manipulation language）：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它们是SELECT、UPDATE、INSERT、DELETE，就象它的名字一样，这4条命令是用来对数据库里的数据进行操作的语言<br />DDL（data definition language）：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DDL比DML要多，主要的命令有CREATE、ALTER、DROP等，DDL主要是用在定义或改变表（TABLE）的结构，数据类型，表之间的链接和约束等初始化工作上，他们大多在建立表时使用<br />DCL（Data Control Language）：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句，包括（grant,deny,revoke等）语句。在默认状态下，只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL</p>
<p>详细解释：<br />一、DDL is Data Definition Language statements. Some examples:数据定义语言，用于定义和管理 SQL 数据库中的所有对象的语言 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.CREATE - to create objects in the database&nbsp;&nbsp; 创建 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.ALTER - alters the structure of the database&nbsp;&nbsp; 修改 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.DROP - delete objects from the database&nbsp;&nbsp; 删除 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRUNCATE TABLE [Table Name]。 <br />　　下面是对Truncate语句在MSSQLServer2000中用法和原理的说明： <br />　　Truncate table 表名 速度快,而且效率高,因为: <br />　　TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同：二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快，且使用的系统和事务日志资源少。 <br />　　DELETE 语句每次删除一行，并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据，并且只在事务日志中记录页的释放。 <br />　　TRUNCATE TABLE 删除表中的所有行，但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值，请改用 DELETE。如果要删除表定义及其数据，请使用 DROP TABLE 语句。 <br />　　对于由 FOREIGN KEY 约束引用的表，不能使用 TRUNCATE TABLE，而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中，所以它不能激活触发器。 <br />　　TRUNCATE TABLE 不能用于参与了索引视图的表。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.COMMENT - add comments to the data dictionary 注释 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.GRANT - gives user's access privileges to database 授权 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.REVOKE - withdraw access privileges given with the GRANT command&nbsp;&nbsp; 收回已经授予的权限</p>
<p>二、DML is Data Manipulation Language statements. Some examples:数据操作语言，SQL中处理数据等操作统称为数据操纵语言 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.SELECT - retrieve data from the a database&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.INSERT - insert data into a table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.UPDATE - updates existing data within a table&nbsp;&nbsp;&nbsp; 更新 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.DELETE - deletes all records from a table, the space for the records remain&nbsp;&nbsp; 删除 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.CALL - call a PL/SQL or Java subprogram <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.EXPLAIN PLAN - explain access path to data <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle RDBMS执行每一条SQL语句，都必须经过Oracle优化器的评估。所以，了解优化器是如何选择(搜索)路径以及索引是如何被使用的，对优化SQL语句有很大的帮助。Explain可以用来迅速方便地查出对于给定SQL语句中的查询数据是如何得到的即搜索路径(我们通常称为Access Path)。从而使我们选择最优的查询方式达到最大的优化效果。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.LOCK TABLE - control concurrency 锁，用于控制并发</p>
<p>三、DCL is Data Control Language statements. Some examples:数据控制语言，用来授予或回收访问数据库的某种特权，并控制数据库操纵事务发生的时间及效果，对数据库实行监视等 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.COMMIT - save work done 提交 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.SAVEPOINT - identify a point in a transaction to which you can later roll back 保存点 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.ROLLBACK - restore database to original since the last COMMIT&nbsp;&nbsp; 回滚 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.SET TRANSACTION - Change transaction options like what rollback segment to use&nbsp;&nbsp; 设置当前事务的特性，它对后面的事务没有影响．</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/level_level/archive/2009/06/08/4248685.aspx">http://blog.csdn.net/level_level/archive/2009/06/08/4248685.aspx</a></p><img src ="http://www.blogjava.net/xzclog/aggbug/353057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-06-27 10:53 <a href="http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 10g 正则表达式　REGEXP_LIKE</title><link>http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 21 Jun 2011 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/352746.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/352746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/352746.html</trackback:ping><description><![CDATA[ORACLE中的支持正则表达式的函数主要有下面四个：<br />1，REGEXP_LIKE ：与LIKE的功能相似<br />2，REGEXP_INSTR ：与INSTR的功能相似<br />3，REGEXP_SUBSTR ：与SUBSTR的功能相似<br />4，REGEXP_REPLACE ：与REPLACE的功能相似<br />它们在用法上与Oracle <a href="javascript:;" target="_self"><u><strong>SQL</strong></u></a> 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同，<br />但是它们使用POSIX 正则表达式代替了老的百分号（%）和通配符（_）字符。<br />POSIX 正则表达式由标准的元字符（metacharacters）所构成：<br />'^' 匹配输入字符串的开始位置，在方括号表达式中使用，此时它表示不接受该字符集合。<br />'$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹<br />配 '\n' 或 '\r'。<br />'.' 匹配除换行符之外的任何单字符。<br />'?' 匹配前面的子表达式零次或一次。<br />'+' 匹配前面的子表达式一次或多次。<br />'*' 匹配前面的子表达式零次或多次。<br />'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的<br />字符串。<br />'( )' 标记一个子表达式的开始和结束位置。<br />'[]' 标记一个中括号表达式。<br />'{m,n}' 一个精确地出现次数范围，m=&lt;出现次数&lt;=n，'{m}'表示出现m次，'{m,}'表示至少<br />出现m次。<br />\num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。<br />字符簇：<br />[[:alpha:]] 任何字母。<br />[[:digit:]] 任何数字。<br />[[:alnum:]] 任何字母和数字。<br />[[:space:]] 任何白字符。<br />[[:upper:]] 任何大写字母。<br />[[:lower:]] 任何小写字母。<br />[[:punct:]] 任何标点符号。<br />[[:xdigit:]] 任何16进制的数字，相当于[0-9a-fA-F]。<br />各种操作符的运算优先级<br />\转义符<br />(), (?:), (?=), [] 圆括号和方括号<br />*, +, ?, {n}, {n,}, {n,m} 限定符<br />^, $, anymetacharacter 位置和顺序<br />|<br />*/<br />--创建表<br />create table fzq<br />(<br />&nbsp; id varchar(4),<br />&nbsp; value varchar(10)<br />);<br />--数据插入<br />insert into fzq values<br />('1','1234560');<br />insert into fzq values<br />('2','1234560');<br />insert into fzq values<br />('3','1b3b560');<br />insert into fzq values<br />('4','abc');<br />insert into fzq values<br />('5','abcde');<br />insert into fzq values<br />('6','ADREasx');<br />insert into fzq values<br />('7','123&nbsp; 45');<br />insert into fzq values<br />('8','adc&nbsp; de');<br />insert into fzq values<br />('9','adc,.de');<br />insert into fzq values<br />('10','1B');<br />insert into fzq values<br />('10','abcbvbnb');<br />insert into fzq values<br />('11','11114560');<br />insert into fzq values<br />('11','11124560');<br />--regexp_like<br />--查询value中以1开头60结束的记录并且长度是7位<br />select * from fzq where value like '1____60';<br />select * from fzq where regexp_like(value,'1....60');<br />--查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。<br />--使用like就不是很好实现了。<br />select * from fzq where regexp_like(value,'1[0-9]{4}60');<br />-- 也可以这样实现，使用字符集。<br />select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');<br />-- 查询value中不是纯数字的记录<br />select * from fzq where not regexp_like(value,'^[[:digit:]]+$');<br />-- 查询value中不包含任何数字的记录。<br />select * from fzq where regexp_like(value,'^[^[:digit:]]+$');<br />--查询以12或者1b开头的记录.不区分大小写。<br />select * from fzq where regexp_like(value,'^1[2b]','i');<br />--查询以12或者1b开头的记录.区分大小写。<br />select * from fzq where regexp_like(value,'^1[2B]');<br />-- 查询数据中包含空白的记录。<br />select * from fzq where regexp_like(value,'[[:space:]]');<br />--查询所有包含小写字母或者数字的记录。<br />select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');<br />--查询任何包含标点符号的记录。<br />select * from fzq where regexp_like(value,'[[:punct:]]');<br />/*<br />理解它的语法就可以了。其它的函数用法类似。<br />作者：tshfang<br />来源: 泥胚文章写作<a href="http://www.nipei.com/">http://www.nipei.com</a>原文地址：<a href="http://www.nipei.com/article/9865">http://www.nipei.com/article/9865</a><img src ="http://www.blogjava.net/xzclog/aggbug/352746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-06-21 15:39 <a href="http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 字符集的查看和修改</title><link>http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 15 Apr 2011 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/348338.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/348338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/348338.html</trackback:ping><description><![CDATA[<p>转自：http://blog.csdn.net/tianlesoftware/archive/2009/12/01/4915223.aspx<br />
</p>
<p>一、什么是Oracle字符集 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储，处理，检索数据。它使数据库工具，错误消息，排序次序，日期，时间，货币，数字，和日历自动适应本地化语言和平台。 </p>
<p>&nbsp;</p>
<p>影响Oracle数据库字符集最重要的参数是NLS_LANG参数。</p>
<p>它的格式如下: NLS_LANG = language_territory.charset </p>
<p>它有三个组成部分(语言、地域和字符集)，每个成分控制了NLS子集的特性。</p>
<p>其中: </p>
<p>Language： 指定服务器消息的语言， 影响提示信息是中文还是英文</p>
<p>Territory： 指定服务器的日期和数字格式，</p>
<p>Charset：&nbsp; 指定字符集。</p>
<p>如:AMERICAN _ AMERICA. ZHS16GBK </p>
<p>从NLS_LANG的组成我们可以看出，真正影响数据库字符集的其实是第三部分。</p>
<p>所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据，前面影响的只是提示信息是中文还是英文。</p>
<p>&nbsp;</p>
<p>二．字符集的相关知识：</p>
<p>2.1 字符集<br />
&nbsp;&nbsp;&nbsp; 实质就是按照一定的字符编码方案，对一组特定的符号，分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。<br />
&nbsp;&nbsp;&nbsp; Oracle的字符集命名遵循以下命名规则:<br />
&nbsp;&nbsp;&nbsp; &lt;Language&gt;&lt;bit size&gt;&lt;encoding&gt;<br />
&nbsp;&nbsp;&nbsp; 即: &lt;语言&gt;&lt;比特位数&gt;&lt;编码&gt;<br />
&nbsp;&nbsp;&nbsp; 比如: ZHS16GBK表示采用GBK编码格式、16位（两个字节）简体中文字符集 <br />
&nbsp; <br />
2.2 字符编码方案</p>
<p><br />
2.2.1 单字节编码<br />
&nbsp;&nbsp;&nbsp; （1）单字节7位字符集，可以定义128个字符，最常用的字符集为US7ASCII<br />
&nbsp;&nbsp;&nbsp; （2）单字节8位字符集，可以定义256个字符，适合于欧洲大部分国家<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：WE8ISO8859P1(西欧、8位、ISO标准8859P1编码) </p>
<p>&nbsp;</p>
<p>2.2.2 多字节编码<br />
&nbsp;&nbsp;&nbsp; （1）变长多字节编码<br />
&nbsp;&nbsp;&nbsp; 某些字符用一个字节表示，其它字符用两个或多个字符表示，变长多字节编码常用于对亚洲语言的支持，&nbsp;&nbsp; 例如日语、汉语、印地语等<br />
&nbsp;&nbsp;&nbsp; 例如：AL32UTF8（其中AL代表ALL,指适用于所有语言）、zhs16cgb231280<br />
&nbsp;&nbsp;&nbsp; （2）定长多字节编码<br />
&nbsp;&nbsp;&nbsp; 每一个字符都使用固定长度字节的编码方案，目前oracle唯一支持的定长多字节编码是AF16UTF16，也是仅用于国家字符集 </p>
<p>2.2.3 unicode编码<br />
&nbsp;&nbsp;&nbsp; Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案，也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式，是一种定长多字节编码，用2个字节表示一个unicode字符，AF16UTF16是UTF-16编码字符集。<br />
&nbsp;&nbsp;&nbsp; UTF-8是unicode的8位编码方式，是一种变长多字节编码，这种编码可以用1、2、3个字节表示一个unicode字符，AL32UTF8，UTF8、UTFE是UTF-8编码字符集 <br />
&nbsp; <br />
2.3 字符集超级<br />
&nbsp;&nbsp;&nbsp; 当一种字符集（字符集A）的编码数值包含所有另一种字符集（字符集B）的编码数值，并且两种字符集相同编码数值代表相同的字符时，则字符集A是字符集B的超级，或称字符集B是字符集A的子集。<br />
&nbsp;&nbsp;&nbsp; Oracle8i和oracle9i官方文档资料中备有子集-超级对照表（subset-superset pairs），例如：WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式，因此有许多字符集是US7ASCII的超集，例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。 <br />
&nbsp; <br />
2.4 数据库字符集（oracle服务器端字符集）<br />
&nbsp;&nbsp;&nbsp; 数据库字符集在创建数据库时指定，在创建后通常不能更改。在创建数据库时，可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。 </p>
<p>&nbsp;</p>
<p>2.4.1字符集<br />
&nbsp;&nbsp;&nbsp; (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据<br />
&nbsp;&nbsp;&nbsp; (2)用来标示诸如表名、列名以及PL/SQL变量等<br />
&nbsp;&nbsp;&nbsp; (3)用来存储SQL和PL/SQL程序单元等 </p>
<p>&nbsp;</p>
<p>2.4.2国家字符集：<br />
&nbsp;&nbsp;&nbsp; (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据<br />
&nbsp;&nbsp;&nbsp; (2)国家字符集实质上是为oracle选择的附加字符集，主要作用是为了增强oracle的字符处理能力，因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持，而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义，只能在unicode编码中的AF16UTF16和UTF8中选择，默认值是AF16UTF16 </p>
<p>&nbsp;</p>
<p>2.4.3查询字符集参数<br />
&nbsp;&nbsp;&nbsp; 可以查询以下数据字典或视图查看字符集设置情况<br />
&nbsp;&nbsp;&nbsp; nls_database_parameters、props$、v$nls_parameters<br />
&nbsp;&nbsp;&nbsp; 查询结果中NLS_CHARACTERSET表示字符集，NLS_NCHAR_CHARACTERSET表示国家字符集 </p>
<p>&nbsp;</p>
<p>2.4.4修改数据库字符集<br />
&nbsp;&nbsp;&nbsp; 按照上文所说，数据库字符集在创建后原则上不能更改。不过有2种方法可行。</p>
<p>&nbsp;</p>
<p>1. 如果需要修改字符集，通常需要导出数据库数据，重建数据库，再导入数据库数据的方式来转换。</p>
<p>2. 通过ALTER DATABASE CHARACTER SET语句修改字符集，但创建数据库后修改字符集是有限制的，只有新的字符集是当前字符集的超集时才能修改数据库字符集，例如UTF8是US7ASCII的超集，修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。 <br />
&nbsp; <br />
2.5 客户端字符集（NLS_LANG参数）</p>
<p><br />
2.5.1客户端字符集含义<br />
&nbsp;&nbsp;&nbsp; 客户端字符集定义了客户端字符数据的编码方式，任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用，例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。 </p>
<p>&nbsp;</p>
<p>2.5.2 NLS_LANG参数格式<br />
&nbsp;&nbsp;&nbsp; NLS_LANG=&lt;language&gt;_&lt;territory&gt;.&lt;client character set&gt; <br />
&nbsp;&nbsp;&nbsp; Language: 显示oracle消息,校验，日期命名<br />
&nbsp;&nbsp;&nbsp; Territory：指定默认日期、数字、货币等格式<br />
&nbsp;&nbsp;&nbsp; Client character set：指定客户端将使用的字符集<br />
&nbsp;&nbsp;&nbsp; 例如：NLS_LANG=AMERICAN_AMERICA.US7ASCII <br />
&nbsp;&nbsp;&nbsp; AMERICAN是语言，AMERICA是地区，US7ASCII是客户端字符集 </p>
<p>&nbsp;</p>
<p>2.5.3客户端字符集设置方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)UNIX环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $NLS_LANG=&#8220;simplified chinese&#8221;_china.zhs16gbk<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $export NLS_LANG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑oracle用户的profile文件<br />
&nbsp;&nbsp;&nbsp; 2)Windows环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑注册表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME</p>
<p>&nbsp;</p>
<p>2.5.4 NLS参数查询<br />
&nbsp;&nbsp;&nbsp; Oracle提供若干NLS参数定制数据库和用户机以适应本地格式，例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等，可以通过查询以下数据字典或v$视图查看。<br />
NLS_DATABASE_PARAMETERS:显示数据库当前NLS参数取值，包括数据库字符集取值<br />
NLS_SESSION_PARAMETERS：&nbsp; 显示由NLS_LANG 设置的参数，或经过alter session 改变后的参数值（不包括由NLS_LANG 设置的客户端字符集）<br />
NLS_INSTANCE_PARAMETE： 显示由参数文件init&lt;SID&gt;.ora 定义的参数</p>
<p>V$NLS_PARAMETERS：显示数据库当前NLS参数取值 </p>
<p>&nbsp;</p>
<p>2.5.5修改NLS参数<br />
&nbsp;&nbsp;&nbsp; 使用下列方法可以修改NLS参数<br />
&nbsp;&nbsp;&nbsp; （1）修改实例启动时使用的初始化参数文件<br />
&nbsp;&nbsp;&nbsp; （2）修改环境变量NLS_LANG<br />
&nbsp;&nbsp;&nbsp; （3）使用ALTER SESSION语句，在oracle会话中修改<br />
&nbsp;&nbsp;&nbsp; （4）使用某些SQL函数<br />
&nbsp;&nbsp;&nbsp; NLS作用优先级别：Sql function &gt; alter session &gt; 环境变量或注册表 &gt; 参数文件 &gt; 数据库默认参数 </p>
<p>&nbsp;</p>
<p>三．EXP/IMP 与 字符集</p>
<p>3.1 EXP/IMP<br />
&nbsp;&nbsp;&nbsp; Export 和 Import 是一对读写Oracle数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到Oracle 数据库中，由于使用exp/imp进行数据迁移时，数据从源数据库到目标数据库的过程中有四个环节涉及到字符集，如果这四个环节的字符集不一致，将会发生字符集转换。 <br />
EXP<br />
&nbsp;&nbsp;&nbsp;&nbsp; ____________ _________________ _____________<br />
&nbsp;&nbsp;&nbsp;&nbsp; |imp导入文件|&lt;-|环境变量NLS_LANG|&lt;-|数据库字符集|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------------&nbsp;&nbsp; -----------------&nbsp;&nbsp; ------------- </p>
<p>IMP <br />
&nbsp;&nbsp;&nbsp;&nbsp; ____________ _________________ _____________<br />
&nbsp;&nbsp;&nbsp;&nbsp; |imp导入文件|-&gt;|环境变量NLS_LANG|-&gt;|数据库字符集|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------------&nbsp;&nbsp; -----------------&nbsp;&nbsp; ------------- </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>四个字符集是<br />
&nbsp;&nbsp; （1）源数据库字符集 <br />
&nbsp;&nbsp; （2）Export过程中用户会话字符集（通过NLS_LANG设定）<br />
&nbsp;&nbsp; （3）Import过程中用户会话字符集（通过NLS_LANG设定）<br />
&nbsp;&nbsp; （4）目标数据库字符集 <br />
&nbsp; <br />
3.2导出的转换过程<br />
&nbsp;&nbsp;&nbsp; 在Export过程中，如果源数据库字符集与Export用户会话字符集不一致，会发生字符集转换，并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。</p>
<p><br />
例:如果源数据库使用ZHS16GBK，而Export用户会话字符集使用US7ASCII，由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集，这个转换过程中，中文字符在US7ASCII中不能够找到对等的字符，所以所有中文字符都会丢失而变成&#8220;?? &#8221;形式，这样转换后生成的Dmp文件已经发生了数据丢失。<br />
因此如果想正确导出源数据库数据，则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集 <br />
&nbsp; <br />
3.3导入的转换过程<br />
&nbsp;&nbsp;&nbsp; （1）确定导出数据库字符集环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过读取导出文件头，可以获得导出文件的字符集设置<br />
&nbsp;&nbsp;&nbsp; （2）确定导入session的字符集，即导入Session使用的NLS_LANG环境变量<br />
&nbsp;&nbsp;&nbsp; （3）IMP读取导出文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读取导出文件字符集ID，和导入进程的NLS_LANG进行比较<br />
&nbsp;&nbsp;&nbsp; （4）如果导出文件字符集和导入Session字符集相同，那么在这一步骤内就不需要转换，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不同，就需要把数据转换为导入Session使用的字符集。可以看出，导入数据到数据库过程中发生两次字符集转换</p>
<p><br />
&nbsp;&nbsp;&nbsp; 第一次:导入文件字符集与导入Session使用的字符集之间的转换，如果这个转换过程不能正确完成，Import向目标数据库的导入过程也就不能完成。<br />
&nbsp;&nbsp;&nbsp; 第二次:导入Session字符集与数据库字符集之间的转换。</p>
<p>&nbsp;</p>
<p>四. 查看数据库字符集</p>
<p>涉及三方面的字符集，</p>
<p>1. oracel server端的字符集;</p>
<p>2. oracle client端的字符集;</p>
<p>3. dmp文件的字符集。</p>
<p>&nbsp;</p>
<p>在做数据导入的时候，需要这三个字符集都一致才能正确导入。</p>
<p>&nbsp;</p>
<p>4.1 查询oracle server端的字符集 </p>
<p>有很多种方法可以查出oracle server端的字符集，比较直观的查询方法是以下这种:</p>
<p>SQL&gt; select userenv('language') from dual;</p>
<p>USERENV('LANGUAGE')</p>
<p>----------------------------------------------------</p>
<p>SIMPLIFIED CHINESE_CHINA.ZHS16GBK</p>
<p>&nbsp;</p>
<p>SQL&gt;select userenv(&#8216;language&#8217;) from dual; </p>
<p>AMERICAN _ AMERICA. ZHS16GBK </p>
<p>&nbsp;</p>
<p>4.2 如何查询dmp文件的字符集 </p>
<p>用oracle的exp工具导出的dmp文件也包含了字符集信息，dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大，比如只有几M或几十M，可以用UltraEdit打开(16进制方式)，看第2第3个字节的内容，如0354，然后用以下SQL查出它对应的字符集: </p>
<p>SQL&gt; select nls_charset_name(to_number('0354','xxxx')) from dual; </p>
<p>ZHS16GBK </p>
<p>&nbsp;</p>
<p>如果dmp文件很大，比如有2G以上(这也是最常见的情况)，用文本编辑器打开很慢或者完全打不开，可以用以下命令(在unix主机上): </p>
<p>cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6 </p>
<p>然后用上述SQL也可以得到它对应的字符集。</p>
<p>&nbsp;</p>
<p>4.3 查询oracle client端的字符集 </p>
<p>在windows平台下，就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置，</p>
<p>比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK </p>
<p>这样就只影响这个窗口里面的环境变量。 </p>
<p>&nbsp;</p>
<p>在unix平台下，就是环境变量NLS_LANG。 </p>
<p>$echo $NLS_LANG </p>
<p>AMERICAN_AMERICA.ZHS16GBK </p>
<p>&nbsp;</p>
<p>如果检查的结果发现server端与client端字符集不一致，请统一修改为同server端相同的字符集。</p>
<p>&nbsp;</p>
<p>补充：</p>
<p>(1).数据库服务器字符集</p>
<p>select * from nls_database_parameters</p>
<p>来源于props$，是表示数据库的字符集。</p>
<p>&nbsp;</p>
<p>(2).客户端字符集环境</p>
<p>select * from nls_instance_parameters</p>
<p>其来源于v$parameter，表示客户端的字符集的设置，可能是参数文件，环境变量或者是注册表</p>
<p>&nbsp;</p>
<p>(3).会话字符集环境</p>
<p>select * from nls_session_parameters</p>
<p>来源于v$nls_parameters，表示会话自己的设置，可能是会话的环境变量或者是alter session完成，如果会话没有特殊的设置，将与nls_instance_parameters一致。</p>
<p>&nbsp;</p>
<p>(4).客户端的字符集要求与服务器一致，才能正确显示数据库的非Ascii字符。</p>
<p>如果多个设置存在的时候，NLS作用优先级别：Sql function &gt; alter session &gt; 环境变量或注册表 &gt; 参数文件 &gt; 数据库默认参数</p>
<p>&nbsp;</p>
<p>字符集要求一致，但是语言设置却可以不同，语言设置建议用英文。如字符集是zhs16gbk，则nls_lang可以是American_America.zhs16gbk。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>五． 修改oracle的字符集 </p>
<p>按照上文所说，数据库字符集在创建后原则上不能更改。因此，在设计和安装之初考虑使用哪一种字符集十分重要。对数据库server而言，错误的修改字符集将会导致很多不可测的后果，可能会严重影响数据库的正常运行，所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说，除非万不得已，我们不建议修改oracle数据库server端的字符集。特别说明，我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系，因此理论上讲这两种字符集之间的相互转换不受支持。 </p>
<p>&nbsp;</p>
<p>不过修改字符集有2种方法可行。</p>
<p>1. 通常需要导出数据库数据，重建数据库，再导入数据库数据的方式来转换。</p>
<p>2. 通过ALTER DATABASE CHARACTER SET语句修改字符集，但创建数据库后修改字符集是有限制的，只有新的字符集是当前字符集的超集时才能修改数据库字符集，例如UTF8是US7ASCII的超集，修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。 <br />
&nbsp;</p>
<p>&nbsp;</p>
<p>5.1 修改server端字符集(不建议使用) </p>
<p>&nbsp;</p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭数据库</p>
<p>SQL&gt;SHUTDOWN IMMEDIATE</p>
<p>&nbsp;</p>
<p>2. 启动到Mount</p>
<p>SQL&gt;STARTUP MOUNT; </p>
<p>SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION; </p>
<p>SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; </p>
<p>SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0; </p>
<p>SQL&gt;ALTER DATABASE OPEN; </p>
<p>SQL&gt;ALTER DATABASE CHARACTER SET ZHS16GBK; </p>
<p>SQL&gt;ALTER DATABASE national CHARACTER SET ZHS16GBK; </p>
<p>SQL&gt;SHUTDOWN IMMEDIATE; </p>
<p>SQL&gt;STARTUP</p>
<p>注意：如果没有大对象，在使用过程中进行语言转换没有什么影响，（切记设定的字符集必须是ORACLE支持，不然不能start） 按上面的做法就可以。</p>
<p>&nbsp;</p>
<p>若出现&#8216;ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists&#8217; 这样的提示信息，</p>
<p>要解决这个问题有两种方法</p>
<p>1. 利用INTERNAL_USE 关键字修改区域设置,</p>
<p>2. 利用re-create,但是re-create有点复杂,所以请用internal_use</p>
<p>&nbsp;</p>
<p>SQL&gt;SHUTDOWN IMMEDIATE;</p>
<p>SQL&gt;STARTUP MOUNT EXCLUSIVE;</p>
<p>SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION;</p>
<p>SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;</p>
<p>SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0;</p>
<p>SQL&gt;ALTER DATABASE OPEN;</p>
<p>SQL&gt;ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;</p>
<p>SQL&gt;SHUTDOWN immediate;</p>
<p>SQL&gt;startup;</p>
<p>如果按上面的做法做,National charset的区域设置就没有问题</p>
<p>&nbsp;</p>
<p>5.2 修改dmp文件字符集 </p>
<p>上文说过，dmp文件的第2第3字节记录了字符集信息，因此直接修改dmp文件的第2第3字节的内容就可以&#8216;骗&#8217;过oracle的检查。这样做理论上也仅是从子集到超集可以修改，但很多情况下在没有子集和超集关系的情况下也可以修改，我们常用的一些字符集，如US7ASCII，WE8ISO8859P1，ZHS16CGB231280，ZHS16GBK基本都可以改。因为改的只是dmp文件，所以影响不大。 </p>
<p>&nbsp;</p>
<p>具体的修改方法比较多，最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。</p>
<p>比如想将dmp文件的字符集改为ZHS16GBK，可以用以下SQL查出该种字符集对应的16进制代码: SQL&gt; select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual; </p>
<p>0354 </p>
<p>然后将dmp文件的2、3字节修改为0354即可。 </p>
<p>如果dmp文件很大，用ue无法打开，就需要用程序的方法了。</p>
<p>&nbsp;</p>
<p>5.3客户端字符集设置方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)UNIX环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $NLS_LANG=&#8220;simplified chinese&#8221;_china.zhs16gbk<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $export NLS_LANG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑oracle用户的profile文件<br />
&nbsp;&nbsp;&nbsp; 2)Windows环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑注册表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME</p>
<p>&nbsp; 或者在窗口设置：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set nls_lang=AMERICAN_AMERICA.ZHS16GBK </p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/tianlesoftware/archive/2009/12/01/4915223.aspx</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/348338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-15 10:58 <a href="http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g Shrink Table 详解［表空间收缩］</title><link>http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 15 Apr 2011 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/348337.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/348337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/348337.html</trackback:ping><description><![CDATA[转自：http://blog.csdn.net/tianlesoftware/archive/2009/11/04/4764254.aspx<br />
<p>从10g开始，oracle开始提供Shrink的命令，假如我们的表空间中支持自动段空间管理 (ASSM),就可以使用这个特性缩小段，即降低HWM。这里需要强调一点，10g的这个新特性，仅对ASSM表空间有效，否则会报 ORA-10635: Invalid segment or tablespace type。 </p>
<p>&nbsp;</p>
<p>有关ASSM的详细信息，请参考我的Blog：Oracle 自动段空间管理</p>
<p>http://blog.csdn.net/tianlesoftware/archive/2009/12/07/4958989.aspx</p>
<p>&nbsp;</p>
<p>如果经常在表上执行DML操作，会造成数据库块中数据分布稀疏，浪费大量空间。同时也会影响全表扫描的性能，因为全表扫描需要访问更多的数据块。从oracle10g开始，表可以通过shrink来重组数据使数据分布更紧密，同时降低HWM释放空闲数据块。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>segment shrink分为两个阶段：</p>
<p>&nbsp;</p>
<p>1、数据重组(compact):通过一系列insert、delete操作，将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁，即只在需要移动的行上加锁。由于涉及到rowid的改变，需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。</p>
<p>&nbsp;</p>
<p>2、HWM调整：第二阶段是调整HWM位置，释放空闲数据块。此过程需要在表上加X锁，会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>shrink space语句两个阶段都执行。</p>
<p>&nbsp;</p>
<p>shrink space compact只执行第一个阶段。</p>
<p>如果系统业务比较繁忙，可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。</p>
<p>&nbsp;</p>
<p>shrink必须开启行迁移功能。</p>
<p>alter table table_name enable row movement ;</p>
<p>&nbsp;</p>
<p>注意：alter table XXX enable row movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后，最好执行一下utlrp.sql来编译无效的对象。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>语法：</p>
<p>alter table &lt;table_name&gt; shrink space [ &lt;null&gt; | compact | cascade ];</p>
<p>alter table &lt;table_name&gt; shrink space compcat;</p>
<p>收缩表，相当于把块中数据打结实了，但会保持 high water mark; </p>
<p>&nbsp;</p>
<p>alter table &lt;tablespace_name&gt; shrink space;</p>
<p>收缩表，降低 high water mark;</p>
<p>&nbsp;</p>
<p>alter table &lt;tablespace_name&gt; shrink space cascade;</p>
<p>收缩表，降低 high water mark，并且相关索引也要收缩一下下。</p>
<p>&nbsp;</p>
<p>alter index idxname shrink space;</p>
<p>回缩索引</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1：普通表</p>
<p>&nbsp;</p>
<p>Sql脚本，改脚本会生成相应的语句</p>
<p>select'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10)from user_tables;</p>
<p>&nbsp;</p>
<p>select'alter index '||index_name||' shrink space;'||chr(10)from user_indexes;</p>
<p>&nbsp;</p>
<p>2：分区表的处理</p>
<p>&nbsp;</p>
<p>进行shrink space时 发生ORA-10631错误.shrink space有一些限制.</p>
<p>&nbsp;</p>
<p>在表上建有函数索引（包括全文索引）会失败。</p>
<p>&nbsp;</p>
<p>Sql脚本，改脚本会生成相应的语句</p>
<p>&nbsp;</p>
<p>select 'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10) from user_tables where ;</p>
<p>&nbsp;</p>
<p>select 'alter index '||index_name||' shrink space;'||chr(10) from user_indexes where uniqueness='NONUNIQUE' ;</p>
<p>&nbsp;</p>
<p>select 'alter table '||segment_name||' modify subpartition '||partition_name||' shrink space;'||chr(10) from user_segments where segment_type='TABLE SUBPARTITION' ';</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>详细测试：</p>
<p>&nbsp;</p>
<p>我们用系统视图all_objects来在上个测试的tablespace ASSM上创建测试表my_objects</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 20:42:45 (QP5 v5.115.810.9015) */</p>
<p>CREATE TABLESPACE ASSM DATAFILE 'd:\ASSM01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 20:39:26 (QP5 v5.115.810.9015) */</p>
<p>SELECT&nbsp;&nbsp; TABLESPACE_NAME,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_SIZE,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXTENT_MANAGEMENT,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALLOCATION_TYPE,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT_SPACE_MANAGEMENT</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_tablespaces</p>
<p>&nbsp;WHERE&nbsp;&nbsp; TABLESPACE_NAME = 'ASSM';</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>TABLESPACE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_SIZE EXTENT_MAN ALLOCATIO SEGMEN</p>
<p>--------------------- ---------- ---------- --------- ------</p>
<p>ASSM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYSTEM&nbsp;&nbsp;&nbsp; AUTO&nbsp; </p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 20:44:15 (QP5 v5.115.810.9015) */</p>
<p>CREATE TABLE my_objects</p>
<p>TABLESPACE assm</p>
<p>AS</p>
<p>&nbsp;&nbsp; SELECT&nbsp;&nbsp; * FROM all_objects;</p>
<p>&nbsp;</p>
<p>然后我们随机地从table MY_OBJECTS中删除一部分数据： </p>
<p>SQL&gt; SELECT&nbsp;&nbsp; COUNT ( * ) FROM my_objects;</p>
<p>COUNT(*) </p>
<p>---------- </p>
<p>49477 </p>
<p>SQL&gt; delete from my_objects where object_name like '%C%'; </p>
<p>SQL&gt; delete from my_objects where object_name like '%U%'; </p>
<p>SQL&gt; delete from my_objects where object_name like '%A%'; </p>
<p>&nbsp;</p>
<p>现在我们使用show_space()来看看my_objects的数据存储状况： </p>
<p>注： show_space() 存储过程代码参看一下连接的附件</p>
<p>http://blog.csdn.net/tianlesoftware/archive/2009/12/07/4958989.aspx</p>
<p>&nbsp;</p>
<p>SQL&gt;exec show_space('my_objects','auto','T','Y');</p>
<p>Total Blocks............................768</p>
<p>Total Bytes.............................6291456</p>
<p>Unused Blocks...........................68</p>
<p>Unused Bytes............................557056</p>
<p>Last Used Ext FileId....................8</p>
<p>Last Used Ext BlockId...................649</p>
<p>Last Used Block.........................60</p>
<p>&nbsp;*************************************************</p>
<p>The segment is analyzed</p>
<p>0% -- 25% free space blocks.............41</p>
<p>0% -- 25% free space bytes..............335872</p>
<p>25% -- 50% free space blocks............209</p>
<p>25% -- 50% free space bytes.............1712128</p>
<p>50% -- 75% free space blocks............190</p>
<p>50% -- 75% free space bytes.............1556480</p>
<p>75% -- 100% free space blocks...........229</p>
<p>75% -- 100% free space bytes............1875968</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Total Blocks............................11</p>
<p>Total bytes.............................90112</p>
<p>PL/SQL 过程已成功完成。 </p>
<p>这里，table my_objects的HWM下有767个block，其中，free space为25-50%的block有209个，free space为50-75%的block有190个，free space为75-100%的block有229个. Total blocks 11个。</p>
<p>&nbsp;</p>
<p>这种情况下，我们需要对这个table的现有数据行进行重组。 </p>
<p>&nbsp;</p>
<p>要使用assm上的shink，首先我们需要使该表支持行移动，可以用这样的命令来完成： </p>
<p>alter table my_objects enable row movement; </p>
<p>现在，就可以来降低my_objects的HWM，回收空间了，使用命令： </p>
<p>alter table bookings shrink space; </p>
<p>&nbsp;</p>
<p>我们具体的看一下实验的结果： </p>
<p>SQL&gt; alter table my_objects enable row movement; </p>
<p>表已更改。 </p>
<p>SQL&gt; alter table my_objects shrink space; </p>
<p>表已更改。 </p>
<p>SQL&gt;exec show_space('my_objects','auto','T','Y');</p>
<p>Total Blocks............................272</p>
<p>Total Bytes.............................2228224</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Last Used Ext FileId....................8</p>
<p>Last Used Ext BlockId...................265</p>
<p>Last Used Block.........................16</p>
<p>&nbsp;*************************************************</p>
<p>The segment is analyzed</p>
<p>0% -- 25% free space blocks.............0</p>
<p>0% -- 25% free space bytes..............0</p>
<p>25% -- 50% free space blocks............0</p>
<p>25% -- 50% free space bytes.............0</p>
<p>50% -- 75% free space blocks............1</p>
<p>50% -- 75% free space bytes.............8192</p>
<p>75% -- 100% free space blocks...........0</p>
<p>75% -- 100% free space bytes............0</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Total Blocks............................257</p>
<p>Total bytes.............................2105344</p>
<p>&nbsp;</p>
<p>在执行玩shrink命令后，我们可以看到，table my_objects的HWM现在降到了271的位置，而且HWM下的block的空间使用状况，Total blocks 的block有257个，free space 为25-50% Block只有0个。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Shrink 的实现机制：</p>
<p>我们接下来讨论一下shrink的实现机制，我们同样使用讨论move机制的那个实验来观察。 </p>
<p>/* Formatted on 2009-12-7 20:58:40 (QP5 v5.115.810.9015) */</p>
<p>CREATE TABLE TEST_HWM (id&nbsp; INT, name CHAR (2000))</p>
<p>TABLESPACE ASSM;</p>
<p>&nbsp;</p>
<p>INSERT INTO TEST_HWM&nbsp; VALUES&nbsp;&nbsp; (1, 'aa');</p>
<p>INSERT INTO TEST_HWM&nbsp; VALUES&nbsp;&nbsp; (2, 'bb');</p>
<p>INSERT INTO TEST_HWM&nbsp; VALUES&nbsp;&nbsp; (2, 'cc');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (3, 'dd');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (4, 'ds');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (5, 'dss');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (6, 'dss');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (7, 'ess');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (8, 'es');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (9, 'es');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (10, 'es');</p>
<p>&nbsp;</p>
<p>我们来看看这个table的rowid和block的ID和信息： </p>
<p>/* Formatted on 2009-12-7 21:00:02 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; ROWID, id, name FROM TEST_HWM;ROWID ID NAME </p>
<p>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME</p>
<p>-------------------------------------&nbsp;&nbsp;&nbsp; ---------- --------</p>
<p>AAANMEAAIAAAAEcAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 dd</p>
<p>AAANMEAAIAAAAEcAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 ds</p>
<p>AAANMEAAIAAAAEcAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 dss</p>
<p>AAANMEAAIAAAAEdAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 dss</p>
<p>AAANMEAAIAAAAEdAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 ess</p>
<p>AAANMEAAIAAAAEdAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 es</p>
<p>AAANMEAAIAAAAEeAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 es</p>
<p>AAANMEAAIAAAAEeAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 es</p>
<p>AAANMEAAIAAAAEgAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 aa</p>
<p>AAANMEAAIAAAAEgAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 bb</p>
<p>AAANMEAAIAAAAEgAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 cc</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 21:00:49 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; EXTENT_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RELATIVE_FNO,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_extents</p>
<p>&nbsp;WHERE&nbsp;&nbsp; segment_name = 'TEST_HWM';</p>
<p>&nbsp;</p>
<p>&nbsp;EXTENT_ID&nbsp;&nbsp;&nbsp; FILE_ID RELATIVE_FNO&nbsp;&nbsp; BLOCK_ID&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>---------- ---------- ------------ ---------- ----------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 281&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8</p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>然后从table test_hwm中删除一些数据： </p>
<p>delete from TEST_HWM where id = 2; </p>
<p>delete from TEST_HWM where id = 4; </p>
<p>delete from TEST_HWM where id = 3; </p>
<p>delete from TEST_HWM where id = 7; </p>
<p>delete from TEST_HWM where id = 8; </p>
<p>&nbsp;</p>
<p>观察table test_hwm的rowid和blockid的信息： </p>
<p>SQL&gt; select rowid , id,name from TEST_HWM; </p>
<p>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME</p>
<p>------------------------------------------ ---------- ---------</p>
<p>AAANMEAAIAAAAEcAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 dss</p>
<p>AAANMEAAIAAAAEdAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 dss</p>
<p>AAANMEAAIAAAAEeAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 es</p>
<p>AAANMEAAIAAAAEeAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 es</p>
<p>AAANMEAAIAAAAEgAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 aa</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 21:00:49 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; EXTENT_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RELATIVE_FNO,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_extents</p>
<p>&nbsp;WHERE&nbsp;&nbsp; segment_name = 'TEST_HWM';</p>
<p>&nbsp;</p>
<p>&nbsp;EXTENT_ID&nbsp;&nbsp;&nbsp; FILE_ID RELATIVE_FNO&nbsp;&nbsp; BLOCK_ID&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>---------- ---------- ------------ ---------- ----------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 281&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8</p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>从以上的信息，我们可以看到，在table test_hwm中，剩下的数据是分布在AAAAEc，AAAAEd，AAAAEf，AAAAEg这样四个连续的block中。 </p>
<p>&nbsp;</p>
<p>SQL&gt; exec show_space('TEST_HWM','auto','T','Y');</p>
<p>Total Blocks............................8</p>
<p>Total Bytes.............................65536</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Last Used Ext FileId....................8</p>
<p>Last Used Ext BlockId...................281</p>
<p>Last Used Block.........................8</p>
<p>&nbsp;*************************************************</p>
<p>The segment is analyzed</p>
<p>0% -- 25% free space blocks.............0</p>
<p>0% -- 25% free space bytes..............0</p>
<p>25% -- 50% free space blocks............1</p>
<p>25% -- 50% free space bytes.............8192</p>
<p>50% -- 75% free space blocks............3</p>
<p>50% -- 75% free space bytes.............24576</p>
<p>75% -- 100% free space blocks...........1</p>
<p>75% -- 100% free space bytes............8192</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Total Blocks............................0</p>
<p>Total bytes.............................0</p>
<p>&nbsp;</p>
<p>我们可以看到目前这四个block的空间使用状况，AAAAEc，AAAAEd，AAAAEf，AAAAEg上各有一行数据，我们猜测free space为50-75%的3个block是这三个block，那么free space为25-50%的1个block就是AAAAEg了，剩下free space为 75-100% 的3个block，是HWM下已格式化的尚未使用的block。（在extent不大于于16个block时，是以一个extent为单位来移动的） </p>
<p>&nbsp;</p>
<p>然后，我们对table my_objects执行shtink的操作： </p>
<p>SQL&gt; alter table test_hwm enable row movement; </p>
<p>Table altered </p>
<p>SQL&gt; alter table test_hwm shrink space; </p>
<p>Table altered </p>
<p>SQL&gt; select rowid ,id,name from TEST_HWM; </p>
<p>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME</p>
<p>------------------ ---------- ------------</p>
<p>AAANMEAAIAAAAEcAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 es</p>
<p>AAANMEAAIAAAAEcAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 dss</p>
<p>AAANMEAAIAAAAEcAAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 aa</p>
<p>AAANMEAAIAAAAEcAAE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 es</p>
<p>AAANMEAAIAAAAEdAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 dss</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 21:00:49 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; EXTENT_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RELATIVE_FNO,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_extents</p>
<p>&nbsp;WHERE&nbsp;&nbsp; segment_name = 'TEST_HWM';</p>
<p>&nbsp;</p>
<p>&nbsp;EXTENT_ID&nbsp;&nbsp;&nbsp; FILE_ID RELATIVE_FNO&nbsp;&nbsp; BLOCK_ID&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>---------- ---------- ------------ ---------- ----------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 281&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8</p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>当执行了shrink操作后，有意思的现象出现了。我们来看看oracle是如何移动行数据的，这里的情况和move已经不太一样了。我们知道，在move操作的时候，所有行的rowid都发生了变化，table所位于的block的区域也发生了变化，但是所有行物理存储的顺序都没有发生变化，所以我们得到的结论是，oracle以block为单位，进行了block间的数据copy。那么shrink后，我们发现，部分行数据的rowid发生了变化，同时，部分行数据的物理存储的顺序也发生了变化，而table所位于的block的区域却没有变化，这就说明，shrink只移动了table其中一部分的行数据，来完成释放空间，而且，这个过程是在table当前所使用的block中完成的。 </p>
<p>&nbsp;</p>
<p>那么Oracle具体移动行数据的过程是怎样的呢？我们根据这样的实验结果，可以来猜测一下： </p>
<p>Oracle是以行为单位来移动数据的。Oracle从当前table存储的最后一行数据开始移动，从当前table最先使用的block开始搜索空间，所以，shrink之前，rownum＝10的那行数据（10,es），被移动到block AAAAEc上，写到（1,aa）这行数据的后面，所以（10,es）的rownum和rowid同时发生改变。然后是（9,es）这行数据，重复上述过程。这是oracle从后向前移动行数据的大致遵循的规则，那么具体移动行数据的的算法是比较复杂的，包括向ASSM的table中insert数据使用block的顺序的算法也是比较复杂的，大家有兴趣的可以自己来研究，在这里我们不多做讨论。 </p>
<p>&nbsp;</p>
<p>在shrink table的同时shrink这个table上的index： </p>
<p>alter table my_objects shrink space cascade; </p>
<p>同样地，这个操作只有当table上的index也是ASSM时，才能使用。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Move 和 Shrink 产生日志的对比</p>
<p>我们对比了同样数据量和分布状况的两张table，在move和shrink下生成的redo size（table上没有index的情况下）： </p>
<p>/* Formatted on 2009-12-7 21:20:43 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; tablespace_name, SEGMENT_SPACE_MANAGEMENT</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_tablespaces</p>
<p>&nbsp;WHERE&nbsp;&nbsp; tablespace_name IN ('ASSM', 'HWM');</p>
<p>&nbsp;</p>
<p>TABLESPACE_NAME&nbsp;&nbsp; SEGMENT_SPACE_MANAGEMENT </p>
<p>------------------------------&nbsp; ------------------------ </p>
<p>ASSM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AUTO </p>
<p>HWM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MANUAL </p>
<p>SQL&gt; create table my_objects tablespace ASSM as select * from all_objects where rownum&lt;20000; </p>
<p>Table created </p>
<p>SQL&gt; create table my_objects1 tablespace HWM as select * from all_objects where rownum&lt;20000; </p>
<p>Table created </p>
<p>SQL&gt; select bytes/1024/1024 from user_segments where segment_name = 'MY_OBJECTS'; </p>
<p>BYTES/1024/1024 </p>
<p>--------------- </p>
<p>2.1875 </p>
<p>SQL&gt; delete from my_objects where object_name like '%C%'; </p>
<p>7278 rows deleted </p>
<p>SQL&gt; delete from my_objects1 where object_name like '%C%'; </p>
<p>7278 rows deleted </p>
<p>SQL&gt; delete from my_objects where object_name like '%U%'; </p>
<p>2732 rows deleted </p>
<p>SQL&gt; delete from my_objects1 where object_name like '%U%'; </p>
<p>2732 rows deleted </p>
<p>SQL&gt; commit; </p>
<p>Commit complete </p>
<p>SQL&gt; alter table my_objects enable row movement; </p>
<p>Table altered </p>
<p>/* Formatted on 2009-12-7 21:21:48 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; VALUE</p>
<p>&nbsp; FROM&nbsp;&nbsp; v$mystat, v$statname</p>
<p>&nbsp;WHERE&nbsp;&nbsp; v$mystat.statistic# = v$statname.statistic#</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND v$statname.name = 'redo size';</p>
<p>VALUE </p>
<p>---------- </p>
<p>27808792 </p>
<p>SQL&gt; alter table my_objects shrink space; </p>
<p>Table altered </p>
<p>SQL&gt;SELECT&nbsp;&nbsp; VALUE</p>
<p>&nbsp; FROM&nbsp;&nbsp; v$mystat, v$statname</p>
<p>&nbsp;WHERE&nbsp;&nbsp; v$mystat.statistic# = v$statname.statistic#</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND v$statname.name = 'redo size';</p>
<p>VALUE </p>
<p>---------- </p>
<p>32579712 </p>
<p>SQL&gt; alter table my_objects1 move; </p>
<p>Table altered </p>
<p>SQL&gt;SELECT&nbsp;&nbsp; VALUE</p>
<p>&nbsp; FROM&nbsp;&nbsp; v$mystat, v$statname</p>
<p>&nbsp;WHERE&nbsp;&nbsp; v$mystat.statistic# = v$statname.statistic#</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND v$statname.name = 'redo size';</p>
<p>VALUE </p>
<p>---------- </p>
<p>32676784 </p>
<p>对于table my_objects，进行shrink，产生了32579712 &#8211; 27808792=4770920，约4.5M的redo ；对table my_objects1进行move，产生了32676784-32579712= 97072,约95K的redo size。</p>
<p>&nbsp;</p>
<p>结论：与move比较起来，shrink的日志写要大得多。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Shrink的几点问题： </p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shrink后index是否需要rebuild： </p>
<p>&nbsp;</p>
<p>因为shrink的操作也会改变行数据的rowid，那么，如果table上有index时，shrink table后index会不会变为UNUSABLE呢？</p>
<p>我们来看这样的实验，同样构建my_objects的测试表： </p>
<p>create table my_objects tablespace ASSM as select * from all_objects where rownum&lt;20000; </p>
<p>create index i_my_objects on my_objects (object_id); </p>
<p>delete from my_objects where object_name like '%C%'; </p>
<p>delete from my_objects where object_name like '%U%'; </p>
<p>现在我们来shrink table my_objects： </p>
<p>SQL&gt; alter table my_objects enable row movement; </p>
<p>Table altered </p>
<p>SQL&gt; alter table my_objects shrink space; </p>
<p>Table altered </p>
<p>SQL&gt; select index_name,status from user_indexes where index_name='I_MY_OBJECTS'; </p>
<p>INDEX_NAME STATUS </p>
<p>------------------------------ -------- </p>
<p>I_MY_OBJECTS VALID </p>
<p>我们发现，table my_objects上的index的状态为VALID，估计shrink在移动行数据时，也一起维护了index上相应行的数据rowid的信息。我们认为，这是对于move操作后需要rebuild index的改进。但是如果一个table上的index数量较多，我们知道，维护index的成本是比较高的，shrink过程中用来维护index的成本也会比较高。 </p>
<p>&nbsp;</p>
<p>2. shrink时对table的lock </p>
<p>在对table进行shrink时，会对table进行怎样的锁定呢？当我们对table MY_OBJECTS进行shrink操作时，查询v$locked_objects视图可以发现，table MY_OBJECTS上加了row-X (SX) 的lock： </p>
<p>SQL&gt;select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects; </p>
<p>OBJECT_ID SESSION_ID ORACLE_USERNAME LOCKED_MODE </p>
<p>---------- ---------- ------------------ ----------- </p>
<p>55422 153 DLINGER 3 </p>
<p>SQL&gt; select object_id from user_objects where object_name = 'MY_OBJECTS'; </p>
<p>OBJECT_ID </p>
<p>---------- </p>
<p>55422 </p>
<p>那么，当table在进行shrink时，我们对table是可以进行DML操作的。 </p>
<p>&nbsp;</p>
<p>3． shrink对空间的要求 </p>
<p>我们在前面讨论了shrink的数据的移动机制，既然oracle是从后向前移动行数据，那么，shrink的操作就不会像move一样，shrink不需要使用额外的空闲空间。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/tianlesoftware/archive/2009/11/04/4764254.aspx</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/348337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-15 10:57 <a href="http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORA-01122: 数据库文件 1 验证失败</title><link>http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 15 Apr 2011 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/348336.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/348336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/348336.html</trackback:ping><description><![CDATA[<p>转自:http://blog.csdn.net/rein07/archive/2010/11/25/6033937.aspx<br />
</p>
<p>1.SQL&gt;shutdown abort 如果数据库是打开状态，强行关闭</p>
<p>2.SQL&gt;sqlplus / as sysdba</p>
<p>3.SQL&gt;startup<br />
ORACLE 例程已经启动。</p>
<p>Total System Global Area 293601280 bytes<br />
Fixed Size 1248624 bytes<br />
Variable Size 121635472 bytes<br />
Database Buffers 167772160 bytes<br />
Redo Buffers 2945024 bytes<br />
数据库装载完毕。<br />
ORA-01122: 数据库文件 1 验证失败<br />
ORA-01110: 数据文件 1:<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\SYSTEM01.DBF'<br />
ORA-01207: 文件比控制文件更新 - 旧的控制文件</p>
<p>4.SQL&gt;alter database backup controlfile to trace as 'f:\aa';<br />
数据库已更改。</p>
<p>5.SQL&gt;shutdown immediate 如果数据库是打开状态，则关闭<br />
ORA-01109: 数据库未打开<br />
已经卸载数据库</p>
<p>6.SQL&gt;startup nomount;<br />
ORACLE 例程已经启动。<br />
Total System Global Area 105979576 bytes<br />
Fixed Size 454328 bytes<br />
Variable Size 79691776 bytes<br />
Database Buffers 25165824 bytes<br />
Redo Buffers 667648 bytes</p>
<p>7.Editplus之类的编辑器打开在第四步生成的f:\aa文件；<br />
其实在这个文件中的已经告诉你咋样恢复你的数据库了，找到STARTUP NOMOUNT字样，然后下面可以看到类似语句，这个文件有好几个类似的生成控制文件语句，主要针对不懂的环境执行不同的语句，象我的数据库没有做任何备份，也不是在归档模式，就执行这句<br />
CREATE CONTROLFILE REUSE DATABASE "ORCLDW" NORESETLOGS NOARCHIVELOG<br />
MAXLOGFILES 16<br />
MAXLOGMEMBERS 3<br />
MAXDATAFILES 100<br />
MAXINSTANCES 8<br />
MAXLOGHISTORY 292<br />
LOGFILE<br />
GROUP 1 'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\REDO01.LOG' SIZE 50M,<br />
GROUP 2 'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\REDO02.LOG' SIZE 50M,<br />
GROUP 3 'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\REDO03.LOG' SIZE 50M<br />
DATAFILE<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\SYSTEM01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\UNDOTBS01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\SYSAUX01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\USERS01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\EXAMPLE01.DBF'<br />
CHARACTER SET ZHS16GBK<br />
;<br />
执行上面这段语句，这个语句重建控制文件,然后你可以看着f:\aa文件完成下面的恢复工作了，</p>
<p>8.SQL&gt;RECOVER DATABASE （恢复指定表空间、数据文件或整个数据库）</p>
<p>9.SQL&gt;ALTER DATABASE OPEN 打开数据库</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/rein07/archive/2010/11/25/6033937.aspx</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/348336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-15 10:56 <a href="http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引用 Oracle:Rank,Dense_Rank,Row_Number比较</title><link>http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sun, 03 Apr 2011 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/347593.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/347593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/347593.html</trackback:ping><description><![CDATA[<p><em>引用</em></p>
<blockquote><a href="http://trailblizer.blog.163.com/" target="_blank">trailblizer</a> 的 <a href="http://trailblizer.blog.163.com/blog/static/59630364200982792143361" target="_blank">Oracle:Rank,Dense_Rank,Row_Number比较</a><br />
<p style="text-indent: 2em">Oracle:Rank,Dense_Rank,Row_Number比较</p>
<p style="text-indent: 2em">一个员工信息表</p>
<p style="text-indent: 2em">Create Table EmployeeInfo (CO<wbr>DE Number(3) Not Null,EmployeeName varchar2(15),DepartmentID Number(3),Salary NUMBER(7,2),</p>
<p style="text-indent: 2em">Constraint PK_EmployeeInfo Primary Key (CO<wbr>DE));</p>
<p style="text-indent: 2em">Select * From EMPLOYEEINFO</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/MVFSxEwAAAQTocQskYv8Ow==/593349250906589044.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/MVFSxEwAAAQTocQskYv8Ow==/593349250906589044.jpg" border="0" __1301838278468__="ev_9000324519" /></a></p>
<p style="text-indent: 2em">现执行SQL语句：</p>
<p style="text-indent: 2em">Select EMPLOYEENAME,SALARY, </p>
<p style="text-indent: 2em">RANK() OVER (Order By SALARY Desc)&nbsp; "RANK",</p>
<p style="text-indent: 2em">DENSE_RANK() OVER (Order By SALARY Desc ) "DENSE_RANK",</p>
<p style="text-indent: 2em">ROW_NUMBER() OVER(Order By SALARY Desc) "ROW_NUMBER"</p>
<p style="text-indent: 2em">&nbsp;From EMPLOYEEINFO </p>
<p style="text-indent: 2em">结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/hEt7rBa-A9uP0VCTwpWELg==/4261531147400411727.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/hEt7rBa-A9uP0VCTwpWELg==/4261531147400411727.jpg" border="0" __1301838278468__="ev_9684341031" /></a></p>
<p style="text-indent: 2em">Rank，Dense_rank，Row_number函数为每条记录产生一个从1开始至N的自然数，N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略。 </p>
<p style="text-indent: 2em">①ROW_NUMBER： </p>
<p style="text-indent: 2em">Row_number函数返回一个唯一的值，当碰到相同数据时，排名按照记录集中记录的顺序依次递增。 </p>
<p style="text-indent: 2em">②DENSE_RANK： </p>
<p style="text-indent: 2em">Dense_rank函数返回一个唯一的值，除非当碰到相同数据时，此时所有相同数据的排名都是一样的。 </p>
<p style="text-indent: 2em">③RANK： </p>
<p style="text-indent: 2em">Rank函数返回一个唯一的值，除非遇到相同的数据时，此时所有相同数据的排名是一样的，同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。 </p>
<p style="text-indent: 2em">同时也可以分组排序,也就是在Over从句内加入Partition by groupField：</p>
<p style="text-indent: 2em">&nbsp;Select DEPARTMENTID,EMPLOYEENAME,SALARY, </p>
<p style="text-indent: 2em">RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc)&nbsp; "RANK",</p>
<p style="text-indent: 2em">DENSE_RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc ) "DENSE_RANK",</p>
<p style="text-indent: 2em">ROW_NUMBER() OVER( Partition By DEPARTMENTID Order By SALARY Desc) "ROW_NUMBER"</p>
<p style="text-indent: 2em">&nbsp;From EMPLOYEEINFO </p>
<p style="text-indent: 2em">结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/Wz7ISGDMkbKUAeJOVPpAxw==/4288834220141338023.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/Wz7ISGDMkbKUAeJOVPpAxw==/4288834220141338023.jpg" border="0" __1301838278468__="ev_8505889234" /></a></p>
<p style="text-indent: 2em">现在如果插入一条工资为空的记录，那么执行上述语句，结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/b4NZ-uK_V804SZqrgbGDgA==/3112550292467384108.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/b4NZ-uK_V804SZqrgbGDgA==/3112550292467384108.jpg" border="0" __1301838278468__="ev_7365063231" /></a></p>
<p style="text-indent: 2em">会发现空值的竟然排在了第一位，这显然不是想要的结果。解决的办法是在Over从句Order&nbsp;By后加上 NULLS Last即：</p>
<p style="text-indent: 2em">Select EMPLOYEENAME,SALARY, </p>
<p style="text-indent: 2em">RANK() OVER (Order By SALARY Desc&nbsp; Nulls Last)&nbsp; "RANK",</p>
<p style="text-indent: 2em">DENSE_RANK() OVER (Order By SALARY Desc Nulls Last) "DENSE_RANK",</p>
<p style="text-indent: 2em">ROW_NUMBER() OVER(Order By SALARY Desc Nulls Last ) "ROW_NUMBER"</p>
<p style="text-indent: 2em">&nbsp;From EMPLOYEEINFO </p>
<p style="text-indent: 2em">结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/XK5Ycwg9lh1H-yS3E7MJXA==/1691101660078250243.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/XK5Ycwg9lh1H-yS3E7MJXA==/1691101660078250243.jpg" border="0" __1301838278468__="ev_2023154627" /></a></p>
</blockquote>
<img src ="http://www.blogjava.net/xzclog/aggbug/347593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-03 21:46 <a href="http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Sql Loader中文字符导入乱码的解决方案</title><link>http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 08 Mar 2011 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/345955.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/345955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/345955.html</trackback:ping><description><![CDATA[<p>Oracle Sql Loader中文字符导入乱码的解决方案<br />
服务器端字符集NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK</p>
<p>控制文件ctl:<br />
LOAD DATA<br />
<span style="color: red">CHARACTERSET ZHS16GBK<br />
</span>INFILE 'c:\testfile.txt'<br />
id name desc </p>
<p>FIELDS TERMINATED BY ","<br />
(id,name ,desc )</p>
<p>导入成功</p>
<p>其中c:\testfile.txt文件中有中文，在将此文件导入到oracle数据库中时，需要设置字符集CHARACTERSET ZHS16GBK<br />
&nbsp;<br />
（1）查看服务器端字符集 <br />
通过客户端或服务器端的sql*plus登录ORACLE的一个合法用户，执行下列SQL语句： <br />
SQL &gt; <span style="color: red">select * from V$NLS_PARAMETERS </span><br />
------------------------<br />
（2）控制文件ctl:<br />
LOAD DATA<br />
<span style="color: red">CHARACTERSET ZHS16GBK<br />
</span>INFILE '/inffile/vac/subs-vac.csv'<br />
TRUNCATE<br />
INTO TABLE INF_VAC_SUBS_PRODUCT<br />
FIELDS TERMINATED BY ',' <span style="color: red">OPTIONALLY ENCLOSED BY '"'<br />
</span>TRAILING NULLCOLS<br />
(<br />
USER_NUMBER,<br />
PRODUCT_ID,<br />
EFFECTIVE_DATE <span style="color: red">DATE "YYYY/MM/DD HH24:MI:SS",<br />
</span>EXPIRATION_DATE DATE "YYYY/MM/DD HH24:MI:SS"<br />
)<br />
</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/345955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-03-08 17:20 <a href="http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle,sql loader 及 快速生成大量数据 CSV文件sqlldr</title><link>http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 08 Mar 2011 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/345953.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/345953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/345953.html</trackback:ping><description><![CDATA[<strong>文章分类:<a style="padding-right: 10px; text-decoration: none" href="http://www.javaeye.com/blogs/category/database">数据库</a></strong>
<div class="blog_content">
<p>要测试sql loader 以及快速产生大量测试数据</p>
<p>生成大量测试数据思路。</p>
<p>&nbsp; 一，用plsql developer 生成csv 文件</p>
<p>&nbsp; 二，用&gt;&gt;输出重定向，追加到一个cvs 文件里。</p>
<p>&nbsp; 三，再用sql loader 快速载入。</p>
<p>&nbsp;</p>
<p>在plsql developer 执行</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span class="keyword">SELECT</span><span>&nbsp;object_id,object_name&nbsp;</span><span class="keyword">FROM</span><span>&nbsp;dba_objects;&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="sql" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="0" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">SELECT object_id,object_name FROM dba_objects;</pre>
<p>&nbsp;</p>
<p>右键plsql developer 导出csv 格式 1.csv。在linux 上执行下面的脚本</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">C代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-cpp">
    <li><span><span class="preprocessor">#!/bin/bash </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="keyword">for</span><span>((i=1;i&lt;200;i=i+1)) &nbsp;&nbsp;</span></span>
    <li><span class="keyword">do</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;1.csv&nbsp;&gt;&gt;&nbsp;2.csv; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$i; &nbsp;&nbsp;</span>
    <li><span>done&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="c" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="1" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">#!/bin/bash
for((i=1;i&lt;200;i=i+1))
do
cat 1.csv &gt;&gt; 2.csv;
echo $i;
done</pre>
<p>&nbsp;这样 50000&nbsp; *&nbsp; 200 差不到就有一千万的数据了。我测试的&nbsp; 11047500&nbsp; 392M</p>
<p>&nbsp;可以用:</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Linux代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>wc&nbsp;-l&nbsp;</span><span class="number">2</span><span>.csv&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="linux" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="2" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">wc -l 2.csv</pre>
<p>&nbsp;</p>
<p>查看csv 里有多少条数据。现在测试数据有了。我们来试一下sql loader 的载入效果吧。</p>
<p>创建sqlloader 控制文件如下,保存为1.ctl</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sqlldr ctl代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>load&nbsp;data &nbsp;&nbsp;</span></span>
    <li><span>infile&nbsp;</span><span class="string">'2.csv'</span><span>&nbsp;&nbsp;</span></span>
    <li><span>into&nbsp;table&nbsp;my_objects &nbsp;&nbsp;</span>
    <li style="color: red"><span>fields&nbsp;terminated&nbsp;by&nbsp;</span><span class="string">','</span><span>optionally&nbsp;enclosed&nbsp;by&nbsp;</span><span class="string">'"'</span><span>&nbsp;&nbsp;</span></span>
    <li><span>(object_id, &nbsp;&nbsp;</span>
    <li><span>object_name &nbsp;&nbsp;</span>
    <li><span>);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="sqlldr ctl" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="3" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">load data
infile '2.csv'
into table my_objects
fields terminated by ','optionally enclosed by '"'
(object_id,
object_name
);</pre>
<p>&nbsp;</p>
<p>控制文件简要说明：</p>
<p>-- INFILE 'n.csv'&nbsp; &nbsp;导入多个文件&nbsp; <br />
-- INFILE *&nbsp; 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容</p>
<p>--BADFILE '1.bad'&nbsp; &nbsp;指定坏文件地址&nbsp; </p>
<p>--apend into table my_objects 追加<br />
-- INSERT&nbsp; 装载空表 如果原先的表有数据 sqlloader会停止 默认值&nbsp; <br />
-- REPLACE&nbsp; &nbsp;原先的表有数据 原先的数据会全部删除&nbsp; <br />
-- TRUNCATE&nbsp; 指定的内容和replace的相同 会用truncate语句删除现存数据&nbsp; </p>
<p>--可以指定位置加载<br />
--(object_id position(1:3) char,object_name position(5:7) char)<br />
--分别指定分隔符<br />
--(object_id char terminated by ",", object_name char terminated by ",")<br />
--执行sqlldr userid=scott/a123 control=1.ctl log=1.out direct=true<br />
--30秒可以载入200万的测试数据 79MB</p>
<p><br />
--sqlldr userid＝/ control＝result1.ctl direct＝true parallel＝true<br />
--sqlldr userid＝/ control＝result2.ctl direct＝true parallel＝true<br />
--sqlldr userid＝/ control＝result2.ctl direct＝true parallel＝true<br />
--当加载大量数据时（大约超过10GB），最好抑制日志的产生：<br />
--SQLALTER TABLE RESULTXT nologging;<br />
--这样不产生REDO　LOG，可以提高效率。然后在CONTROL文件中load data上面加一行：unrecoverable <br />
--此选项必须要与DIRECT共同应用。<br />
--在并发操作时，ORACLE声称可以达到每小时处理100GB数据的能力！其实，估计能到1－10G就算不错了，开始可用结构<br />
--相同的文件，但只有少量数据，成功后开始加载大量数据，这样可以避免时间的浪费</p>
<p>&nbsp;</p>
<p>下面就是执行了</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>sqlldr&nbsp;userid=scott/a123&nbsp;control=</span><span class="number">1</span><span>.ctl&nbsp;log=</span><span class="number">1</span><span>.out&nbsp;direct=true&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="shell" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="4" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">sqlldr userid=scott/a123 control=1.ctl log=1.out direct=true</pre>
<p>&nbsp;结果：30秒可以载入200万的测试数据 79MB<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 226秒载入1100万的测试数据 392Mb</p>
<p>&nbsp;</p>
<p>我的环境是在虚拟机，测得的结果</p>
<p>MemTotal:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 949948 kB</p>
<p>model name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Intel(R) Pentium(R) D CPU 2.80GHz<br />
stepping&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 8<br />
cpu MHz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2799.560<br />
cache size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 1024 KB</p>
<p>&nbsp;</p>
<p>还是挺快的：）</p>
</div>
 <img src ="http://www.blogjava.net/xzclog/aggbug/345953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-03-08 16:47 <a href="http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 重启与关闭</title><link>http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 04 Jan 2011 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/342262.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/342262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/342262.html</trackback:ping><description><![CDATA[<span>&nbsp;
<p style="text-indent: 2em">Oracle中不同启动和关闭方式的区别</p>
<p style="text-indent: 2em">Oracle数据库提供了几种不同的数据库启动和关闭方式，本文将周详介绍这些启动和关闭方式之间的区别连同他们各自不同的功能。</p>
<p style="text-indent: 2em">一、启动和关闭Oracle数据库</p>
<p style="text-indent: 2em">对于大多数Oracle DBA来说，启动和关闭Oracle数据库最常用的方式就是在命令行方式下的Server Manager。从Oracle 8i以后，系统将Server Manager的任何功能都集中到了SQL*Plus中，也就是说从8i以后对于数据库的启动和关闭能够直接通过SQL*Plus来完成，而不再另外需要Server Manager，但系统为了保持向下兼容，依旧保留了Server Manager工具。另外也可通过图像用户工具（GUI）的Oracle Enterprise Manager来完成系统的启动和关闭，图像用户界面Instance Manager很简单，这里不再详述。</p>
<p style="text-indent: 2em">要启动和关闭数据库，必须要以具备Oracle 管理员权限的用户登陆，通常也就是以具备SYSDBA权限的用户登陆。一般我们常用INTERNAL用户来启动和关闭数据库（INTERNAL用户实际上是SYS用户以SYSDBA连接的同义词）。Oracle数据库的新版本将逐步淘汰INTERNAL这个内部用户，所以我们最好还是配置DBA用户具备SYSDBA权限。</p>
<p style="text-indent: 2em">二、数据库的启动（STARTUP）</p>
<p style="text-indent: 2em">启动一个数据库需要三个步骤：</p>
<p style="text-indent: 2em">1、 创建一个Oracle实例（非安装阶段）</p>
<p style="text-indent: 2em">2、 由实例安装数据库（安装阶段）</p>
<p style="text-indent: 2em">3、 打开数据库（打开阶段）</p>
<p style="text-indent: 2em">在Startup命令中，能够通过不同的选项来控制数据库的不同启动步骤。</p>
<p style="text-indent: 2em">1、STARTUP NOMOUNT</p>
<p style="text-indent: 2em">NOMOUNT选项仅仅创建一个Oracle实例。读取init.ora初始化参数文档、启动后台进程、初始化系统全局区（SGA）。Init.ora文档定义了实例的配置，包括内存结构的大小和启动后台进程的数量和类型等。实例名根据Oracle_SID配置，不一定要和打开的数据库名称相同。当实例打开后，系统将显示一个SGA内存结构和大小的列表，如下所示：</p>
<p style="text-indent: 2em">SQL&gt; startup nomount</p>
<p style="text-indent: 2em">ORACLE 例程已启动。</p>
<p style="text-indent: 2em">Total System Global Area 35431692 bytes</p>
<p style="text-indent: 2em">Fixed Size 70924 bytes</p>
<p style="text-indent: 2em">Variable Size 18505728 bytes</p>
<p style="text-indent: 2em">Database Buffers 16777216 bytes</p>
<p style="text-indent: 2em">Redo Buffers 77824 bytes</p>
<p style="text-indent: 2em">2、STARTUP MOUNT</p>
<p style="text-indent: 2em">该命令创建实例并且安装数据库，但没有打开数据库。Oracle系统读取控制文档中关于数据文档和重作日志文档的内容，但并不打开该文档。这种打开方式常在数据库维护操作中使用，如对数据文档的更名、改变重作日志连同打开归档方式等。在这种打开方式下，除了能够看到SGA系统列表以外，系统还会给出"数据库装载完毕"的提示。</p>
<p style="text-indent: 2em">3、STARTUP</p>
<p style="text-indent: 2em">该命令完成创建实例、安装实例和打开数据库的任何三个步骤。此时数据库使数据文档和重作日志文档在线，通常还会请求一个或是多个回滚段。这时系统除了能够看到前面Startup Mount方式下的任何提示外，还会给出一个"数据库已打开"的提示。此时，数据库系统处于正常工作状态，能够接受用户请求。</p>
<p style="text-indent: 2em">假如采用STARTUP NOMOUNT或是STARTUP MOUNT的数据库打开命令方式，必须采用ALTER DATABASE命令来执行打开数据库的操作。例如，假如您以STARTUP NOMOUNT方式打开数据库，也就是说实例已创建，但是数据库没有安装和打开。这是必须运行下面的两条命令，数据库才能正确启动。</p>
<p style="text-indent: 2em">ALTER DATABASE MOUNT;</p>
<p style="text-indent: 2em">ALTER DATABASE OPEN;</p>
<p style="text-indent: 2em">而假如以STARTUP MOUNT方式启动数据库，只需要运行下面一条命令即能够打开数据库：</p>
<p style="text-indent: 2em">ALTER DATABASE OPEN.</p>
<p style="text-indent: 2em">4、其他打开方式</p>
<p style="text-indent: 2em">除了前面介绍的三种数据库打开方式选项外，更有另外其他的一些选项。</p>
<p style="text-indent: 2em">(1) STARTUP RESTRICT</p>
<p style="text-indent: 2em">这种方式下，数据库将被成功打开，但仅仅允许一些特权用户（具备DBA角色的用户）才能够使用数据库。这种方式常用来对数据库进行维护，如数据的导入/导出操作时不希望有其他用户连接到数据库操作数据。</p>
<p style="text-indent: 2em">(2) STARTUP FORCE</p>
<p style="text-indent: 2em">该命令其实是强行关闭数据库（shutdown abort）和启动数据库（startup）两条命令的一个综合。该命令仅在关闭数据库碰到问题不能关闭数据库时采用。</p>
<p style="text-indent: 2em">(3) ALTER DATABASE OPEN READ ONLY;</p>
<p style="text-indent: 2em">该命令在创建实例连同安装数据库后，以只读方式打开数据库。对于那些仅仅提供查询功能的产品数据库能够采用这种方式打开。</p>
<p style="text-indent: 2em">三、数据库的关闭（SHUTDOWN）</p>
<p style="text-indent: 2em">对于数据库的关闭，有四种不同的关闭选项，下面对其进行一一介绍。</p>
<p style="text-indent: 2em">1、SHUTDOWN NORMAL</p>
<p style="text-indent: 2em">这是数据库关闭SHUTDOWN命令的确省选项。也就是说假如您发出SHUTDOWN这样的命令，也即是SHUTDOWN NORNAL的意思。</p>
<p style="text-indent: 2em">发出该命令后，任何新的连接都将再不允许连接到数据库。在数据库关闭之前，Oracle将等待现在连接的任何用户都从数据库中退出后才开始关闭数据库。采用这种方式关闭数据库，在下一次启动时无需进行任何的实例恢复。但需要注意一点的是，采用这种方式，也许关闭一个数据库需要几天时间，也许更长。</p>
<p style="text-indent: 2em">2、SHUTDOWN IMMEDIATE</p>
<p style="text-indent: 2em">这是我们常用的一种关闭数据库的方式，想很快地关闭数据库，但又想让数据库干净的关闭，常采用这种方式。</p>
<p style="text-indent: 2em">当前正在被Oracle处理的SQL语句立即中断，系统中任何没有提交的事务全部回滚。假如系统中存在一个很长的未提交的事务，采用这种方式关闭数据库也需要一段时间（该事务回滚时间）。系统不等待连接到数据库的任何用户退出系统，强行回滚当前任何的活动事务，然后断开任何的连接用户。</p>
<p style="text-indent: 2em">3、SHUTDOWN TRANSACTIONAL</p>
<p style="text-indent: 2em">该选项仅在Oracle 8i后才能够使用。该命令常用来计划关闭数据库，他使当前连接到系统且正在活动的事务执行完毕，运行该命令后，任何新的连接和事务都是不允许的。在任何活动的事务完成后，数据库将和SHUTDOWN IMMEDIATE同样的方式关闭数据库。</p>
<p style="text-indent: 2em">4、SHUTDOWN ABORT</p>
<p style="text-indent: 2em">这是关闭数据库的最后一招，也是在没有任何办法关闭数据库的情况下才不得不采用的方式，一般不要采用。假如下列情况出现时能够考虑采用这种方式关闭数据库。</p>
<p style="text-indent: 2em">1、 数据库处于一种非正常工作状态，不能用shutdown normal或shutdown immediate这样的命令关闭数据库;</p>
<p style="text-indent: 2em">2、 需要立即关闭数据库；</p>
<p style="text-indent: 2em">3、 在启动数据库实例时碰到问题；</p>
<p style="text-indent: 2em">任何正在运行的SQL语句都将立即中止。任何未提交的事务将不回滚。Oracle也不等待现在连接到数据库的用户退出系统。下一次启动数据库时需要实例恢复，因此，下一次启动可能比平时需要更多的时间。</p>
<p style="text-indent: 2em">表1能够清楚地看到上述四种不同关闭数据库的区别和联系。</p>
<p style="text-indent: 2em">　　　　　　　　　关闭方式 A I T N</p>
<p style="text-indent: 2em">允许新的连接 &#215; &#215; &#215; &#215;</p>
<p style="text-indent: 2em">等待直到当前会话中止 &#215; &#215; &#215; &#8730;</p>
<p style="text-indent: 2em">等待直到当前事务中止 &#215; &#215; &#8730; &#8730;</p>
<p style="text-indent: 2em">强制CheckPoint，关闭任何文档 &#215; &#8730; &#8730; &#8730;</p>
<p style="text-indent: 2em">其中：A-Abort I-Immediate T-Transaction N-Nornal</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">pl/sql developer的Commander Windows下执行shutdown命令报&#8220;ORA-00900: 无效 SQL 语句&#8221;，</p>
<p style="text-indent: 2em">但在服务器本地sqlplus下却可以执行关闭数据库命令，PL/SQL DEVELOPER只支持部分的sql*plus命令？</p>
<p style="text-indent: 2em">另外在数据库unmount(instance 已经启动)的情况下，PL/SQL DEVELOPER无法连接上，</p>
<p style="text-indent: 2em">报&#8220;ORA-12528: TNS:监听程序:所有适用例程都无法建立新连接&#8221;。</p>
<p style="text-indent: 2em">在instance已经启动但数据库还没mount的情况下PL/SQL DEVELOPER等客户端都无法连接到实例上</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">如何查看Oracle当前数据库实例名</p>
<p style="text-indent: 2em">数据库实例名在编程的很多地方都需要用到，配置数据库的jdbc:oracle:thin:@192.168.2.1:1521:WW ,还有sqlPlus的连接字符串中也需要用到 conn <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#87;&#87;"><font color="#294a09">sys/password@WW</font></a> as sysdba; 如何查看当前数据库实例名呢?方式有三：</p>
<p style="text-indent: 2em">　　&#183;使用SQL语句：select instance_name from v$instance;</p>
<p style="text-indent: 2em">　　&#183;使用show命令：show parameter instance</p>
<p style="text-indent: 2em">　　&#183;查看参数文件：查看init.ora文件</p>
</span>
<img src ="http://www.blogjava.net/xzclog/aggbug/342262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-01-04 10:32 <a href="http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速掌握重启Oracle数据库的操作步骤</title><link>http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 04 Jan 2011 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/342250.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/342250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/342250.html</trackback:ping><description><![CDATA[<div class="ciodigest"><strong>[摘要] </strong>在实际的应用中，有时候工作数据库需要重新启动。本文介绍了一个特别实用的操作步骤，希望对大家有所帮助。<br />
<strong></strong>[关键字] <a class="cyewunder" href="http://www.enet.com.cn/tech/inforcenter/search.jsp?keyword=Oracle&amp;ACondtion=keyword&amp;siteid=security" target="_blank">Oracle</a> <a class="cyewunder" href="http://www.enet.com.cn/tech/inforcenter/search.jsp?keyword=%D6%D8%C6%F4&amp;ACondtion=keyword&amp;siteid=security" target="_blank">重启</a> </div>
<div class="contenttxt">　　在实际的应用中，有时候工作数据库需要重新启动。本文介绍了一个特别实用的操作步骤，希望对大家有所帮助。 <br />
<br />
　　1. 停应用层的各种程序 <br />
<br />
　　2. 停Oralce的监听进程 <br />
<br />
　　$ lsnrctl stop <br />
<br />
　　3. 在独占的系统用户下，备份控制文件: <br />
<br />
　　$ sqlplus "/as sysdba" <br />
<br />
　　SQL&gt; alter database backup controlfile to trace; <br />
<br />
　　4. 在独占的系统用户下，手工切换重作日志文件，确保当前已修改过的数据存入文件: <br />
<br />
　　SQL&gt; alter system switch logfile; <br />
<br />
　　5. 在独占的系统用户下，运行下面SQL语句，生成杀数据库用户连接的kill_all_session.sql文件: <br />
<br />
　　SQL&gt; set head off; <br />
<br />
　　SQL&gt; set feedback off; <br />
<br />
　　SQL&gt; set newpage none; <br />
<br />
　　SQL&gt; spool ./kill_session.sql <br />
<br />
　　SQL&gt; select 'alter system kill session '''　　sid　　','　　serial#　　''';' from v$session where username is not null; <br />
<br />
　　SQL&gt; spool off; <br />
<br />
　　6. 在独占的系统用户下，执行杀数据库用户连接的kill_session.sql文件 <br />
<br />
　　SQL&gt; @./kill_session.sql <br />
<br />
　　7. 在独占的系统用户下，用immediate方式关闭数据库: <br />
<br />
　　SQL&gt; shutdown immediate; <br />
<br />
　　或者 <br />
<br />
　　SVRMGRL&gt; shutdown immediate; <br />
<br />
　　8. 启动oralce的监听进程 <br />
<br />
　　$ lsnrctl start <br />
<br />
　　9. 进入独占的系统用户下，启动Oralce数据库 <br />
<br />
　　$ sqlplus /nolog <br />
<br />
　　SQL&gt; connect / as sysdba <br />
<br />
　　SQL&gt; startup; <br />
<br />
　　或者 <br />
<br />
　　$ svrmgrl <br />
<br />
　　SVRMGRL&gt; connect internal; <br />
<br />
　　SVRMGRL&gt; startup; <br />
<br />
　　10.启动应用层的各种程序</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/342250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-01-04 10:10 <a href="http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ETL通用解决方案---oracle+存储过程 实现</title><link>http://www.blogjava.net/xzclog/archive/2010/12/31/342048.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 31 Dec 2010 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/12/31/342048.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/342048.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/12/31/342048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/342048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/342048.html</trackback:ping><description><![CDATA[转自：http://www.javaeye.com/topic/321719<br />
<h2>方案理念--四化理念</h2>
<p style="padding-left: 30px"></p>
<ol>
    <li>数据规格化
    <li>处理自动化
    <li>信息集中化
    <li>操作人性化 </li>
</ol>
<div><br />
</div>
<p>&nbsp;</p>
<h2>架构</h2>
<p style="padding-left: 30px">通过视图实现来至两个不同数据库的表的结构完全一致, &nbsp;在结构完全相同的两个表之间进行数据同步, 问题变得相当简单. 同步代码如下.</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&nbsp;</p>
<h2>ETL</h2>
<p style="padding-left: 30px"></p>
<p style="padding-left: 30px">---初始同步</p>
<p style="padding-left: 30px">delete from ods_table;</p>
<p style="padding-left: 30px">insert into v_table</p>
<p style="padding-left: 30px">select * from db_table;</p>
<p style="padding-left: 30px">commit;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">---新增同步</p>
<p style="padding-left: 30px">insert into v_table</p>
<p style="padding-left: 30px">select * from db_table t</p>
<p style="padding-left: 30px">where t.id not in (select id from v_table);</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">commit;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">---变更同步</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">update ods_table t</p>
<p style="padding-left: 30px">set t.c_number = (select db.c_number from db_table db where db.id = t.id)</p>
<p style="padding-left: 30px">where t.c_number != (select db.c_number from db_table db where db.id = t.id);</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">commit;</p>
<p>&nbsp;</p>
<h2>实现两个表结构完全一致的方法如下</h2>
<h2>---建表<br />
</h2>
<p>CREATE SEQUENCE SEQ_ETL_INCREASE_ID</p>
<p>INCREMENT BY 1</p>
<p>START WITH 1</p>
<p>&nbsp;&nbsp;NOCACHE;</p>
<p>&nbsp;</p>
<p>/*==============================================================*/</p>
<p>/* Table: ETL_TABLES &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</p>
<p>/*==============================================================*/</p>
<p>CREATE TABLE ETL_TABLES &nbsp;(</p>
<p>&nbsp;&nbsp; "ID" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT -1 NOT NULL,</p>
<p>&nbsp;&nbsp; "TABLE_NAME" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "TABLE_TYPE" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "TABLE_ROOT_IN" &nbsp; &nbsp; &nbsp;VARCHAR2(30),</p>
<p>&nbsp;&nbsp; "TABLE_NEED_CREATE_VIEW" NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; "TABLE_CREATE_VIEW_NAME_PREFIX" VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'v',</p>
<p>&nbsp;&nbsp; "DB_LINK_NAME" &nbsp; &nbsp; &nbsp; VARCHAR2(100),</p>
<p>&nbsp;&nbsp; "CURRENT_VERSION" &nbsp; &nbsp;NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VERSION_HISTORY" &nbsp; &nbsp;VARCHAR2(3000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'init input' NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_DATE" &nbsp; &nbsp; &nbsp; DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_BY" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_DATE" DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_BY" &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "MEMO" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(500),</p>
<p>&nbsp;&nbsp; "STATUS" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; CONSTRAINT PK_ETL_TABLES PRIMARY KEY ("ID")</p>
<p>);</p>
<p>&nbsp;</p>
<p>COMMENT ON TABLE ETL_TABLES IS</p>
<p>'此表用于维护ETL涉及到所有表, 包括:</p>
<p>1, db---业务系统数据库</p>
<p>2, ods---操作数据数据库</p>
<p>3, dw---数据仓库';</p>
<p>&nbsp;</p>
<p>/*==============================================================*/</p>
<p>/* Table: ETL_VIEWS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</p>
<p>/*==============================================================*/</p>
<p>CREATE TABLE ETL_VIEWS &nbsp;(</p>
<p>&nbsp;&nbsp; "ID" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT -1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_NAME" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_TYPE" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_ROOT_IN" &nbsp; &nbsp; &nbsp; VARCHAR2(30),</p>
<p>&nbsp;&nbsp; "VIEW_SELECT" &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(4000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_FROM" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(600) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_WHERE" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(2000),</p>
<p>&nbsp;&nbsp; "VIEW_ORDER_BY" &nbsp; &nbsp; &nbsp;VARCHAR2(600),</p>
<p>&nbsp;&nbsp; "VIEW_GROUP_BY" &nbsp; &nbsp; &nbsp;VARCHAR2(600),</p>
<p>&nbsp;&nbsp; "VIEW_HAVING" &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(600),</p>
<p>&nbsp;&nbsp; "VIEW_DB_LINK_NAME" &nbsp;VARCHAR2(100),</p>
<p>&nbsp;&nbsp; "CURRENT_VERSION" &nbsp; &nbsp;NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VERSION_HISTORY" &nbsp; &nbsp;VARCHAR2(3000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'init input' NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_DATE" &nbsp; &nbsp; &nbsp; DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_BY" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_DATE" DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_BY" &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "MEMO" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(500),</p>
<p>&nbsp;&nbsp; "STATUS" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; CONSTRAINT PK_ETL_VIEWS PRIMARY KEY ("ID")</p>
<p>);</p>
<p>&nbsp;</p>
<p>COMMENT ON TABLE ETL_VIEWS IS</p>
<p>'此表用于维护ETL涉及到所有视图, 包括:</p>
<p>1, v1---db表中与ods对应到视图</p>
<p>2, v2---ods表中与db对应到视图</p>
<p>3, v3---ods表中与dw对应到视图</p>
<p>4, v4---dw表中与ods中对应到视图';</p>
<p>&nbsp;</p>
<p>/*==============================================================*/</p>
<p>/* Table: ETLS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</p>
<p>/*==============================================================*/</p>
<p>CREATE TABLE ETLS &nbsp;(</p>
<p>&nbsp;&nbsp; "ID" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_NAME" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(300) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_TYPE" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_SRC_VIEW_OR_TABLE" NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_DES_VIEW_OR_TABLE" NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_INIT_ENABLE" &nbsp; &nbsp;NUMBER(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_ADD_ENABLE" &nbsp; &nbsp; NUMBER(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_CHARGE_ENABLE" &nbsp;NUMBER(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "CURRENT_VERSION" &nbsp; &nbsp;NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VERSION_HISTORY" &nbsp; &nbsp;VARCHAR2(3000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'init input' NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_DATE" &nbsp; &nbsp; &nbsp; DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_BY" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_DATE" DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_BY" &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "MEMO" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(500),</p>
<p>&nbsp;&nbsp; "STATUS" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; CONSTRAINT PK_ETLS PRIMARY KEY ("ID")</p>
<p>);</p>
<p>&nbsp;</p>
<p>COMMENT ON TABLE ETLS IS</p>
<p>'此表用于维护ETL转换时设计到源表和目的表</p>
<p>&nbsp;</p>
<p>源表(或视图)---&gt;目的表(或视图)-</p>
<p>(推荐全部使用视图, 视图具有更过到灵活性, 而且更统一)</p>
<p>&nbsp;</p>
<p>整体架构是在完全相同两张表(或视图)之间进行同步处理</p>
<p>&nbsp;</p>
<p>规范:</p>
<p>1, &nbsp;源表(或视图)-和目的表(或视图)-完全相同</p>
<p>2, &nbsp;目的视图必须是单表';</p>
<div><br />
</div>
<div><br />
</div>
<h2>--存储过程<br />
</h2>
<div><br />
</div>
<div>
<div>/*==============================================================*/</div>
<div>/* Database name: &nbsp;%DATABASE% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</div>
<div>/* DBMS name: &nbsp; &nbsp; &nbsp;ORACLE Version 10g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</div>
<div>/* Created on: &nbsp; &nbsp; 2009-2-1 23:29:27 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</div>
<div>/*==============================================================*/</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>-- INTEGRITY PACKAGE DECLARATION</div>
<div>CREATE OR REPLACE PACKAGE INTEGRITYPACKAGE AS</div>
<div>&nbsp;PROCEDURE INITNESTLEVEL;</div>
<div>&nbsp;FUNCTION GETNESTLEVEL RETURN NUMBER;</div>
<div>&nbsp;PROCEDURE NEXTNESTLEVEL;</div>
<div>&nbsp;PROCEDURE PREVIOUSNESTLEVEL;</div>
<div>&nbsp;END INTEGRITYPACKAGE;</div>
<div>/</div>
<div><br />
</div>
<div>-- INTEGRITY PACKAGE DEFINITION</div>
<div>CREATE OR REPLACE PACKAGE BODY INTEGRITYPACKAGE AS</div>
<div>&nbsp;NESTLEVEL NUMBER;</div>
<div><br />
</div>
<div>-- PROCEDURE TO INITIALIZE THE TRIGGER NEST LEVEL</div>
<div>&nbsp;PROCEDURE INITNESTLEVEL IS</div>
<div>&nbsp;BEGIN</div>
<div>&nbsp;NESTLEVEL := 0;</div>
<div>&nbsp;END;</div>
<div><br />
</div>
<div><br />
</div>
<div>-- FUNCTION TO RETURN THE TRIGGER NEST LEVEL</div>
<div>&nbsp;FUNCTION GETNESTLEVEL RETURN NUMBER IS</div>
<div>&nbsp;BEGIN</div>
<div>&nbsp;IF NESTLEVEL IS NULL THEN</div>
<div>&nbsp;&nbsp; &nbsp; NESTLEVEL := 0;</div>
<div>&nbsp;END IF;</div>
<div>&nbsp;RETURN(NESTLEVEL);</div>
<div>&nbsp;END;</div>
<div><br />
</div>
<div>-- PROCEDURE TO INCREASE THE TRIGGER NEST LEVEL</div>
<div>&nbsp;PROCEDURE NEXTNESTLEVEL IS</div>
<div>&nbsp;BEGIN</div>
<div>&nbsp;IF NESTLEVEL IS NULL THEN</div>
<div>&nbsp;&nbsp; &nbsp; NESTLEVEL := 0;</div>
<div>&nbsp;END IF;</div>
<div>&nbsp;NESTLEVEL := NESTLEVEL + 1;</div>
<div>&nbsp;END;</div>
<div><br />
</div>
<div>-- PROCEDURE TO DECREASE THE TRIGGER NEST LEVEL</div>
<div>&nbsp;PROCEDURE PREVIOUSNESTLEVEL IS</div>
<div>&nbsp;BEGIN</div>
<div>&nbsp;NESTLEVEL := NESTLEVEL - 1;</div>
<div>&nbsp;END;</div>
<div><br />
</div>
<div>&nbsp;END INTEGRITYPACKAGE;</div>
<div>/</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>CREATE OR REPLACE PROCEDURE PRO_CREATE_VIEW_BY_ETL_VIEWS</div>
<div>AS</div>
<div><br />
</div>
<div>--------------PRO_CREATE_VIEW_BY_ETL_VIEWS------------------------</div>
<div>-- CREATED ON 2009-2-1 BY CYYAN@ISOFTSTONE</div>
<div>-- 功能 : 根据ETL_VIEWS中到数据生成视图</div>
<div>------------------------------------------------------------------------------</div>
<div><br />
</div>
<div><br />
</div>
<div>&nbsp;&nbsp;VIEW_CREATE_CODE VARCHAR2(10000); --生成视图到代码</div>
<div><br />
</div>
<div>&nbsp;&nbsp;VIEW_NAME VARCHAR2(100); &nbsp;--视图名称</div>
<div><br />
</div>
<div>&nbsp;&nbsp;VIEW_SELECT VARCHAR2(4000); &nbsp;--视图的SELECT部分</div>
<div>&nbsp;&nbsp;VIEW_FROM VARCHAR2(300); &nbsp; --视图的FROM部分</div>
<div>&nbsp;&nbsp;VIEW_WHERE VARCHAR2(3000); &nbsp; --视图的WHERE部分</div>
<div>&nbsp;&nbsp;VIEW_ORDER_BY VARCHAR2(600); &nbsp; --视图的ORDER BY部分</div>
<div>&nbsp;&nbsp;VIEW_GROUP_BY VARCHAR2(600); &nbsp; --视图的GROUP BY部分</div>
<div>&nbsp;&nbsp;VIEW_HAVING VARCHAR2(600); &nbsp; --视图的HAVING部分</div>
<div>&nbsp;&nbsp;VIEW_DB_LINK_NAME VARCHAR2(100); &nbsp; --视图的DB LINK部分</div>
<div><br />
</div>
<div>&nbsp;&nbsp;ROW_COUNT NUMBER; --行数</div>
<div><br />
</div>
<div>&nbsp;&nbsp;CURSOR ETL_VIEWS_CURSOR IS &nbsp;--提取创建视图需要到信息</div>
<div>&nbsp;&nbsp; &nbsp;SELECT VIEW_NAME, VIEW_SELECT, VIEW_FROM, VIEW_WHERE, VIEW_ORDER_BY, VIEW_GROUP_BY, VIEW_HAVING, VIEW_DB_LINK_NAME FROM ETL_VIEWS T WHERE T.CURRENT_VERSION = (SELECT MAX(T2.CURRENT_VERSION) FROM ETL_VIEWS T2 WHERE T.VIEW_NAME = T2.VIEW_NAME);</div>
<div><br />
</div>
<div>BEGIN</div>
<div>&nbsp;&nbsp;-- 统计行数</div>
<div>&nbsp;&nbsp;SELECT COUNT(*) INTO ROW_COUNT &nbsp;FROM ETL_VIEWS T WHERE T.CURRENT_VERSION = (SELECT MAX(T2.CURRENT_VERSION) FROM ETL_VIEWS T2 WHERE T.VIEW_NAME = T2.VIEW_NAME);</div>
<div><br />
</div>
<div>&nbsp;&nbsp;OPEN ETL_VIEWS_CURSOR; --打开游标</div>
<div>&nbsp;&nbsp;FOR I IN 1 .. ROW_COUNT &nbsp;LOOP &nbsp;--遍历</div>
<div>&nbsp;&nbsp; &nbsp;FETCH ETL_VIEWS_CURSOR</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;INTO VIEW_NAME, VIEW_SELECT, VIEW_FROM, VIEW_WHERE, VIEW_ORDER_BY, VIEW_GROUP_BY, VIEW_HAVING, VIEW_DB_LINK_NAME;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;---拼接创建视图到语句</div>
<div>&nbsp;&nbsp; &nbsp;VIEW_CREATE_CODE := 'create or replace view ' || VIEW_NAME || ' as select ' || VIEW_SELECT || ' from ' || VIEW_FROM;</div>
<div><br />
</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;IF VIEW_DB_LINK_NAME IS NOT NULL THEN</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; VIEW_CREATE_CODE := VIEW_CREATE_CODE || '@' || VIEW_DB_LINK_NAME;</div>
<div>&nbsp;&nbsp; &nbsp;END IF;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;IF VIEW_WHERE IS NOT NULL THEN</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; VIEW_CREATE_CODE := VIEW_CREATE_CODE || ' where ' || VIEW_WHERE;</div>
<div>&nbsp;&nbsp; &nbsp;END IF;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;IF VIEW_ORDER_BY IS NOT NULL THEN</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; VIEW_CREATE_CODE := VIEW_CREATE_CODE || ' order by ' || VIEW_ORDER_BY;</div>
<div>&nbsp;&nbsp; &nbsp;END IF;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;IF VIEW_GROUP_BY IS NOT NULL THEN</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; VIEW_CREATE_CODE := VIEW_CREATE_CODE || ' group by ' || VIEW_GROUP_BY;</div>
<div>&nbsp;&nbsp; &nbsp;END IF;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;IF VIEW_HAVING IS NOT NULL THEN</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; VIEW_CREATE_CODE := VIEW_CREATE_CODE || ' having ' || VIEW_HAVING;</div>
<div>&nbsp;&nbsp; &nbsp;END IF;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;--输出创建语句</div>
<div>&nbsp;&nbsp; &nbsp;--DBMS_OUTPUT.PUT_LINE(VIEW_CREATE_CODE);</div>
<div>&nbsp;&nbsp; &nbsp;--DBMS_OUTPUT.PUT_LINE('');</div>
<div>&nbsp;&nbsp; &nbsp;--执行创建视图</div>
<div>&nbsp;&nbsp; &nbsp;EXECUTE IMMEDIATE VIEW_CREATE_CODE;</div>
<div>&nbsp;&nbsp;END LOOP;</div>
<div>&nbsp;&nbsp;CLOSE ETL_VIEWS_CURSOR; --关闭游标</div>
<div>END;</div>
<div>/</div>
<div><br />
</div>
<div><br />
</div>
<div>CREATE OR REPLACE PROCEDURE PRO_INSERT_INTO_ETL_VIEWS</div>
<div>AS</div>
<div><br />
</div>
<div>--ADD BY CYYAN@ISOFTSTONE</div>
<div>--2009年2月1日21:33:37</div>
<div>---此存储过程用于 将ETL_TABLE中标识需要创建VIEW 到TABLE, 进行自动提起转换到ETL_VIEWS中.</div>
<div>--处理过程用到啦系统表COL从此表中获取列名</div>
<div><br />
</div>
<div>&nbsp;&nbsp;TABLE_NAME VARCHAR2(100); --表名</div>
<div>&nbsp;&nbsp;COL_NAME &nbsp; VARCHAR2(100); --列名</div>
<div><br />
</div>
<div>&nbsp;&nbsp;TABLE_COUNT NUMBER; --表到行数</div>
<div>&nbsp;&nbsp;--COL_COUNT &nbsp; NUMBER; --列数</div>
<div><br />
</div>
<div>&nbsp;&nbsp;ETL_VIEWS_INSERT_CODE VARCHAR2(600); --插入语句到 INSERT部分</div>
<div>&nbsp;&nbsp;ETL_VIEWS_VALUES_CODE VARCHAR2(16000); --插入语句到VALUES部分</div>
<div><br />
</div>
<div>&nbsp;&nbsp;--ETL_VIEWS的到列</div>
<div>&nbsp;&nbsp;VIEW_NAME_PREFIX VARCHAR2(30);--实体名到前缀</div>
<div>&nbsp;&nbsp;TABLE_TYPE VARCHAR2(30); --表类型 如 DB, ODS, DW</div>
<div>&nbsp;&nbsp;TABLE_ROOT_IN VARCHAR2(30); --表来源, 来自那个系统, 如资金系统"NHZJ", 财务系统"NHCW"</div>
<div>&nbsp;&nbsp;VIEW_SELECT VARCHAR2(10000); --VIEW 语句到SELECT部分, 这个需要遍历一个表到所有列</div>
<div>&nbsp;&nbsp;DB_LINK_NAME VARCHAR2(100);</div>
<div>&nbsp;&nbsp;CURRENT_VERSION VARCHAR2(600); --版本部分, 这里没更新, 只要全部删除, 或不断插入, 此字段定义了版本, 没有变更都形成新到版本, 取值是取最大值</div>
<div><br />
</div>
<div>&nbsp;&nbsp;CURSOR_NUMBER NUMBER;</div>
<div>&nbsp;&nbsp; COL_SELECT_SQL VARCHAR2(100);</div>
<div>&nbsp;&nbsp; &nbsp;RETURN_VALUE NUMBER;</div>
<div>&nbsp;&nbsp;--从ETL_TABLES中查询需要生成视图到表</div>
<div>&nbsp;&nbsp;CURSOR DB_TABLES_CURSOR IS</div>
<div>&nbsp;&nbsp; &nbsp;SELECT UPPER(TABLE_NAME), T.TABLE_TYPE, T.TABLE_ROOT_IN, T.TABLE_CREATE_VIEW_NAME_PREFIX, DB_LINK_NAME FROM ETL_TABLES T WHERE (UPPER(T.TABLE_TYPE) = 'DB' OR UPPER(T.TABLE_TYPE) = 'DW' ) AND T.TABLE_NEED_CREATE_VIEW = 1;</div>
<div><br />
</div>
<div>&nbsp;&nbsp;--CURSOR_NUMBER NUMBER; --游标 OLD WAY 执行需要, NEW WAY 不需要</div>
<div>&nbsp;&nbsp;--RETURN_VALUE NUMBER; --执行后返回值 &nbsp;OLD WAY 执行需要, NEW WAY 不需要</div>
<div><br />
</div>
<div><br />
</div>
<div>BEGIN</div>
<div>&nbsp;&nbsp;-- TEST STATEMENTS HERE</div>
<div>&nbsp;&nbsp;SELECT COUNT(*) INTO TABLE_COUNT FROM ETL_TABLES T WHERE (UPPER(T.TABLE_TYPE) = 'DB' OR UPPER(T.TABLE_TYPE) = 'DW' ) AND T.TABLE_NEED_CREATE_VIEW = 1;</div>
<div><br />
</div>
<div>&nbsp;&nbsp;--构造INSERT部分</div>
<div>&nbsp;&nbsp;ETL_VIEWS_INSERT_CODE &nbsp;:= 'insert into etl_views(view_name, view_type, view_root_in, view_select, view_from, current_version, VIEW_DB_LINK_NAME) ';</div>
<div><br />
</div>
<div>&nbsp;&nbsp;OPEN DB_TABLES_CURSOR;</div>
<div>&nbsp;&nbsp;FOR I IN 1 .. TABLE_COUNT LOOP --表遍历</div>
<div>&nbsp;&nbsp; &nbsp;FETCH DB_TABLES_CURSOR</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;INTO TABLE_NAME, TABLE_TYPE, TABLE_ROOT_IN, VIEW_NAME_PREFIX, DB_LINK_NAME;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;--构造VALUES部分</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;ETL_VIEWS_VALUES_CODE &nbsp;:= 'values(''' || VIEW_NAME_PREFIX || TABLE_NAME || ''', ''' || &nbsp;TABLE_TYPE || ''', ''' || TABLE_ROOT_IN || '''';</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;DBMS_OUTPUT.PUT(TABLE_NAME);</div>
<div><br />
</div>
<div>/* &nbsp; 使用CURSOR遍历列到方法 不适用于DB_LINK</div>
<div>&nbsp;&nbsp; &nbsp; --准备遍历列</div>
<div>&nbsp;&nbsp; &nbsp;SELECT COUNT(*) INTO COL_COUNT FROM COL@DB_LINK_NHZJ WHERE COL.TNAME = UPPER(TABLE_NAME);</div>
<div>&nbsp;&nbsp; &nbsp;DBMS_OUTPUT.PUT_LINE(' table has ' || COL_COUNT || ' cols');</div>
<div>&nbsp;&nbsp; &nbsp;DECLARE</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;CURSOR COLS_CURSOR IS</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SELECT C.CNAME FROM COL@DB_LINK_NHZJ C WHERE C.TNAME = UPPER(TABLE_NAME);</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;BEGIN</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;OPEN COLS_CURSOR;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;VIEW_SELECT := '';</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;--下面用逗号拼接列</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;FETCH COLS_CURSOR --遍历第一列</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INTO COL_NAME;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;VIEW_SELECT := VIEW_SELECT || COL_NAME;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;FOR J IN 2 .. COL_COUNT LOOP --遍历后面到列</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FETCH COLS_CURSOR</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INTO COL_NAME;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DBMS_OUTPUT.PUT_LINE(' &nbsp;' || COL_NAME);</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;VIEW_SELECT := VIEW_SELECT || ', ' || COL_NAME;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;END LOOP;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;CLOSE COLS_CURSOR;</div>
<div>&nbsp;&nbsp; &nbsp;END;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;--DBMS_OUTPUT.PUT_LINE(VIEW_SELECT);</div>
<div>&nbsp;&nbsp; -- DBMS_OUTPUT.PUT_LINE(ETL_VIEWS_VALUES_CODE);</div>
<div>&nbsp;&nbsp;*/</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;/* 使用 DBMS_SQL */</div>
<div>&nbsp;&nbsp; &nbsp;-- ANOTHER WAY USER DBMS_SQL PACKAGE</div>
<div>&nbsp;&nbsp; &nbsp;COL_SELECT_SQL := 'select t.cname from sys.col@' || DB_LINK_NAME || ' T where T.tname = ''' || TABLE_NAME || '''';</div>
<div>&nbsp;&nbsp; &nbsp;--SQL_CODE := 'select t.cname from sys.col T where T.tname = ''' || TABLE_NAME || '''';</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;CURSOR_NUMBER := DBMS_SQL.OPEN_CURSOR();</div>
<div><br />
</div>
<div>&nbsp;&nbsp; DBMS_SQL.PARSE(CURSOR_NUMBER, COL_SELECT_SQL, DBMS_SQL.NATIVE);</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;DBMS_SQL.DEFINE_COLUMN(CURSOR_NUMBER,1,COL_NAME, 100);</div>
<div><br />
</div>
<div><br />
</div>
<div>&nbsp;&nbsp; RETURN_VALUE := DBMS_SQL.EXECUTE(CURSOR_NUMBER);</div>
<div>&nbsp;&nbsp; &nbsp;DBMS_OUTPUT.PUT_LINE(' &nbsp;RETURN_VALUE = ' || RETURN_VALUE);</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;RETURN_VALUE := DBMS_SQL.FETCH_ROWS(CURSOR_NUMBER); --获取第一列</div>
<div>&nbsp;&nbsp; DBMS_SQL.COLUMN_VALUE(CURSOR_NUMBER,1,COL_NAME);</div>
<div>&nbsp;&nbsp; &nbsp; VIEW_SELECT := COL_NAME;</div>
<div><br />
</div>
<div>&nbsp;&nbsp; WHILE DBMS_SQL.FETCH_ROWS(CURSOR_NUMBER)&lt;&gt;0 LOOP &nbsp;---遍历其它到列</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;DBMS_SQL.COLUMN_VALUE(CURSOR_NUMBER,1,COL_NAME);</div>
<div>&nbsp;&nbsp; &nbsp;DBMS_OUTPUT.PUT_LINE(COL_NAME);</div>
<div>&nbsp;&nbsp; &nbsp; VIEW_SELECT := VIEW_SELECT || ', ' || COL_NAME;</div>
<div>&nbsp;&nbsp; END LOOP;</div>
<div><br />
</div>
<div>-- &nbsp; DBMS_OUTPUT.PUT_LINE('VIEW_SELECT : ' || VIEW_SELECT);</div>
<div><br />
</div>
<div>&nbsp;&nbsp; DBMS_SQL.CLOSE_CURSOR(CURSOR_NUMBER);</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;--生成最新到版本号: 视图名称是唯一的</div>
<div>&nbsp;&nbsp; &nbsp;SELECT NVL(MAX(CURRENT_VERSION),0) + 1 INTO CURRENT_VERSION FROM ETL_VIEWS V WHERE V.VIEW_NAME = VIEW_NAME_PREFIX || TABLE_NAME;</div>
<div>&nbsp;&nbsp; &nbsp;ETL_VIEWS_VALUES_CODE &nbsp;:= ETL_VIEWS_VALUES_CODE || CHR(10) || ', ''' || VIEW_SELECT || '''' || CHR(10) || ', ''' || TABLE_NAME || ''', ''' || CURRENT_VERSION || ''', ''' || DB_LINK_NAME || ''')';</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;--输出插入到语句</div>
<div>&nbsp;&nbsp; &nbsp;--DBMS_OUTPUT.PUT_LINE(ETL_VIEWS_INSERT_CODE);</div>
<div>&nbsp;&nbsp; &nbsp; --DBMS_OUTPUT.PUT_LINE(ETL_VIEWS_VALUES_CODE);</div>
<div>&nbsp;&nbsp; &nbsp;--DBMS_OUTPUT.PUT_LINE('');</div>
<div><br />
</div>
<div>--DBMS_STANDARD.</div>
<div><br />
</div>
<div>&nbsp;&nbsp; &nbsp;--执行插入语句</div>
<div>&nbsp;&nbsp; &nbsp;-- NEW WAY</div>
<div>&nbsp;&nbsp; &nbsp;EXECUTE IMMEDIATE ETL_VIEWS_INSERT_CODE || ETL_VIEWS_VALUES_CODE;</div>
<div>/*</div>
<div>&nbsp;&nbsp; &nbsp;-- OLD WAY</div>
<div>&nbsp;&nbsp; CURSOR_NUMBER := DBMS_SQL.OPEN_CURSOR();</div>
<div>&nbsp;&nbsp; DBMS_SQL.PARSE(CURSOR_NUMBER, ETL_VIEWS_INSERT_CODE, DBMS_SQL.NATIVE);</div>
<div>&nbsp;&nbsp; RETURN_VALUE := DBMS_SQL.EXECUTE(CURSOR_NUMBER);</div>
<div>&nbsp;&nbsp; DBMS_SQL.CLOSE_CURSOR(CURSOR_NUMBER);</div>
<div>&nbsp;&nbsp;*/</div>
<div>&nbsp;&nbsp;END LOOP;</div>
<div>&nbsp;&nbsp;COMMIT; --提交</div>
<div>&nbsp;&nbsp;CLOSE DB_TABLES_CURSOR; --关闭游标</div>
<div>&nbsp;&nbsp;--EXCEPTION</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;--ROLLBACK;</div>
<div>END;</div>
<div>/</div>
<div><br />
</div>
<div><br />
</div>
<div>CREATE OR REPLACE TRIGGER TRG_ID_ON_ETLS</div>
<div>&nbsp;&nbsp;BEFORE INSERT ON ETLS &nbsp;</div>
<div>&nbsp;&nbsp;FOR EACH ROW</div>
<div>DECLARE</div>
<div>&nbsp;&nbsp;-- NOTHING</div>
<div>BEGIN</div>
<div>&nbsp;&nbsp;SELECT SEQ_ETL_INCREASE_ID.NEXTVAL INTO :NEW.ID FROM DUAL;</div>
<div>END TRIGGER_ID_INCREASE;</div>
<div>/</div>
<div><br />
</div>
<div><br />
</div>
<div>CREATE OR REPLACE TRIGGER TRG_ID_ON_ETL_TABLES</div>
<div>&nbsp;&nbsp;BEFORE INSERT ON ETL_TABLES &nbsp;</div>
<div>&nbsp;&nbsp;FOR EACH ROW</div>
<div>DECLARE</div>
<div>&nbsp;&nbsp;-- NOTHING</div>
<div>BEGIN</div>
<div>&nbsp;&nbsp;SELECT SEQ_ETL_INCREASE_ID.NEXTVAL INTO :NEW.ID FROM DUAL;</div>
<div>END TRIGGER_ID_INCREASE;</div>
<div>/</div>
<div><br />
</div>
<div><br />
</div>
<div>CREATE OR REPLACE TRIGGER TRG_ID_ON_ETL_VIEWS</div>
<div>&nbsp;&nbsp;BEFORE INSERT ON ETL_VIEWS</div>
<div>&nbsp;&nbsp;FOR EACH ROW</div>
<div>DECLARE</div>
<div>&nbsp;&nbsp;-- NOTHING</div>
<div>BEGIN</div>
<div>&nbsp;&nbsp;SELECT SEQ_ETL_INCREASE_ID.NEXTVAL INTO :NEW.ID FROM DUAL;</div>
<div>END TRIGGER_ID_INCREASE;</div>
<div>/</div>
<div><br />
</div>
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/342048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-12-31 10:42 <a href="http://www.blogjava.net/xzclog/archive/2010/12/31/342048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 10g如何关闭和打开自动收集统计信息</title><link>http://www.blogjava.net/xzclog/archive/2010/12/15/340797.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 15 Dec 2010 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/12/15/340797.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/340797.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/12/15/340797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/340797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/340797.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p style="text-indent: 2em">一、<span style="color: #ce0001">ORACLE10g自动收集统计信息--自动analyze</span></p>
<p style="text-indent: 2em">从<a target="_self"><span style="text-decoration: underline"><strong>Oracle</strong></span></a> Database 10g开始，Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务，用于自动收集CBO的统计信息。</p>
<p style="text-indent: 2em">这个自动任务默认情况下在<a target="_self"><span style="text-decoration: underline"><strong>工作</strong></span></a>日晚上10：00-6：00和周末全天开启。调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集统计信息。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级，再开始进行统计信息。</p>
<p style="text-indent: 2em">可以通过以下查询这个JOB的运行情况：</p>
<p style="text-indent: 2em">&nbsp;</p>
<blockquote>select * from Dba_Scheduler_Jobs where JOB_NAME ='GATHER_STATS_JOB'</blockquote>
<p style="text-indent: 2em">其实同在10点运行的Job还有一个AUTO_SPACE_ADVISOR_JOB：</p>
<p style="text-indent: 2em">&nbsp;</p>
<blockquote>SQL&gt; select JOB_NAME,LAST_START_DATE from dba_scheduler_jobs;
<p style="text-indent: 2em">JOB_NAME&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LAST_START_DATE</p>
<p style="text-indent: 2em">------------------------------ --------------------------------------</p>
<p style="text-indent: 2em">AUTO_SPACE_ADVISOR_JOB&nbsp; &nbsp; &nbsp; &nbsp; 04-DEC-07 10.00.00.692269 PM +08:00</p>
<p style="text-indent: 2em">GATHER_STATS_JOB&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 04-DEC-07 10.00.00.701152 PM +08:00</p>
<p style="text-indent: 2em">FGR$AUTOPURGE_JOB</p>
<p style="text-indent: 2em">PURGE_LOG&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 05-DEC-07 03.00.00.169059 AM PRC</p>
</blockquote>
<p style="text-indent: 2em">然而这个自动化功能已经影响了很多系统的正常运行，晚上10点对于大部分生产系统也并非空闲时段。</p>
<p style="text-indent: 2em">而自动分析可能导致极为严重的闩锁竞争，进而可能导致数据库Hang或者Crash。</p>
<p style="text-indent: 2em">所以建议最好关闭这个自动统计信息收集功能：</p>
<p style="text-indent: 2em">&nbsp;</p>
<blockquote>exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');</blockquote>
<p style="text-indent: 2em">自动化永远而严重的隐患相伴随！</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">关闭及开启自动搜集功能，有两种方法，分别如下：</p>
<p style="text-indent: 2em">方法一：&nbsp;</p>
<p style="text-indent: 2em">exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');</p>
<p style="text-indent: 2em">exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');</p>
<p style="text-indent: 2em">方法二：</p>
<p style="text-indent: 2em">alter system set "_optimizer_autostats_job"=false scope=spfile;</p>
<p style="text-indent: 2em">alter system set "_optimizer_autostats_job"=true scope=spfile;</p>
<p style="text-indent: 2em">Pfile可以直接修改初始化参数文件，重新启动<a target="_self"><span style="text-decoration: underline"><strong>数据库</strong></span></a>。</p>
<p style="text-indent: 2em">二、AWR默认通过MMON及MMNL进程来每小自动运行一次，为了节省空间，采集的数据在 7 天后自动清除。</p>
<p style="text-indent: 2em">快照频率和保留时间都可以由用户修改。要查看当前的设置，您可以使用下面的语句： </p>
<p style="text-indent: 2em">select snap_interval, retention</p>
<p style="text-indent: 2em">from dba_hist_wr_control;</p>
<p style="text-indent: 2em">SNAP_INTERVAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETENTION</p>
<p style="text-indent: 2em">------------------- -------------------<br />
&nbsp; +00000 01:00:00.0&nbsp;&nbsp; +00007 00:00:00.0 </p>
<p style="text-indent: 2em">&nbsp;这些 <a target="_self"><span style="text-decoration: underline"><strong>SQL</strong></span></a> 语句显示快照每小时采集一次，采集的数据保留 7 天。要修改设置 <em>—</em> 例如，快照时间间隔为 20 分钟，保留时间为两天 <em>—</em> 您可以发出以下命令。参数以分钟为单位。</p>
<p style="text-indent: 2em">begin</p>
<p style="text-indent: 2em">&nbsp;&nbsp; dbms_workload_repository.modify_snapshot_settings (</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interval =&gt; 20,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retention =&gt; 2*24*60</p>
<p style="text-indent: 2em">&nbsp;&nbsp; );end; </p>
<p style="text-indent: 2em">AWR 使用几个表来存储采集的统计数据，所有的表都存储在新的名称为 SYSAUX 的特定表空间中的 SYS 模式下，并且以 WRM$_* 和 WRH$_* 的格式命名。前一种类型存储元数据信息（如检查的数据库和采集的快照），后一种类型保存实际采集的统计数据。（您可能已经猜到，H 代表&#8220;历史数据 (historical)&#8221;而 M 代表&#8220;元数据 (metadata)&#8221;。）在这些表上构建了几种带前缀 DBA_HIST_ 的视图，这些视图可以用来编写您自己的性能诊断工具。视图的名称直接与表相关；例如，视图 DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上构建的。 </p>
<p style="text-indent: 2em">您的处理计划一般是有规律的，并且通常基于您对各种事件的了解和您处理它们的经验。现在设想相同的事情由一个引擎来完成，这个引擎采集量度并根据预先确定的逻辑来推出可能的计划。您的工作不就变得更轻松了吗？ 现在在 Oracle Database 10<em>g</em> 中推出的这个引擎称为自动数据库诊断监控程序 (ADDM)。为了作出决策，ADDM 使用了由 AWR 采集的数据。 </p>
<p style="text-indent: 2em">在 AWR 进行的每一次快照采集之后，调用 ADDM 来检查量度并生成建议。因此，实际上您拥有了一个一天二十四小时工作的自动数据库管理员，它主动地分析数据并生成建议，从而把您解放出来，使您能够关注更具有战略意义的问题。 </p>
<p style="text-indent: 2em">快照默认是自动采集的，但您也可以按需要采集它们。所有的 AWR 功能都在程序包 DBMS_WORKLOAD_REPOSITORY 中实施。要采集一次快照，只需发出下面的命令： </p>
<p style="text-indent: 2em">execute dbms_workload_repository.create_snapshot它立即采集一次快照，快照被记录在表 WRM$_SNAPSHOT 中。采集的量度是针对 TYPICAL 级别的。如果您想采集更详细的统计数据，您可以在上面的过程中将参数 FLUSH_LEVEL 设置为 ALL。统计数据自动删除，但也可以通过调用过程 drop_snapshot_range() 来手动删除。</p>
</div>
<script type="text/javascript"><!-- google_ad_client="pub-1076724771190722" ;
/* JE个人博客468x60 */ google_ad_slot="5506163105" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/js/r20101117/r20101214/show_ads_impl.js"></script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script>
<img src ="http://www.blogjava.net/xzclog/aggbug/340797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-12-15 15:12 <a href="http://www.blogjava.net/xzclog/archive/2010/12/15/340797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle学习:分区表和索引</title><link>http://www.blogjava.net/xzclog/archive/2010/12/13/340514.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 13 Dec 2010 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/12/13/340514.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/340514.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/12/13/340514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/340514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/340514.html</trackback:ping><description><![CDATA[<strong>什么时候使用分区：<br />
</strong>　　1、 大数据量的表，比如大于2GB。一方面2GB文件对于32位os是一个上限，另外备份时间长。<br />
　　2、 包括历史数据的表，比如最新的数据放入到最新的分区中。典型的例子：历史表，只有当前月份的数据可以被修改，而其他月份只能read-on
<div class="bct fc05 fc11 nbw-blog ztag js-fs2"><wbr>ly<br />
　　ORACLE只支持以下分区：tables, indexes on tables, materialized views, and indexes on materialized views<br />
　　分区对SQL和DML是透明的(应用程序不必知道已经作了分区)，但是DDL可以对不同的分区进行管理。<br />
　　不同的分区之间必须有相同的逻辑属性，比如共同的表名，列名，数据类型，约束;<br />
　　但是可以有不同的物理属性，比如pctfree, pctused, and tablespaces.<br />
　　分区独立性：即使某些分区不可用，其他分区仍然可用。<br />
　　最多可以分成64000个分区，但是具有LONG or LONG RAW列的表不可以，但是有CLOB or BLOB列的表可以。<br />
　　可以不用to_date函数，比如：<br />
　　alter session set nls_date_format='mm/dd/yyyy';<br />
　　CREATE TABLE sales_range<br />
　　(salesman_id NUMBER(5),<br />
　　salesman_name VARCHAR2(30),<br />
　　sales_amount NUMBER(10),<br />
　　sales_date DATE)<br />
　　PARTITION BY RANGE(sales_date)<br />
　　(<br />
　　PARTITION sales_jan2000 VALUES LESS THAN('02/01/2000'),<br />
　　PARTITION sales_feb2000 VALUES LESS THAN('03/01/2000'),<br />
　　PARTITION sales_mar2000 VALUES LESS THAN('04/01/2000'),<br />
　　PARTITION sales_apr2000 VALUES LESS THAN('05/01/2000')<br />
　　);<br />
　　<span style="color: red">Partition Key：最多16个columns,可以是nullable的<br />
　　非分区的表可以有分区或者非分区的索引;<br />
　　分区表可以有分区或者非分区的索引;<br />
</span>　　Partitioning 方法：<br />
　　Range Partitioning<br />
　　List Partitioning<br />
　　Hash Partitioning<br />
　　Composite Partitioning<br />
　　Composite Partitioning:组合，以及 range-hash and range-list composite partitioning<br />
　　Range Partitioning：<br />
　　每个分区都有VALUES LESS THAN子句，表示这个分区小于(&lt;)某个上限，而大于等于(&gt;=)前一个分区的VALUES LESS THAN值。<br />
　　MAXVALUE定义最高的分区，他表示一个虚拟的无限大的值。这个分区包括null值。<br />
　　CREATE TABLE sales_range<br />
　　(salesman_id NUMBER(5),<br />
　　salesman_name VARCHAR2(30),<br />
　　sales_amount NUMBER(10),<br />
　　sales_date DATE)<br />
　　PARTITION BY RANGE(sales_date)<br />
　　(<br />
　　PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('01/02/2000','DD/MM/YYYY')),<br />
　　PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('01/03/2000','DD/MM/YYYY')),<br />
　　PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('01/04/2000','DD/MM/YYYY')),<br />
　　PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('01/05/2000','DD/MM/YYYY')),<br />
　　PARTITION sales_2000 VALUES LESS THAN(MAXVALUE)<br />
　　);<br />
　　插入数据：<br />
　　Insert into sales_range values(1,2,3,to_date('21-04-2000','DD-MM-YYYY'));<br />
　　Insert into sales_range values(1,2,3,sysdate);<br />
　　选择数据：<br />
　　select * from sales_range;<br />
　　select * from sales_range partition(sales_apr2000);<br />
　　select * from sales_range partition(sales_mar2000);<br />
　　select * from sales_range partition(sales_2000);<br />
　　按照多个列分区：<br />
　　CREATE TABLE sales_range1<br />
　　(salesman_id NUMBER(5),<br />
　　salesman_name VARCHAR2(30),<br />
　　sales_amount NUMBER(10),<br />
　　sales_date DATE)<br />
　　PARTITION BY RANGE(sales_date, sales_amount)<br />
　　(<br />
　　PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('01/02/2000','DD/MM/YYYY'),1000),<br />
　　PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('01/03/2000','DD/MM/YYYY'),2000),<br />
　　PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('01/04/2000','DD/MM/YYYY'),3000),<br />
　　PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('01/05/2000','DD/MM/YYYY'),4000),<br />
　　PARTITION sales_2000 VALUES LESS THAN(MAXVALUE, MAXVALUE)<br />
　　)<br />
Insert into sales_range1 values(1,2,500, TO_DATE('21/01/2000','DD/MM/YYYY'));<br />
　　Insert into sales_range1 values(2,3,1500, sysdate);<br />
　　如果多个分区列的值冲突，则按照从左到右的优先级。<br />
　　<span style="color: red">List Partitioning：<br />
　　可以组织无序的，或者没有关系的数据在相同的分区。<br />
　　不支持多列的(multicolumn) partition keys，只能是一个列。<br />
　　DEFAULT表示不满足条件的都放在这个分区。<br />
</span>　　CREATE TABLE sales_list<br />
　　(salesman_id NUMBER(5),<br />
　　salesman_name VARCHAR2(30),<br />
　　sales_state VARCHAR2(20),<br />
　　sales_amount NUMBER(10),<br />
　　sales_date DATE)<br />
　　PARTITION BY LIST(sales_state)<br />
　　(<br />
　　PARTITION sales_west VALUES('California', 'Hawaii'),<br />
　　PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),<br />
　　PARTITION sales_central VALUES('Texas', 'Illinois'),<br />
　　PARTITION sales_other VALUES(DEFAULT)<br />
　　);<br />
　　<span style="color: red">Hash Partitioning：<br />
　　不可以作splitting, dropping or merging操作。但是可以added and coalesced.<br />
　　当我们无法判断有多少数据映射或者怎样映射到各个分区时，可以使用这种方法。分区数据最好是2的幂，这样可以平均分配数据。<br />
</span>　　CREATE TABLE sales_hash1<br />
　　(salesman_id NUMBER(5),<br />
　　salesman_name VARCHAR2(30),<br />
　　sales_amount NUMBER(10),<br />
　　week_no NUMBER(2))<br />
　　PARTITION BY HASH(salesman_id)<br />
　　PARTITIONS 4<br />
　　STORE IN (users, TOOLS, TEST, TABLESPACE1);　　--表空间<br />
　　CREATE TABLE sales_hash<br />
　　(salesman_id NUMBER(5),<br />
　　salesman_name VARCHAR2(30),<br />
　　sales_amount NUMBER(10),<br />
　　week_no NUMBER(2))<br />
　　PARTITION BY HASH(salesman_id)<br />
　　(<br />
　　PARTITION p1 tablespace users,<br />
　　PARTITION p2 tablespace system<br />
　　);<br />
　　<span style="color: red">Composite Partitioning:<br />
　　先按照range分区，每个子分区又按照list or hash分区。<br />
</span>　　CREATE TABLE sales_composite<br />
　　(salesman_id NUMBER(5),<br />
　　salesman_name VARCHAR2(30),<br />
　　sales_amount NUMBER(10),<br />
　　sales_date DATE)<br />
　　PARTITION BY RANGE(sales_date)<br />
　　SUBPARTITION BY HASH(salesman_id)　　--子分区<br />
　　SUBPARTITION TEMPLATE(<br />
　　SUBPARTITION sp1 TABLESPACE da<wbr>ta1,<br />
　　SUBPARTITION sp2 TABLESPACE da<wbr>ta2,<br />
　　SUBPARTITION sp3 TABLESPACE da<wbr>ta3,<br />
　　SUBPARTITION sp4 TABLESPACE da<wbr>ta4)<br />
　　(PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY'))<br />
　　PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY'))<br />
　　PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY'))<br />
　　PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY'))<br />
　　PARTITION sales_may2000 VALUES LESS THAN(TO_DATE('06/01/2000','DD/MM/YYYY')));<br />
　　使用TEMPLATE，oracle会这样命名子分区：分区_子分区，比如sales_jan2000_sp1表示将数据放在da<wbr>ta1表空间<br />
　　Range-list:<br />
　　CREATE TABLE bimonthly_regional_sales<br />
　　(deptno NUMBER,<br />
　　item_no VARCHAR2(20),<br />
　　txn_date DATE,<br />
　　txn_amount NUMBER,<br />
　　state VARCHAR2(2))<br />
　　PARTITION BY RANGE (txn_date)<br />
　　SUBPARTITION BY LIST (state)<br />
　　SUBPARTITION TEMPLATE(<br />
　　SUBPARTITION east VALUES('NY', 'VA', 'FL') TABLESPACE system,<br />
　　SUBPARTITION west VALUES('CA', 'OR', 'HI') TABLESPACE users,<br />
　　SUBPARTITION central VALUES('IL', 'TX', 'MO') TABLESPACE tools)<br />
　　( PARTITION janfeb_2000 VALUES LESS THAN (TO_DATE('1-03-2000','DD-Mm-YYYY')), PARTITION marapr_2000 VALUES LESS THAN (TO_DATE('1-05-2000','DD-Mm-YYYY')), PARTITION mayjun_2000 VALUES LESS THAN (TO_DATE('1-07-2000','DD-Mm-YYYY')) )</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/340514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-12-13 15:19 <a href="http://www.blogjava.net/xzclog/archive/2010/12/13/340514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nologging和insert /*+append*/ </title><link>http://www.blogjava.net/xzclog/archive/2010/12/07/340006.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 07 Dec 2010 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/12/07/340006.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/340006.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/12/07/340006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/340006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/340006.html</trackback:ping><description><![CDATA[<div>alter table test nologging<br />
insert /*+ append */ into test select</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>ask tom上有过一篇文章，是说Oracle实际上需要满足表是nologging和insert /*+append*/两个条件才真正实现nologging的</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>在insert数据量很大的时候（千万级），减少redo的产生对性能应该有很大的提高。<br />
这是一个使用append和nologging对redo产生情况的实验。</div>
<div>结论：<br />
-------------------------------<br />
一、非归档模式下：<br />
没有优化前&nbsp;&nbsp;&nbsp; （1281372&nbsp; redo size）<br />
1、单一的使用nologging参数，对redo的产生没有什么影响。&nbsp; （1214836&nbsp; redo size）<br />
2、单一的使用append提示，redo的减少很显著&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （43872&nbsp; redo size）<br />
3、nologging+append，更显著&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1108&nbsp; redo size）</div>
<div>二、归档模式下：<br />
没有优化前：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
1、单独使用nologging参数，（1231904&nbsp; redo size）<br />
2、单独使用append提示，&nbsp; （1245804&nbsp; redo size）<br />
3、nologging + append，&nbsp;&nbsp;&nbsp;&nbsp; （3748&nbsp; redo size）</div>
<div><br />
a、使用nologging参数并不代表在dml操作中，oracle不产生redo，只是对于指定表的更新数据不产生redo，但是oracle还是要记录这些操作，所以无论怎么优化，dml操作肯定要产生redo，但是使用这些参数对redo size的影响还是非常可观的。<br />
b、单独使用nologging参数，对redo size没有多少影响，只有和append配合时，才能产生效果。<br />
c、单独使用append提示，对redo的产生影响很大，这是我到现在都不明白的道理，按说append是绕过freelists，直接去寻找新块，能减少对freelists的争用，为什么会少这么多redo呢？<br />
d、归档模式和非归档模式下，参数影响不一样，尤其是单独使用append参数时，看来oracle对归档模式下出于安全考虑还是要多一些。 <br />
文章出处：<a href="http://www.diybl.com/course/7_databases/oracle/Oracleshl/2008810/135707.html">http://www.diybl.com/course/7_databases/oracle/Oracleshl/2008810/135707.html</a></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>1.Nologging的设置跟数据库的运行模式有关
<p>a.数据库运行在非归档模式下:</p>
<p>SQL&gt; archive log list;</p>
<p>Database log mode&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> No Archive Mode<br />
Automatic archival&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Enabled<br />
Archive destination&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> /opt/oracle/oradata/hsjf/archive<br />
Oldest online log sequence&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 155<br />
Current log sequence&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 157</p>
<p>SQL&gt; @redo</p>
<p>SQL&gt; create table test as select * from dba_objects where 1=0;</p>
<p>Table created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 63392</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 1150988</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 1152368</p>
<p>SQL&gt; select (1152368 -1150988) redo_append,(1150988 -63392) redo from dual;</p>
<p>REDO_APPEND&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> REDO<br />
----------- ----------<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1380&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1087596</p>
<p>SQL&gt; drop table test;</p>
<p>Table dropped.&nbsp;<wbr></p>
<p>我们看到在Noarchivelog模式下,对于常规表的insert append只产生少量redo</p>
<p>b.在归档模式下</p>
<p>SQL&gt; shutdown immediate</p>
<p>Database closed.<br />
Database dismounted.<br />
ORACLE instance shut down.</p>
<p>SQL&gt; startup mount</p>
<p>ORACLE instance started.</p>
<p>Total System Global Area&nbsp;<wbr> 235999908 bytes</p>
<p>Fixed Size&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 451236 bytes<br />
Variable Size&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 201326592 bytes<br />
Database Buffers&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 33554432 bytes<br />
Redo Buffers&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 667648 bytes<br />
Database mounted.</p>
<p>SQL&gt; alter database archivelog;</p>
<p>Database altered.</p>
<p>SQL&gt; alter database open;</p>
<p>Database altered.</p>
<p>SQL&gt; @redo</p>
<p>SQL&gt; create table test as select * from dba_objects where 1=0;</p>
<p>Table created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 56288</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 1143948</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 2227712</p>
<p>SQL&gt; select (2227712 -1143948) redo_append,(1143948 -56288) redo from dual;</p>
<p>REDO_APPEND&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> REDO<br />
----------- ----------<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1083764&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1087660</p>
<p>SQL&gt; drop table test;</p>
<p>Table dropped.&nbsp;<wbr></p>
<p>我们看到在归档模式下,对于常规表的insert append产生和insert同样的redo<br />
此时的insert append实际上并不会有性能提高.<br />
但是此时的append是生效了的</p>
<p>通过Logmnr分析日志得到以下结果:</p>
<p>SQL&gt; select operation,count(*)<br />
&nbsp;<wbr> 2&nbsp;<wbr> from v$logmnr_contents<br />
&nbsp;<wbr> 3&nbsp;<wbr> group by operation;</p>
<p>OPERATION&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> COUNT(*)<br />
-------------------------------- ----------<br />
COMMIT&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 17<br />
DIRECT INSERT&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 10470&nbsp;<wbr><br />
INTERNAL&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 49<br />
START&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 17</p>
<p>我们注意到这里是DIRECT INSERT,而且是10470条记录,也就是每条记录都记录了redo.</p>
<p>2.对于Nologging的table的处理</p>
<p>a. 在归档模式下:</p>
<p>SQL&gt; create table test nologging as select * from dba_objects where 1=0;</p>
<p>Table created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 2270284</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 3357644</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 3359024</p>
<p>SQL&gt; select (3359024 -3357644) redo_append,(3357644 - 2270284) redo from dual;</p>
<p>REDO_APPEND&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> REDO<br />
----------- ----------<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1380&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1087360</p>
<p>SQL&gt; drop table test;</p>
<p>Table dropped.&nbsp;<wbr>&nbsp;<wbr></p>
<p>我们注意到,只有append才能减少redo</p>
<p>b.在非归档模式下:</p>
<p>SQL&gt; shutdown immediate</p>
<p>Database closed.<br />
Database dismounted.<br />
ORACLE instance shut down.</p>
<p>SQL&gt; startup mount</p>
<p>ORACLE instance started.</p>
<p>Total System Global Area&nbsp;<wbr> 235999908 bytes<br />
Fixed Size&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 451236 bytes<br />
Variable Size&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 201326592 bytes<br />
Database Buffers&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 33554432 bytes<br />
Redo Buffers&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 667648 bytes<br />
Database mounted.</p>
<p>SQL&gt; alter database noarchivelog;</p>
<p>Database altered.</p>
<p>SQL&gt; alter database open;</p>
<p>Database altered.</p>
<p>SQL&gt; @redo</p>
<p>SQL&gt; create table test nologging as select * from dba_objects where 1=0;</p>
<p>Table created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 56580</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 1144148</p>
<p>SQL&gt;</p>
<p>SQL&gt; insert into test select * from dba_objects;</p>
<p>10470 rows created.</p>
<p>SQL&gt; select * from redo_size;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> VALUE<br />
----------<br />
&nbsp;<wbr>&nbsp;<wbr> 1145528</p>
<p>SQL&gt; select (1145528 -1144148) redo_append,(1144148 -56580) redo from dual;</p>
<p>REDO_APPEND&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> REDO<br />
----------- ----------<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1380&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1087568</p>
<p>SQL&gt;<br />
</p>
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/340006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-12-07 17:24 <a href="http://www.blogjava.net/xzclog/archive/2010/12/07/340006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 10g for HP Itanium 11.31 raw 安装配置文档</title><link>http://www.blogjava.net/xzclog/archive/2010/12/03/339747.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 03 Dec 2010 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/12/03/339747.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/339747.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/12/03/339747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/339747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/339747.html</trackback:ping><description><![CDATA[<p>oracle 10g for hp HP-UX Itanium 11.31 installation<br />
标签：hp-ux上安装oracle10g &nbsp;&nbsp;<br />
<br />
1，硬件信息检验：<br />
/usr/sbin/dmesg | grep "Physical:" 确定物理RAM高于1000M<br />
/usr/sbin/swapinfo -a&nbsp;&nbsp; 确定交换分区有没有空间<br />
bdf /tmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 确定tmp的空闲空间，要保障在400M以上<br />
（扩展/tmp要到init 1但用户状态去umount掉，<br />
lvextend -L 800 /dev/vg00/lvol5(/tmp所在的lv) /dev/dsk/盘号）<br />
extendfs -F vxfs /dev/vg00/lvol5）<br />
bdf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 确定磁盘大小，需要2个大于4.7G的磁盘系统<br />
# /bin/getconf KERNEL_BITS&nbsp;&nbsp; 确定系统是否64位<br />
<br />
2，检查软件需求：<br />
uname -a 检查操作系统版本：必须是hp-ux 11i v3<br />
&nbsp;&nbsp; show_patches|grep PHKL_40240<br />
&nbsp;&nbsp; show_patches|grep PHKL_39624<br />
&nbsp;&nbsp; show_patches|grep PHKL_39625<br />
注：hp Unix patch 每个季度都会有更新</p>
<p>确定hp 系统patch已经打上，如果没有，到itrc找到patch打上。<br />
（swinstall -s 完全路径。先解析，再install）<br />
3，java -version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看java版本。必须安装Java版本SDK1.4.2。<br />
（如果不能直接打出，把/opt/java1.4/bin/:加入 /.profile的PATH=中，再加入<br />
export JAVA_HOME=/opt/java1.4）</p>
<p><br />
4，创建需要的UNIX组和用户</p>
<p><br />
#/usr/sbin/groupadd oinstall<br />
#/usr/sbin/groupadd dba</p>
<p>创建oracle用户：<br />
#/usr/sbin/useradd -g oinstall -G dba &#8211;m oracle<br />
passwd oracle</p>
<p><br />
<br />
5，创建必需目录：<br />
mkdir /orabin <br />
mkdir -p /orabin/oracle</p>
<p>mkdir /archive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
chmod -R 775 /orabin /archive<br />
chown oracle:dba /orabin<br />
chown oracle:dba /archive</p>
<p>6，配置内核参数：<br />
6.1 Kernel需求表：<br />
Parameter Recommended Formula or Value<br />
ksi_alloc_max (nproc*8) --32768<br />
max_thread_proc 256<br />
maxdsiz 1073741824 (1 GB)<br />
maxdsiz_64bit 2147483648 (2 GB)<br />
Oracle Database 21<br />
maxssiz 134217728 (128 MB)<br />
maxssiz_64bit 1073741824 (1 GB)<br />
maxswapchunks 16384&nbsp;&nbsp;&nbsp; --<br />
maxuprc ((nproc*9)/10) --3687<br />
msgmap (2+msgmni)<br />
msgmni 4096<br />
msgseg 32767<br />
msgtql 4096<br />
ncsize (ninode+vx_ncsize) 34816<br />
nfile (15*nproc+2048) 61664<br />
nflocks 4096<br />
ninode (8*nproc+2048) 34816<br />
nkthread (((nproc*7)/4)+16) 7184<br />
nproc 4096<br />
semmap (semmni+2)<br />
semmni 4096<br />
semmns (semmni*2)<br />
semmnu (nproc-4)<br />
semvmx 32767<br />
shmmax The size of physical memory (0X40000000) or<br />
1073741824, whichever is greater.<br />
shmmni 512<br />
shmseg 120<br />
vps_ceiling 64<br />
（参数含义请看参数说明）<br />
#调整内核参数<br />
6.2 #kctune 查内核参数<br />
kctune -h -B nproc="4200"<br />
kctune -h -B ksi_alloc_max="33600"<br />
kctune -h -B max_thread_proc="1100"<br />
kctune -h -B maxdsiz="1073741824"<br />
kctune -h -B maxdsiz_64bit="4294967296"<br />
kctune -h -B maxssiz="134217728"<br />
kctune -h -B maxssiz_64bit="1073741824"<br />
kctune -h -B maxuprc="3688"<br />
kctune -h -B msgmni="4096"<br />
kctune -h -B msgtql="4096"<br />
kctune -h -B ncsize="35840" <br />
kctune -h -B nflocks="4096"<br />
kctune -h -B ninode="34816"<br />
kctune -h -B nkthread="8416"<br />
kctune -h -B semmni="8192"<br />
kctune -h -B semmns="16384"<br />
kctune -h -B semmnu="4092"<br />
kctune -h -B semvmx="32767"<br />
kctune -h -B shmmax="34359738368" <br />
kctune -h -B shmmni="512"<br />
kctune -h -B shmseg="300"<br />
kctune -h -B vps_ceiling="64"</p>
<p><br />
如果更改了制定的static参数。需重建kernel和重起系统。<br />
重起系统，用root登录</p>
<p>&nbsp;</p>
<p><br />
7，把安装盘mount上(把安装介质传上去)<br />
<br />
用oracle用户登录，并修改oracle用户的环境（shell）<br />
7.1、打开另一个会话终端<br />
7.2、输入命令并确定是否可以用在终端输出图形化界面：<br />
$ xhost +<br />
7.3、完成一下步骤：<br />
&nbsp;&nbsp; 在这里安装oracle，切换到oracle用户。$ su - oracle<br />
7.4、输入命令确定oracle的默认SHELL<br />
#echo $SHELL<br />
/sbin/sh(每个用户所使用的sh都不一样)</p>
<p>8，更改环境变量：<br />
$ vi .profile<br />
加入以下行：<br />
export ORACLE_BASE=/orabin/oracle<br />
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0.1/db_1<br />
export PATH=:$ORACLE_HOME/bin:$PATH:$ORACLE_HOME/OPatch<br />
export NLS_LANG=american_america.zhs16gbk<br />
export ORACLE_SID=oracle</p>
<p><br />
9，编辑好之后logout再 su &#8211; oracle<br />
$echo $ORACLE_HOME<br />
输出ORACLE_HOME的路径<br />
<br />
安装ORACLE软件：<br />
拷贝文件到一个文件系统下，例如：/file/database</p>
<p>注意到用户和组为oracle:dba<br />
如果不是执行：<br />
chown &#8211;R oracle:dba database 把他所属用户为oracle所属组为dba<br />
chmod &#8211;R 775 databse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更改他的执行权限为755<br />
export DISPLAY= 192.168.61.222:0.0<br />
xhost +<br />
su &#8211; oracle 切换到oracle用户<br />
echo $DISPLAY 查看输出目录</p>
<p>如果不是本机的IP地址，执行：<br />
export DISPLAY=LOCALHOST_IP:0.0<br />
然后进入oracle_databse所在目录，进行安装oracle<br />
cd /file/databse<br />
./ runInstaller -ignoreSysPreReqs</p>
<p>10，如果提示swap分区不够大，做如下操作：<br />
vgdisplay &#8211;v 看看哪个disk上还有空余的空间。（free要*pe值）<br />
lvcreate &#8211;L xxx(需要临时swap分区的大小) &#8211;n myswap(lv名字) vg00(所在的vg名)</p>
<p>newfs -F vxfs -o largefiles /dev/vg01/rmyswap(注意lv名前有r)<br />
swapon /dev/vg00 /myswap</p>
<p>11，安装完成之后，需要用root用户run两个脚本<br />
再打开一个会话窗口，执行：<br />
/orabin/oracle/oraInventory/orainstRoot.sh<br />
/orabin/oracle/product/10.2.0.1/root.sh</p>
<p><br />
12，上传 oracle 10.2.0.4补丁<br />
以同样的方法安装oracle 10.2.0.4 补丁</p>
<p>&nbsp;</p>
<p><br />
13，配置监听:<br />
netca</p>
<p><br />
14， 建库<br />
dbca<br />
<br />
使用裸设备<br />
14.1 先创建裸设备<br />
lvcreate -L 6000 -n system01.dbf vg00<br />
lvcreate -L 5000 -n users01.dbf vg00<br />
lvcreate -L 5000 -n temp01.dbf vg00<br />
lvcreate -L 2000 -n undotbs01.dbf vg00<br />
lvcreate -L 2000 -n undotbs02.dbf vg00<br />
lvcreate -L 50 -n control01.ctl vg00<br />
lvcreate -L 50 -n control02.ctl vg00<br />
lvcreate -L50 -n control03.ctl vg00<br />
lvcreate -L 500 -n redo01.log vg00<br />
lvcreate -L 500 -n redo02.log vg00<br />
lvcreate -L 500 -n redo03.log vg00<br />
lvcreate -L 5000 -n sysaux01.dbf vg00<br />
lvcreate -L 50 -n spfileoracle.ora vg00</p>
<p><br />
14.2 改变裸设备的权限为oracle：dba<br />
chown oracle:dba /dev/vg00/rsystem01.dbf<br />
chown oracle:dba /dev/vg00/rusers01.dbf <br />
chown oracle:dba /dev/vg00/rtemp01.dbf <br />
chown oracle:dba /dev/vg00/rundotbs01.dbf <br />
chown oracle:dba /dev/vg00/rcontrol01.ctl <br />
chown oracle:dba /dev/vg00/rcontrol02.ctl <br />
chown oracle:dba /dev/vg00/rcontrol03.ctl <br />
chown oracle:dba /dev/vg00/rredo01.log <br />
chown oracle:dba /dev/vg00/rredo02.log <br />
chown oracle:dba /dev/vg00/rredo03.log <br />
chown oracle:dba /dev/vg00/rsysaux01.dbf <br />
chown oracle:dba /dev/vg00/rspfileoracle.ora</p>
<p>14.3 创建软连接<br />
ln -s /dev/vg00/rspfileoracle.ora /orabin/product/10.2.0.1/db_1/dbs/spfileoracle .ora<br />
ln -s /dev/vg00/rsystem01.dbf /orabin/oradata/oracle/system01.dbf<br />
ln -s /dev/vg00/rusers01.dbf /orabin/oradata/oracle/users01.dbf<br />
ln -s /dev/vg00/rtemp01.dbf /orabin/oradata/oracle/temp01.dbf<br />
ln -s /dev/vg00/rundotbs01.dbf /orabin/oradata/oracle/undotbs01.dbf<br />
ln -s /dev/vg00/rundotbs02.dbf /orabin/oradata/oracle/undotbs02.dbf<br />
ln -s /dev/vg00/rcontrol01.ctl /orabin/oradata/oracle/control01.ctl<br />
ln -s /dev/vg00/rcontrol02.ctl /orabin/oradata/oracle/control02.ctl<br />
ln -s /dev/vg00/rcontrol03.ctl /orabin/oradata/oracle/control03.ctl<br />
ln -s /dev/vg00/rredo01.log /orabin/oradata/oracle/redo01.log<br />
ln -s /dev/vg00/rredo02.log /orabin/oradata/oracle/redo02.log<br />
ln -s /dev/vg00/rredo03.log /orabin/oradata/oracle/redo03.log<br />
ln -s /dev/vg00/rsysaux01.dbf /orabin/oradata/oracle/sysaux01.dbf</p>
<p>&nbsp;</p>
<p>14.4 查看裸设备的权限和属组<br />
# ll /dev/vg00/r*<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000017 Dec 3 15:26 /dev/vg00/rarchive<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x00000f Dec 3 15:10 /dev/vg00/rcontrol01.ctl<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000010 Dec 3 15:10 /dev/vg00/rcontrol02.ctl<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000011 Dec 3 15:10 /dev/vg00/rcontrol03.ctl<br />
brw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000012 Dec 3 15:10 /dev/vg00/redo01.log<br />
brw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000013 Dec 3 15:10 /dev/vg00/redo02.log<br />
brw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000014 Dec 3 15:10 /dev/vg00/redo03.log<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000001 Dec 3 11:44 /dev/vg00/rlvol1<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000002 Dec 3 11:44 /dev/vg00/rlvol2<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000003 Dec 3 11:44 /dev/vg00/rlvol3<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000004 Dec 3 11:44 /dev/vg00/rlvol4<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000005 Dec 3 11:44 /dev/vg00/rlvol5<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000006 Dec 3 11:44 /dev/vg00/rlvol6<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000007 Dec 3 11:44 /dev/vg00/rlvol7<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000008 Dec 3 11:44 /dev/vg00/rlvol8<br />
crw-r-----&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000009 Dec 3 15:10 /dev/vg00/roraclebin<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000012 Dec 3 15:10 /dev/vg00/rredo01.log<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000013 Dec 3 15:10 /dev/vg00/rredo02.log<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000014 Dec 3 15:10 /dev/vg00/rredo03.log<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000016 Dec 3 15:10 /dev/vg00/rspfileoracle.ora<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x000015 Dec 3 15:10 /dev/vg00/rsysaux01.dbf<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x00000a Dec 3 15:10 /dev/vg00/rsystem01.dbf<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x00000c Dec 3 15:10 /dev/vg00/rtemp01.dbf<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x00000d Dec 3 15:10 /dev/vg00/rundotbs01.dbf<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x00000e Dec 3 15:10 /dev/vg00/rundotbs02.dbf<br />
crw-r-----&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64 0x00000b Dec 3 15:10 /dev/vg00/rusers01.dbf<br />
14.5 查看链接文件的权限和属组<br />
/orabin/oradata/oracle<br />
# ll<br />
total 0<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 Dec 4 11:09 control01.ctl -&gt; /dev/vg00/rcontrol01.ctl<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 Dec 4 11:09 control02.ctl -&gt; /dev/vg00/rcontrol02.ctl<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 Dec 4 11:09 control03.ctl -&gt; /dev/vg00/rcontrol03.ctl<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21 Dec 4 11:09 redo01.log -&gt; /dev/vg00/rredo01.log<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21 Dec 4 11:09 redo02.log -&gt; /dev/vg00/rredo02.log<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21 Dec 4 11:09 redo03.log -&gt; /dev/vg00/rredo03.log<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23 Dec 4 11:09 sysaux01.dbf -&gt; /dev/vg00/rsysaux01.dbf<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23 Dec 4 11:09 system01.dbf -&gt; /dev/vg00/rsystem01.dbf<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21 Dec 4 11:09 temp01.dbf -&gt; /dev/vg00/rtemp01.dbf<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 Dec 4 11:09 undotbs01.dbf -&gt; /dev/vg00/rundotbs01.dbf<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 Dec 4 11:09 undotbs02.dbf -&gt; /dev/vg00/rundotbs02.dbf<br />
lrwxrwxrwx&nbsp;&nbsp; 1 oracle&nbsp;&nbsp;&nbsp;&nbsp; oinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22 Dec 4 11:09 users01.dbf -&gt; /dev/vg00/rusers01.dbf</p>
<p>根据提示选择数据库名（oracle），sys密码（和主机名一样），选择control，datafile，redofile以及spfile的路径</p>
<p><br />
15 把数据库变为归档模式</p>
<p>sqlplus 下执行：<br />
alter system set log_archive_start= TRUE scope=spfile;<br />
alter system set log_archive_dest_1="LOCATION=/archive" scope=spfile;<br />
shutdown immediate;<br />
alter database archivelog;<br />
alter database open ;</p>
<p>show parameter archive;</p>
<p><br />
测试：<br />
alter system switch logfile;<br />
/<br />
/<br />
/<br />
到/archive 目录下查看是否已经归档<br />
<br />
<br />
16 用客户端和网页或者第三方软件连接oracle<br />
测试成功！<br />
finish!<br />
archive log list; <br />
shutdown immediate;<br />
startup mount; <br />
alter database archivelog;<br />
alter database open <br />
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/oracle/oradata/express/archive';<br />
shutdown immediate;<br />
startup<br />
如果是oracle9i，还需要更改如下参数：<br />
alter system set log_archive_start=true scope=spfile;<br />
但是如果在10g中也更改这些参数，数据库重启时会有如下提示：<br />
ORA-32004: obsolete and/or deprecated parameter(s) specified<br />
alter system set log_archive_format='%t_%s.dbf' scope=spfile;<br />
但是如果在10g中也更改这些参数，数据库会不能启动，如下提示：<br />
ORA-32004: obsolete and/or deprecated parameter(s) specified<br />
ORA-19905: log_archive_format must contain %s, %t and %r</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/339747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-12-03 20:45 <a href="http://www.blogjava.net/xzclog/archive/2010/12/03/339747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>预安装RAC的ServiceGuard配置 </title><link>http://www.blogjava.net/xzclog/archive/2010/12/01/339543.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 01 Dec 2010 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/12/01/339543.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/339543.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/12/01/339543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/339543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/339543.html</trackback:ping><description><![CDATA[<div class="storytext">
<p>1． 以root用户修改/etc/lvmrc文件<br />
对应需要做成共享的VG，先要求关闭其开机自动active的设置。<br />
你必须保证这些VG在SG启动的时候激活。<br />
备份/etc/lvmrc文件<br />
# cp /etc/lvmrc /etc/lvmrc_orig<br />
修改/etc/lvmrc文件<br />
From:<br />
AUTO_VG_ACTIVATE=1<br />
To:<br />
AUTO_VG_ACTIVATE=0</p>
<br />
在文件/etc/lvmrc 中添加custom_vg_activation功能模块，<br />
此处为非shared的VG设置。（也可以不做）<br />
custom_vg_activation()<br />
{<br />
# e.g. /sbin/vgchange -a y -s<br />
# parallel_vg_sync "/dev/vg00 /dev/vg01"<br />
# parallel_vg_sync "/dev/vg02 /dev/vg03"<br />
/sbin/vgchange -a y vg00<br />
/sbin/vgchange -a y vg01<br />
/sbin/vgchange -a y vg02<br />
/sbin/vgchange -a y vg03<br />
return 0<br />
}
<p>2．创建共享逻辑卷组<br />
主节点上：<br />
# 初始化PV<br />
pvcreate -f /dev/rdsk/c0t12d0<br />
# 在/dev目录添加用于VG的目录<br />
mkdir /dev/vg_ops<br />
# Major number必须为64，minor number是2为16进制数字，作为唯一标识<br />
mknod /dev/vg_ops/group c 64 0x060000<br />
# 创建VG<br />
vgcreate /dev/vg_ops /dev/dsk/c0t12d0<br />
# 激活VG<br />
vgchange -a y vg_ops <br />
# 创建LV<br />
lvcreate -n P901_control_01.ctl -L 110 /dev/vg_ops <br />
lvcreate -n P901_control_02.ctl -L 110 /dev/vg_ops<br />
lvcreate -n P901_control_03.ctl -L 110 /dev/vg_ops<br />
lvcreate -n P901_system_01.dbf -L 400 /dev/vg_ops<br />
lvcreate -n P901_log1_01.log -L 120 /dev/vg_ops<br />
lvcreate -n P901_log1_02.log -L 120 /dev/vg_ops<br />
lvcreate -n P901_log1_03.log -L 120 /dev/vg_ops<br />
lvcreate -n P901_log2_01.log -L 120 /dev/vg_ops<br />
lvcreate -n P901_log2_02.log -L 120 /dev/vg_ops<br />
lvcreate -n P901_log2_03.log -L 120 /dev/vg_ops<br />
lvcreate -n P901_spfile1.dbf -L 5 /dev/vg_ops<br />
lvcreate -n P901_users_01.dbf -L 120 /dev/vg_ops<br />
lvcreate -n P901_temp_01.dbf -L 100 /dev/vg_ops<br />
lvcreate -n P901_undotbs_01.dbf -L 312 /dev/vg_ops<br />
lvcreate -n P901_undotbs_02.dbf -L 312 /dev/vg_ops<br />
lvcreate -n P901_example_01.dbf -L 160 /dev/vg_ops<br />
lvcreate -n P901_cwmlite_01.dbf -L 100 /dev/vg_ops<br />
lvcreate -n P901_indx_01.dbf -L 70 /dev/vg_ops<br />
lvcreate -n P901_tools_01.dbf -L 20 /dev/vg_ops<br />
lvcreate -n P901_drsys_01.dbf -L 90 /dev/vg_ops <br />
<br />
# 解除VG的active状态<br />
vgchange -a n vg_ops<br />
# 创建LV的map文件<br />
vgexport -v -s -p -m /tmp/vg_ops.map /dev/vg_ops<br />
# 复制map文件到其它节点<br />
rcp /tmp/vg_ops.map opcbhp2:/tmp/vg_ops.mapOn the other nodes:<br />
mkdir /dev/vg_ops<br />
mknod /dev/vg_ops/group c 64 0x060000<br />
# 在其它节点创建VG和LV<br />
vgimport -v -s -m /tmp/vg_ops.map /dev/vg_ops <br />
# 在所有节点配置相应VG和LV的权限和属主<br />
# chown oracle:dba /dev/vg_ops/r*<br />
# remsh nodehp2 chown oracle:dba /dev/vg_ops/r*<br />
# chmod 777 /dev/vg_ops<br />
# remsh nodehp2 chmod 777 /dev/vg_ops<br />
# chmod 660 /dev/vg_ops/r*<br />
# remsh nodehp2 chmod 660 /dev/vg_ops/r* <br />
Note: 在创建VG的时候，要注意minor number的唯一性，常用以下命令：<br />
# find /dev -name group -exec ls -l {} ; <br />
crw------- 1 root sys 64 0x060000 May 6 07:52 /dev/vg_ops/group <br />
在该例子中"vg_ops"为"0x060000"，所以"0x060000"不能用于创建其它VG，合法的minor numbers的范围是从"0x010000"到"0xFF0000"。</p>
<p>3．集群软件ServiceGuard的安装<br />
由供应商安装，Oracle 10gR2的RAC要求Serviceguard Extension for RAC的版本必须A.11.16.00以上，也包含A.11.16.00版本。<br />
4．规划集群环境<br />
1）配置集群：<br />
使用cmquerycl去创建一个集群配置文件<br />
Cmquerycl命令必须在主节点上进行<br />
# cmquerycl -v -C /etc/cmcluster/cmclconf.ascii -n nodehp1 -n nodehp2<br />
2）修改集群配置文件<br />
CLUSTER_NAME # example nodehp<br />
FIRST_CLUSTER_LOCK # /dev/vg_ops<br />
FIRST_CLUSTER_PV # /dev/dsk/c0t12d0<br />
OPS_VOLUME_GROUP # /dev/vg_ops<br />
DLM_ENABLED # NO<br />
GMS_ENABLED # NO<br />
FIRST_CLUSTER_LOCK, FIRST_CLUSTER_PV = 集群lock卷组和磁盘作为表决用途。表决VG和磁盘必须能被所有节点访问（用共享VG就可以）。一个节点倒掉，会要求表决VG的处理。<br />
OPS_VOLUME_GROUP = 所有共享VG<br />
DLM_ENABLED and GMS_ENABLED = NO (8.1.7版本以后均设为NO)<br />
3）使用cmcheckconf命令验证集群配置文件<br />
# cmcheckconf -v -C /etc/cmcluster/cmclconf.ascii <br />
4）使用vgchange来激活lock卷组<br />
# vgchange -a y vg_ops<br />
5）使用cmapplyconf复制集群配置文件到所有节点<br />
# cmapplyconf -v -C /etc/cmcluster/cmclconf.ascii <br />
6）使用vgchange解除lock卷组的激活状态<br />
# vgchange -a n vg_ops</p>
<p>5．基本集群管理<br />
1）启动集群：<br />
# cmruncl<br />
2）使用vgchange在主节点设置共享VG<br />
# vgchange -S y -c y vg_ops<br />
3）使用vgchange在每个节点激活共享VG<br />
# vgchange -a s vg_ops<br />
# remsh nodehp2 /usr/sbin/vgchange -a s vg_ops<br />
4）使用cmhaltcl关闭集群或者使用cmhaltnode从集群移除节点<br />
# cmhaltnode<br />
5）使用cmrunnode添加节点到集群<br />
# cmrunnode<br />
6）使用cmhaltpkg，cmrunpkg及cmmodpkg管理集群的pkg，也可用于集群节点的恢复，可参照在线手册使用。</p>
<p>6．Log Files for Cluster<br />
/var/adm/syslog/syslog.log包含HP Serviceguard Extension for RAC的系统信息</p>
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/339543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-12-01 20:22 <a href="http://www.blogjava.net/xzclog/archive/2010/12/01/339543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL_TRACE的使用</title><link>http://www.blogjava.net/xzclog/archive/2010/11/13/337985.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 13 Nov 2010 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/11/13/337985.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/337985.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/11/13/337985.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/337985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/337985.html</trackback:ping><description><![CDATA[<p>&#8220;SQL TRACE&#8221;是Oracle提供的用于进行SQL跟踪的手段，是强有力的辅助诊断工具。在日常的数据库问题诊断和解决中，&#8220;SQL TRACE&#8221;是非常常用的方法。</p>
<p>一般，一次跟踪可以分为以下几步：</p>
<p>1、界定需要跟踪的目标范围，并使用适当的命令启用所需跟踪。</p>
<p>&nbsp;<wbr></p>
<p>2、经过一段时间后，停止跟踪。此时应该产生了一个跟踪结果文件。</p>
<p>&nbsp;<wbr></p>
<p>3、找到跟踪文件，并对其进行格式化，然后阅读或分析。</p>
<p>&nbsp;<wbr></p>
<p>本文就&#8220;SQL TRACE&#8221;的这些使用作简单探讨，并通过具体案例对SQL_TRACE的使用进行说明。</p>
<p>&nbsp;<wbr></p>
<p><strong>一、&#8220;</strong><strong>SQL TRACE</strong><strong>&#8221;的启用。</strong></p>
<p><strong>(A)SQL_TRACE</strong><strong>说明</strong></p>
<p>SQL_TRACE可以作为初始化参数在全局启用，也可以通过命令行方式在具体session启用。</p>
<p>&nbsp;<wbr></p>
<p><strong>1</strong><strong>．</strong><strong>在全局启用</strong></p>
<p>在参数文件(pfile/spfile)中指定:&nbsp;<wbr>SQL_TRACE = true</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>在全局启用SQL_TRACE会导致所有进程的活动被跟踪，包括后台进程及所有用户进程，这通常会导致比较严重的性能问题，所以在生产环境中要谨慎使用。</p>
<p>提示: 通过在全局启用SQL_TRACE，我们可以跟踪到所有后台进程的活动，很多在文档中的抽象说明，通过跟踪文件的实时变化，我们可以清晰的看到各个进程之间的紧密协调。</p>
<p>&nbsp;<wbr></p>
<p><strong>2</strong><strong>．</strong><strong>在当前session</strong><strong>级设置</strong></p>
<p>大多数时候我们使用SQL_TRACE跟踪当前会话的进程。通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效)，研究SQL执行，发现后台错误等。</p>
<p>在session级启用和停止SQL_TRACE方式如下:</p>
<p>启用当前session的跟踪:</p>
<p>SQL&gt; alter session set SQL_TRACE=true;</p>
<p>Session altered.</p>
<p>&nbsp;<wbr></p>
<p>此时的SQL操作将被跟踪:</p>
<p>&nbsp;<wbr></p>
<p>SQL&gt; select count(*) from dba_users;</p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>COUNT(*)</p>
<p>----------</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>34</p>
<p>&nbsp;<wbr></p>
<p>结束跟踪:</p>
<p>SQL&gt; alter session set SQL_TRACE=false;</p>
<p>Session altered.</p>
<p>&nbsp;<wbr></p>
<p><strong>3</strong><strong>．</strong><strong>跟踪其它用户进程</strong></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>在很多时候我们需要跟踪其他用户的进程，而不是当前用户，这可以通过Oracle提供的系统包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION来完成</p>
<p>通过v$session我们可以获得sid、serial#等信息:</p>
<p>获得进程信息，选择需要跟踪的进程:</p>
<p>SQL&gt; select sid,serial#,username from v$session <a onclick="javascript:tagshow(event, 'where');" href="javascript:;" target="_self"><u><strong>where</strong></u></a> username =&#8217;***&#8217;</p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>SID&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>SERIAL#&nbsp;<wbr>USERNAME</p>
<p>---------- ---------- ------------------------------</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>8&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>2041&nbsp;<wbr>SYS</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>9&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>437&nbsp;<wbr>EYGLE</p>
<p>设置跟踪:</p>
<p>SQL&gt; exec dbms_system.set_SQL_TRACE_in_session(9,437,true)</p>
<p>PL/SQL procedure successfully completed.</p>
<p>&#8230;.</p>
<p>可以等候片刻，跟踪session执行任务,捕获sql操作&#8230;</p>
<p>&#8230;.</p>
<p>停止跟踪:</p>
<p>SQL&gt; exec dbms_system.set_SQL_TRACE_in_session(9,437,false)</p>
<p>PL/SQL procedure successfully completed.</p>
<p>&nbsp;<wbr></p>
<p><strong>(B) 10046</strong><strong>事件说明</strong></p>
<p>10046事件是Oracle提供的内部事件，是对SQL_TRACE的增强.</p>
<p>10046事件可以设置以下四个级别:</p>
<p>1 - 启用标准的SQL_TRACE功能,等价于SQL_TRACE。</p>
<p>4 - Level 1 加上绑定值(bind values)</p>
<p>8 - Level 1 + 等待事件跟踪</p>
<p>12 - Level 1 + Level 4 + Level 8</p>
<p>&nbsp;<wbr></p>
<p>类似SQL_TRACE方法，10046事件可以在全局设置，也可以在session级设置。</p>
<p>对于10046事件的设置，涉及到了oracle的&#8220;诊断事件&#8221;的概念。</p>
<p>&nbsp;<wbr></p>
<p>可以参考以下链接了解详情。<a href="http://www.itpub.net/323537,1.html" target="_blank">http://www.itpub.net/323537,1.html</a>&nbsp;<wbr></p>
<p>1． 在全局设置</p>
<p>在参数文件中增加:</p>
<p>EVENT="10046 trace name context forever,level 12"</p>
<p>此设置对所有用户的所有进程生效、包括后台进程.</p>
<p>&nbsp;<wbr></p>
<p>2． 对当前session设置</p>
<p>通过alter session的方式修改，需要alter session的系统权限:</p>
<p>SQL&gt; alter session set events '10046 trace name context forever';</p>
<p>Session altered.</p>
<p>&nbsp;<wbr></p>
<p>SQL&gt; alter session set events '10046 trace name context forever, level 8';</p>
<p>Session altered.</p>
<p>&nbsp;<wbr></p>
<p>SQL&gt; alter session set events '10046 trace name context off';</p>
<p>Session altered.</p>
<p>&nbsp;<wbr></p>
<p>3． 对其他用户session设置</p>
<p>通过DBMS_SYSTEM.SET_EV系统包来实现:</p>
<p>&nbsp;<wbr></p>
<p>SQL&gt; desc DBMS_SYSTEM.SET_EV;</p>
<p>&nbsp;<wbr></p>
<p>Parameter Type&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>Mode Default?</p>
<p>--------- -------------- ---- --------</p>
<p>SI&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>BINARY_INTEGER IN&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></p>
<p>SE&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>BINARY_INTEGER IN&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></p>
<p>EV&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>BINARY_INTEGER IN&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></p>
<p>LE&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>BINARY_INTEGER IN&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></p>
<p>NM&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>VARCHAR2&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>IN&nbsp;<wbr>&nbsp;<wbr></p>
<p>其中的参数SI、SE来自v$session视图:</p>
<p>查询获得需要跟踪的session信息:</p>
<p>SQL&gt; select sid,serial#,username from v$session where username is not null;</p>
<p>SID SERIAL# USERNAME</p>
<p>---------- ---------- ------------------------------</p>
<p>8 2041 SYS</p>
<p>9 437 EYGLE</p>
<p>&nbsp;<wbr></p>
<p>执行跟踪:</p>
<p>SQL&gt; exec dbms_system.set_ev(9,437,10046,8,'eygle');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>&nbsp;<wbr></p>
<p>结束跟踪:</p>
<p>SQL&gt; exec dbms_system.set_ev(9,437,10046,0,'eygle');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>&nbsp;<wbr></p>
<p><strong>(C)</strong><strong>对启用方法的一些总结。</strong></p>
<p>因为trace的目标范围不同，导致必须使用不同的方法。</p>
<p>?nbsp;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>作用于数据库全局的，就改初始化参数。</p>
<p>?nbsp;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>只作用于本session的，就用alter session 命令。</p>
<p>?nbsp;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>作用于其它session的，就用DBMS_SYSTEM包。</p>
<p>&nbsp;<wbr></p>
<p>再加上10046诊断事件，是SQL_TRACE的增强，又多了一套方法。</p>
<p>&nbsp;<wbr></p>
<p><strong>二、获取跟踪文件</strong></p>
<p>以上生成的跟踪文件位于&#8220;user_dump_dest&#8221;参数所指定的目录中，位置及文件名可以通过以下SQL查询获得:</p>
<p>1.如果是查询当前session的跟踪文件，使用如下查询：</p>
<p>SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name&nbsp;<wbr></p>
<p>from&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>( select p.spid&nbsp;<wbr>from v$mystat m,v$session s, v$process p&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>( select t.instance from v$thread&nbsp;<wbr>t,v$parameter&nbsp;<wbr>v&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>( select value from v$parameter where name = 'user_dump_dest') d</p>
<p>&nbsp;<wbr></p>
<p>TRACE_FILE_NAME</p>
<p>-------------------------------------------------------------------------------</p>
<p>D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc</p>
<p>&nbsp;<wbr></p>
<p>2.如果是查询其他用户session的跟踪文件，则根据用户的sid和#serial使用如下查询：</p>
<p>SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name&nbsp;<wbr></p>
<p>from&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>( select p.spid&nbsp;<wbr>from v$session s, v$process p&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>where s.sid=&#8217;&#8217; and s. SERIAL#='' and p.addr = s.paddr) p,&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>( select t.instance from v$thread&nbsp;<wbr>t,v$parameter&nbsp;<wbr>v&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>( select value from v$parameter where name = 'user_dump_dest') d</p>
<p>&nbsp;<wbr></p>
<p>TRACE_FILE_NAME</p>
<p>-------------------------------------------------------------------------------</p>
<p>D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc</p>
<p>&nbsp;<wbr></p>
<p><strong>三、格式化跟踪文件。</strong></p>
<p>原始的跟踪文件是很难读懂的。需要使用oracle自带的tkprof命令行工具格式化一下。</p>
<p>SQL&gt;$tkprof D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.txt</p>
<p>这个就可以方便的阅读了。可以在hsjf_ora_1026.txt文件中看到所有的sql语句执行次数,CPU使用时间等数据。</p>
<p>&nbsp;<wbr></p>
<p>备注：可以通过以下方法读取当前已经设置的参数</p>
<p>对于全局的SQL_TRACE参数的设置，可以通过show parameter命令获得。</p>
<p>&nbsp;<wbr></p>
<p>当我们通过alter session的方式设置了SQL_TRACE,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取：</p>
<p>SQL&gt; set feedback off</p>
<p>SQL&gt; set serveroutput on</p>
<p>SQL&gt; declare</p>
<p>2 event_level number;</p>
<p>3 begin</p>
<p>4 for event_number in 10000..10999 loop</p>
<p>5 sys.dbms_system.read_ev(event_number, event_level);</p>
<p>6 if (event_level &gt; 0) then</p>
<p>7 sys.dbms_output.put_line(</p>
<p>8 'Event ' ||</p>
<p>9 to_char(event_number) ||</p>
<p>10 ' is set at level ' ||</p>
<p>11 to_char(event_level)</p>
<p>12 );</p>
<p>13 end if;</p>
<p>14 end loop;</p>
<p>15 end;</p>
<p>16 /</p>
<p>Event 10046 is set at level 1</p>
<p>引用：<a href="http://blog.sina.com.cn/s/blog_4cae4a25010008do.html">http://blog.sina.com.cn/s/blog_4cae4a25010008do.html</a></p>
<img src ="http://www.blogjava.net/xzclog/aggbug/337985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-11-13 14:31 <a href="http://www.blogjava.net/xzclog/archive/2010/11/13/337985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 常用hint的用法</title><link>http://www.blogjava.net/xzclog/archive/2010/11/05/337372.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 05 Nov 2010 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/11/05/337372.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/337372.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/11/05/337372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/337372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/337372.html</trackback:ping><description><![CDATA[<p>写HINT目的</p>
<p>　　手工指定SQL语句的执行计划</p>
<p>　　hints是oracle提供的一种机制，用来告诉优化器按照我们的告诉它的方式生成执行计划。我们可以用hints来实现：</p>
<p>　　1) 使用的优化器的类型</p>
<p>　　2) 基于代价的优化器的优化目标，是all_rows还是first_rows。</p>
<p>　　3) 表的访问路径，是全表扫描，还是索引扫描，还是直接利用rowid。</p>
<p>　　4) 表之间的连接类型</p>
<p>　　5) 表之间的连接顺序</p>
<p>　　6) 语句的并行程度</p>
<p>　　2、HINT可以基于以下规则产生作用</p>
<p>　　表连接的顺序、表连接的方法、访问路径、并行度</p>
<p>　　3、HINT应用范围</p>
<p>　　dml语句</p>
<p>　　查询语句</p>
<p>　　4、语法</p>
<p>　　{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */</p>
<p>　　or</p>
<p>　　{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...</p>
<p>　　如果语（句）法不对，则ORACLE会自动忽略所写的HINT，不报错</p>
<p>　　1. /*+ALL_ROWS*/</p>
<p>　　表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.</p>
<p>　　例如:</p>
<p>　　SELECT /*+ALL_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';</p>
<p>　　2. /*+FIRST_ROWS*/</p>
<p>　　表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.</p>
<p>　　例如:</p>
<p>　　SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';</p>
<p>　　3. /*+CHOOSE*/</p>
<p>　　表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;</p>
<p>　　表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;</p>
<p>　　例如:</p>
<p>　　SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';</p>
<p>　　4. /*+RULE*/</p>
<p>　　表明对语句块选择基于规则的优化方法.</p>
<p>　　例如:</p>
<p>　　SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';</p>
<p>　　5. /*+FULL(TABLE)*/</p>
<p>　　表明对表选择全局扫描的方法.</p>
<p>　　例如:</p>
<p>　　SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';</p>
<p>　　6. /*+ROWID(TABLE)*/</p>
<p>　　提示明确表明对指定表根据ROWID进行访问.</p>
<p>　　例如:</p>
<p>　　SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID&gt;='AAAAAAAAAAAAAA'</p>
<p>　　AND EMP_NO='SCOTT';</p>
<p>　　7. /*+CLUSTER(TABLE)*/</p>
<p>　　提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.</p>
<p>　　例如:</p>
<p>　　SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS</p>
<p>　　WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　8. /*+INDEX(TABLE INDEX_NAME)*/</p>
<p>　　表明对表选择索引的扫描方法.</p>
<p>　　例如:</p>
<p>　　SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';</p>
<p>　　9. /*+INDEX_ASC(TABLE INDEX_NAME)*/</p>
<p>　　表明对表选择索引升序的扫描方法.</p>
<p>　　例如:</p>
<p>　　SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';</p>
<p>　　10. /*+INDEX_COMBINE*/</p>
<p>　　为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式.</p>
<p>　　例如:</p>
<p>　　SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS</p>
<p>　　WHERE SAL&lt;5000000 AND HIREDATE</p>
<p>　　11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/</p>
<p>　　提示明确命令优化器使用索引作为访问路径.</p>
<p>　　例如:</p>
<p>　　SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE</p>
<p>　　FROM BSEMPMS WHERE SAL&lt;60000;</p>
<p>　　12. /*+INDEX_DESC(TABLE INDEX_NAME)*/</p>
<p>　　表明对表选择索引降序的扫描方法.</p>
<p>　　例如:</p>
<p>　　SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';</p>
<p>　　13. /*+INDEX_FFS(TABLE INDEX_NAME)*/</p>
<p>　　对指定的表执行快速全索引扫描,而不是全表扫描的办法.</p>
<p>　　例如:</p>
<p>　　SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';</p>
<p>　　14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/</p>
<p>　　提示明确进行执行规划的选择,将几个单列索引的扫描合起来.</p>
<p>　　例如:</p>
<p>　　SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';</p>
<p>　　15. /*+USE_CONCAT*/</p>
<p>　　对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询.</p>
<p>　　例如:</p>
<p>　　SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';</p>
<p>　　16. /*+NO_EXPAND*/</p>
<p>　　对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展.</p>
<p>　　例如:</p>
<p>　　SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';</p>
<p>　　17. /*+NOWRITE*/</p>
<p>　　禁止对查询块的查询重写操作.</p>
<p>　　18. /*+REWRITE*/</p>
<p>　　可以将视图作为参数.</p>
<p>　　19. /*+MERGE(TABLE)*/</p>
<p>　　能够对视图的各个查询进行相应的合并.</p>
<p>　　例如:</p>
<p>　　SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO</p>
<p>　　,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO</p>
<p>　　AND A.SAL&gt;V.AVG_SAL;</p>
<p>　　20. /*+NO_MERGE(TABLE)*/</p>
<p>　　对于有可合并的视图不再合并.</p>
<p>　　例如:</p>
<p>　　SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL&gt;V.AVG_SAL;</p>
<p>　　21. /*+ORDERED*/</p>
<p>　　根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.</p>
<p>　　例如:</p>
<p>　　SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;</p>
<p>　　22. /*+USE_NL(TABLE)*/</p>
<p>　　将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.</p>
<p>　　例如:</p>
<p>　　SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　23. /*+USE_MERGE(TABLE)*/</p>
<p>　　将指定的表与其他行源通过合并排序连接方式连接起来.</p>
<p>　　例如:</p>
<p>　　SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　24. /*+USE_HASH(TABLE)*/</p>
<p>　　将指定的表与其他行源通过哈希连接方式连接起来.</p>
<p>　　例如:</p>
<p>　　SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　25. /*+DRIVING_SITE(TABLE)*/</p>
<p>　　强制与ORACLE所选择的位置不同的表进行查询执行.</p>
<p>　　例如:</p>
<p>　　SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;</p>
<p>　　26. /*+LEADING(TABLE)*/</p>
<p>　　将指定的表作为连接次序中的首表.</p>
<p>　　27. /*+CACHE(TABLE)*/</p>
<p>　　当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端</p>
<p>　　例如:</p>
<p>　　SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;</p>
<p>　　28. /*+NOCACHE(TABLE)*/</p>
<p>　　当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端</p>
<p>　　例如:</p>
<p>　　SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;</p>
<p>　　29. /*+APPEND*/</p>
<p>　　直接插入到表的最后,可以提高速度.</p>
<p>　　insert /*+append*/ into test1 select * from test4 ;</p>
<p>　　30. /*+NOAPPEND*/</p>
<p>　　通过在插入语句生存期内停止并行模式来启动常规插入.</p>
<p>　　insert /*+noappend*/ into test1 select * from test4 ;</p>
<p>　　31. NO_INDEX: 指定不使用哪些索引</p>
<p>　　/*+ NO_INDEX ( table [index [index]...] ) */</p>
<p>　　select /*+ no_index(emp ind_emp_sal ind_emp_deptno)*/ * from emp where deptno=200 and sal&gt;300;</p>
<p>　　32. parallel</p>
<p>　　select /*+ parallel(emp,4)*/ * from emp where deptno=200 and sal&gt;300;</p>
<p>　　另：每个SELECT/INSERT/UPDATE/DELETE命令后只能有一个/*+ */，但提示内容可以有多个，可以用逗号分开，空格也可以。</p>
<p>　　如：/*+ ordered index() use_nl() */</p>
<p>---------<br />
类似如下的一条语句：insert into xxxx select /*+parallel(a) */ * from xxx a;数据量大约在75G左右，这位兄弟从上午跑到下午还没跑完，过来问我咋回事，说平常2hrs能跑完的东西跑了好几个小时还撒动静。查看系统性能也比较 正常，cpu，io都不繁忙，平均READ速度在80M/s左右（勉强凑合），但平均写速度只有10M不到。等待事件里面大量的&#8216; &#8216;PX Deq Credit: send blkd&#8217;，这里能看出并行出了问题，从而最后得知是并行用法有问题，修改之后20分钟完成了该操作。正确的做法应该是：<br />
alter session enable dml parallel；</p>
<p>insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a;</p>
<p>因为oracle默认并不会打开PDML，对DML语句必须手工启用。 另外不得不说的是，并行不是一个可扩展的特性，只有在数据仓库或作为DBA等少数人的工具在批量数据操作时利于充分利用资源，而在OLTP环境下使用并行 需要非常谨慎。事实上PDML还是有比较多的限制的，例如不支持触发器，引用约束，高级复制和分布式事务等特性，同时也会带来额外的空间占用，PDDL同 样是如此。有关Parallel excution可参考官方文档，在Thomas Kyte的新书《Expert Oracle Database architecture》也有精辟的讲述。<br />
---------<br />
select count(*)<br />
&nbsp; From wid_serv_prod_mon_1100 a<br />
&nbsp;where a.acct_month = 201010<br />
&nbsp;&nbsp; and a.partition_id = 10<br />
&nbsp;&nbsp; and serv_state not in ('2HB', '2HL', '2HJ', '2HP', '2HF')<br />
&nbsp;&nbsp; and online_flag in (0)<br />
&nbsp;&nbsp; and incr_product_id in (2000020)<br />
&nbsp;&nbsp; and product_id in (2020966, 2020972, 2100297, 2021116)<br />
&nbsp;&nbsp; and billing_mode_id = 1<br />
&nbsp;&nbsp; and exp_date &gt; to_date('201010', 'yyyymm')<br />
&nbsp;&nbsp; and not exists (select /*+no_index (b IDX_W_CDR_MON_SERV_ID_1100)*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from wid_cdr_mon_1100 b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where b.acct_month = 201010<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and b.ANA_EVENT_TYPE_4 in<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ('10201010201', '10202010201', '10203010201', '10203010202', '10203030201', '10203030202', '10204010201', '10204010202', '10204030201')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and a.serv_id = b.serv_id)</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/337372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-11-05 18:02 <a href="http://www.blogjava.net/xzclog/archive/2010/11/05/337372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EXECUTE IMMEDIATE及Using的使用方法...</title><link>http://www.blogjava.net/xzclog/archive/2010/11/01/336675.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 01 Nov 2010 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/11/01/336675.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/336675.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/11/01/336675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/336675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/336675.html</trackback:ping><description><![CDATA[<p>这段代码同样是执行了1000条insert语句，但是每一条语句都是不同的，因此ORACLE会把每条语句硬解析一次，其效率就比前面那段就低得多了。如果要提高效率，不妨使用绑定变量将循环中的语句改为</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlstr:='insert into 测试表 (:i,:i+1,:i*1,:i*2,:i-1) ';</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; execute immediate sqlstr using i,i,i,i,i;</p>
<p>这样执行的效率就高得多了。</p>
<p>我曾试着使用绑定变量来代替表名、过程名、字段名等，结果是语句错误，结论就是绑定变量不能当作嵌入的字符串来使用，只能当作语句中的变量来用。</p>
<p>从效率来看，由于oracle10G放弃了RBO，全面引入CBO，因此，在10G中使用绑定变量效率的提升比9i中更为明显。</p>
<p>最后，前面说到绑定变量是在通常情况下能提升效率，那哪些是不通常的情况呢？</p>
<p>答案是：在字段(包括字段集)建有索引，且字段(集)的集的势非常大（也就是有个值在字段中出现的比例特别的大）的情况下，使用绑定变量可能会导致查询计划错误，因而会使查询效率非常低。这种情况最好不要使用绑定变量。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前，EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能，较之以前它相当容易编码.尽管DBMS_SQL仍然可用，但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 <br />
</p>
<p>使用技巧</p>
<p>&nbsp;</p>
<p>1. EXECUTE IMMEDIATE将不会提交一个DML事务执行，应该显式提交<br />
如果通过EXECUTE IMMEDIATE处理DML命令，那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据</p>
<p>&nbsp;</p>
<p>2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.</p>
<p>&nbsp;</p>
<p>3. 当执行SQL语句时，不要用分号，当执行PL/SQL块时，在其尾部用分号.</p>
<p>&nbsp;</p>
<p>4. 在Oracle手册中，未详细覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.</p>
<p>&nbsp;</p>
<p>5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中，Forms 6i不能使用此功能.</p>
<p>&nbsp;</p>
<p>EXECUTE IMMEDIATE用法例子</p>
<p>&nbsp;</p>
<p>1. 在PL/SQL运行DDL语句</p>
<p><br />
begin<br />
execute immediate 'set role all';<br />
end;</p>
<p>&nbsp;</p>
<p>2. 给动态语句传值(USING 子句)</p>
<p><br />
declare<br />
l_depnam varchar2(20) := 'testing';<br />
l_loc&nbsp;&nbsp;&nbsp; varchar2(10) := 'Dubai';<br />
begin<br />
execute immediate 'insert into dept values (:1, :2, :3)'<br />
&nbsp;&nbsp;&nbsp; using 50, l_depnam, l_loc;<br />
commit;<br />
end;</p>
<p>&nbsp;</p>
<p>3. 从动态语句检索值(INTO子句)</p>
<p><br />
declare<br />
l_cnt&nbsp;&nbsp;&nbsp; varchar2(20);<br />
begin<br />
execute immediate 'select count(1) from emp'<br />
&nbsp;&nbsp;&nbsp; into l_cnt;<br />
dbms_output.put_line(l_cnt);<br />
end;</p>
<p>&nbsp;</p>
<p>4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.黓认为IN类型,其它类型必须显式指定</p>
<p>&nbsp;</p>
<p>declare<br />
l_routin&nbsp;&nbsp; varchar2(100) := 'gen2161.get_rowcnt';<br />
l_tblnam&nbsp;&nbsp; varchar2(20) := 'emp';<br />
l_cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;<br />
l_status&nbsp;&nbsp; varchar2(200);<br />
begin<br />
execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'<br />
&nbsp;&nbsp;&nbsp; using in l_tblnam, out l_cnt, in out l_status;</p>
<p>if l_status != 'OK' then<br />
&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line('error');<br />
end if;<br />
end;</p>
<p>&nbsp;</p>
<p>5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量</p>
<p><br />
declare<br />
type empdtlrec is record (empno number(4),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ename varchar2(20),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deptno number(2));<br />
empdtl empdtlrec;<br />
begin<br />
execute immediate 'select empno, ename, deptno ' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'from emp where empno = 7934'<br />
&nbsp;&nbsp;&nbsp; into empdtl;<br />
end;</p>
<p>&nbsp;</p>
<p>6. 传递并检索值.INTO子句用在USING子句前</p>
<p>&nbsp;</p>
<p>declare<br />
l_dept&nbsp;&nbsp;&nbsp; pls_integer := 20;<br />
l_nam&nbsp;&nbsp;&nbsp;&nbsp; varchar2(20);<br />
l_loc&nbsp;&nbsp;&nbsp;&nbsp; varchar2(20);<br />
begin<br />
execute immediate 'select dname, loc from dept where deptno = :1'<br />
&nbsp;&nbsp;&nbsp; into l_nam, l_loc<br />
&nbsp;&nbsp;&nbsp; using l_dept ;<br />
end;</p>
<p>&nbsp;</p>
<p>7. 多行查询选项.对此选项用insert语句填充临时表，用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.<br />
<br />
declare<br />
l_sal&nbsp;&nbsp; pls_integer := 2000;<br />
begin<br />
execute immediate 'insert into temp(empno, ename) ' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select empno, ename from emp ' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where sal &gt; :1'<br />
&nbsp;&nbsp;&nbsp; using l_sal;<br />
commit;<br />
end;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于处理动态语句,EXECUTE IMMEDIATE比以前可能用到的更容易并且更高效.当意图执行动态语句时，适当地处理异常更加重要.应该关注于捕获所有可能的异常.</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/336675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-11-01 14:42 <a href="http://www.blogjava.net/xzclog/archive/2010/11/01/336675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle nologging append 注意</title><link>http://www.blogjava.net/xzclog/archive/2010/10/28/336383.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 28 Oct 2010 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/10/28/336383.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/336383.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/10/28/336383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/336383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/336383.html</trackback:ping><description><![CDATA[<div class="tit">insert append需要注意的</div>
<div class="date">2010-07-28 11:34</div>
<table style="width: 100%" border="0">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p>1. append方式添加记录对insert into ... values语句不起作用。</p>
            <p>2. 以append方式批量插入的记录，其存储位置在hwm 之上，即使hwm之下存在空闲块也不能使用。</p>
            <p>3. 以append方式插入记录后，要执行commit，才能对表进行查询。否则会出现错误：</p>
            <p>ORA-12838: 无法在并行模式下修改之后读/修改对象</p>
            <p>4. 在归档模式下，要把表设置为nologging，然后以append方式批量添加记录，才会显著减少redo数量。在非归档模式下，不必设置表的nologging属性，即可减少redo数量。如果表上有索引，则append方式批量添加记录，不会减少索引上产生的redo数量，索引上的redo数量可能比表的redo数量还要大。</p>
            <p>用insert append可以实现直接路径加载，速度比常规加载方式快。但有一点需要注意: insert append时在表上加&#8220;6&#8221;类型的锁，会阻塞表上的所有DML语句。因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据，并不一定会提高速度。因为每一时刻只能有一个进程在加载(排它锁造成)。</p>
            <p>SQL&gt; create table test as select * from dba_objects where 1=2;</p>
            <p>表已创建。</p>
            <p>SQL&gt; insert into test select * from dba_objects;</p>
            <p>已创建11344行。</p>
            <p>SQL&gt; set lines 150<br />
            SQL&gt; col object_type for a10<br />
            SQL&gt; col object for a30<br />
            SQL&gt; col username for a10<br />
            SQL&gt; col osuser for a10<br />
            SQL&gt; col program for a30<br />
            SQL&gt; col sid for 99,999<br />
            SQL&gt; col locked_mode for 99<br />
            SQL&gt; col spid for 999,999<br />
            SQL&gt; select o.object_type,o.owner||'.'||o.object_name object,s.sid,s.serial#,p.spid,s.username,s.osuser,s.program,l.lock<br />
            ed_mode<br />
            2 from v$locked_object l,dba_objects o,v$session s,v$process p<br />
            3 where l.object_id = o.object_id<br />
            4 and s.sid=l.session_id<br />
            5 and s.paddr=p.addr<br />
            6 and o.object_name = upper('&amp;obj');<br />
            输入 obj 的值: test<br />
            原值&nbsp;&nbsp;&nbsp; 6: and o.object_name = upper('&amp;obj')<br />
            新值&nbsp;&nbsp;&nbsp; 6: and o.object_name = upper('test')</p>
            <p>OBJECT_TYP OBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID&nbsp;&nbsp;&nbsp; SERIAL# SPID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USERNAME&nbsp;&nbsp; OSUSER&nbsp;&nbsp;&nbsp;&nbsp; PROGRAM<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOCKED_MODE<br />
            ---------- ------------------------------ ------- ---------- ------------ ---------- ---------- ------------------------<br />
            ------ -----------<br />
            TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYS.TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 147&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19 784&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CNPEKALT02 sqlplus.exe<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2\jyu<br />
            可以看到,insert 时在表上加的是&#8220;3&#8221;类型的锁。</p>
            <p>SQL&gt; rollback;</p>
            <p>回退已完成。</p>
            <p>SQL&gt; insert /*+ append */ into test select * from dba_objects;</p>
            <p>已创建11344行。</p>
            <p>SQL&gt; set lines 150<br />
            SQL&gt; col object_type for a10<br />
            SQL&gt; col object for a30<br />
            SQL&gt; col username for a10<br />
            SQL&gt; col osuser for a10<br />
            SQL&gt; col program for a30<br />
            SQL&gt; col sid for 99,999<br />
            SQL&gt; col locked_mode for 99<br />
            SQL&gt; col spid for 999,999<br />
            SQL&gt; select o.object_type,o.owner||'.'||o.object_name object,s.sid,s.serial#,p.spid,s.username,s.osuser,s.program,l.lock<br />
            ed_mode<br />
            2 from v$locked_object l,dba_objects o,v$session s,v$process p<br />
            3 where l.object_id = o.object_id<br />
            4 and s.sid=l.session_id<br />
            5 and s.paddr=p.addr<br />
            6 and o.object_name = upper('&amp;obj');<br />
            输入 obj 的值: test<br />
            原值&nbsp;&nbsp;&nbsp; 6: and o.object_name = upper('&amp;obj')<br />
            新值&nbsp;&nbsp;&nbsp; 6: and o.object_name = upper('test')</p>
            <p>OBJECT_TYP OBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID&nbsp;&nbsp;&nbsp; SERIAL# SPID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USERNAME&nbsp;&nbsp; OSUSER&nbsp;&nbsp;&nbsp;&nbsp; PROGRAM<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOCKED_MODE<br />
            ---------- ------------------------------ ------- ---------- ------------ ---------- ---------- ------------------------<br />
            ------ -----------<br />
            TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYS.TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 147&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19 784&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CNPEKALT02 sqlplus.exe<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2\jyu</p>
            <p>而执行insert append时在表上加的是&#8220;6&#8221;类型的锁。</p>
            <p>insert append与一般的insert在表上加的锁不一样。insert append加的是exclusive的锁。因此要注意在执行insert append尽快提交，否则会阻塞其它事务对同一张表的DML语句。<br />
            此外， ORA-12838:是由于在执行insert append之后没有提交或回滚，接着又执行DML语句造成的。解决办法是在insert append 之后加上commit或rollback。<br />
            请看下面的测试：<br />
            SQL&gt; delete from test;<br />
            已删除9831行。<br />
            SQL&gt; insert /*+ append */ into test select * from temp_fsum_od;<br />
            已创建3277行。<br />
            SQL&gt; insert into test select * from temp_fsum_od;<br />
            insert into test select * from temp_fsum_od<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br />
            第 1 行出现错误:<br />
            ORA-12838: 无法在并行模式下修改之后读/修改对象</p>
            <p>SQL&gt; update test set OD_CODE=upper(OD_CODE) ;<br />
            update test set OD_CODE=upper(OD_CODE)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br />
            第 1 行出现错误:<br />
            ORA-12838: 无法在并行模式下修改之后读/修改对象</p>
            <p>SQL&gt; delete from test;<br />
            delete from test<br />
            *<br />
            第 1 行出现错误:<br />
            ORA-12838: 无法在并行模式下修改之后读/修改对象</p>
            <p>SQL&gt;<br />
            SQL&gt; insert /*+ append */ into test select * from temp_fsum_od;<br />
            insert /*+ append */ into test select * from temp_fsum_od<br />
            *<br />
            第 1 行出现错误:<br />
            ORA-12838: 无法在并行模式下修改之后读/修改对象<br />
            注意，我先执行了一个delete语句，又执行了insert append. 这个delete语句并没有造成后面的insert append报错。<br />
            但在我执行了一个insert append之后，再执行任何DML语句都会报错。<br />
            这说明，在执行了insert append 之后，必须commit或rollback，才能再执行其它DML语句。<br />
            但在insert append之前可以执行DML语句，而不会对insert append造成影响。<br />
            所以我们注意一点就可以了，即只要业务允许，在执行insert</p>
            <p>&nbsp;</p>
            <h4 class="beTitle">insert append方法的使用</h4>
            <div class="bvMsg">
            <div>大家众所周知，向<a href="http://hi.baidu.com/graceyan/blog/item/:;" target="_self"><span style="text-decoration: underline"><strong>数据库</strong></span></a>里插入数据有很多种方法，insert、sqlloader、for update等。每种方法都有其不同的特点。</div>
            <div>但是每一种方法在其<a href="http://hi.baidu.com/graceyan/blog/item/:;" target="_self"><span style="text-decoration: underline"><strong>服务器</strong></span></a>设置不同的情况下也是有不同的执行情况的。例如：insert。</div>
            <div>insert 属于DML语言（即数据操作语言，还包括select，delete，update）。网上介绍过一种insert append方法，语句格式为 insert /* +append+ */ into table_name select column_name1&#8230;&#8230; from table_name2 ; 这种方法据说可以占用很少的redo表空间，占用很少的redo表空间也就是省略了一些归档的时间，这样是可以提高insert的执行效率的！但是经过测试我发现insert append并不是在任何时候都可以节省时间的。</div>
            <div>第一种情况：database为archivelog状态，这种情况下，就算你用insert append也是不一定提高插入效率的。但是如果你在建表的时候，将目标表建成nologging的，然后再使用insert append就会很快。</div>
            <div>第二种情况：database为noarchivelog状态，这种情况下，如果情况下采用insert方法向表中插入数据，占用的redo空间的大小与archivelog状态下占用的大小是相当的，不论表是否为nologging。但是如果采用insert append方法的话，通过redo的占用值大家可以发现，不论表是否为nologging，所占用的redo的大小都是很小的。也就说明：在数据库为noarchivelog的状态下，采用insert append方法，如果表不是nologging，系统也会自动将表转换为nologging（即在执行insert append之前，先执行一个alter table arch1 nologging;）。</div>
            <div>以下为测试的具体过程：</div>
            <div>-------- 数据库为归档模式<br />
            create table arch (status varchar(2)) nologging;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----- create a nologging table<br />
            Table created</div>
            <div>create table arch1 (status varchar(2)) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----- create a logging table<br />
            Table created</div>
            <div><br />
            select a.name, b.value<br />
            from v$statname a, v$mystat b<br />
            where a.statistic# = b.statistic#<br />
            and a.name = 'redo size'<br />
            and b.value &gt; 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1332780</div>
            <div><br />
            insert into arch select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div>---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1744516&nbsp;&nbsp; ----- +411736</div>
            <div><br />
            insert into arch1 select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div>---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2156000&nbsp;&nbsp; ------ +411484</div>
            <div><br />
            insert /*+append*/ into arch select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div>---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2169864&nbsp;&nbsp; ----- +13864<br />
            insert /*+append*/ into arch1 select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div>---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2555448&nbsp;&nbsp; ----- +385584</div>
            <div>spool off;</div>
            <div>-------- 数据库为非归档模式<br />
            create table arch (status varchar(2)) nologging;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----- create a nologging table<br />
            Table created</div>
            <div>create table arch1 (status varchar(2)) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----- create a logging table<br />
            Table created</div>
            <div>---- view redo engross space&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33208</div>
            <div>insert into arch select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div>---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 444704 ----- +411496</div>
            <div><br />
            insert into arch1 select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div>---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 856160 ----- +411456</div>
            <div><br />
            insert /*+append*/ into arch select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div><br />
            ---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 870024 ----- +13864</div>
            <div><br />
            insert /*+append*/ into arch1 select 'ok' from dba_objects</div>
            <div>29514 rows inserted</div>
            <div><br />
            ---- view redo engross space</div>
            <div>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ---------------------------------------------------------------- ----------<br />
            redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 884004----- +13980</div>
            <div>spool off;</div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/xzclog/aggbug/336383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-10-28 14:56 <a href="http://www.blogjava.net/xzclog/archive/2010/10/28/336383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Statspack的使用</title><link>http://www.blogjava.net/xzclog/archive/2010/08/07/328189.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 07 Aug 2010 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/08/07/328189.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/328189.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/08/07/328189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/328189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/328189.html</trackback:ping><description><![CDATA[Statspack是Oracle自带的强大的性能分析工具。他可以对当前数据库的运行状况作出全面的分析（包括实例信息、PGA顾问信息、命中率、top sql、top 5 wait event等等），是个好东西吧！下面切入正题：
<p>&nbsp;</p>
<p>1.以sysdba身份登陆，查看数据文件路径</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>C:\Documents&nbsp;</span><span class="op">and</span><span>&nbsp;Settings\Administrator&gt;sqlplus&nbsp;/&nbsp;</span><span class="keyword">as</span><span>&nbsp;sysdba &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>SQL*Plus:&nbsp;Release&nbsp;10.2.0.1.0&nbsp;-&nbsp;Production&nbsp;</span><span class="keyword">on</span><span>&nbsp;星期三&nbsp;4月&nbsp;14&nbsp;10:51:41&nbsp;2010 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Copyright&nbsp;(c)&nbsp;1982,&nbsp;2005,&nbsp;Oracle.&nbsp;&nbsp;</span><span class="op">All</span><span>&nbsp;rights&nbsp;reserved. &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>连接到: &nbsp;&nbsp;</span></li>
    <li><span>Oracle&nbsp;</span><span class="keyword">Database</span><span>&nbsp;10g&nbsp;Enterprise&nbsp;Edition&nbsp;Release&nbsp;10.2.0.1.0&nbsp;-&nbsp;Production &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">With</span><span>&nbsp;the&nbsp;Partitioning,&nbsp;OLAP&nbsp;</span><span class="op">and</span><span>&nbsp;Data&nbsp;Mining&nbsp;options &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>sys@AAA&gt;show&nbsp;</span><span class="func">user</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span class="func">USER</span><span>&nbsp;为&nbsp;</span><span class="string">"SYS"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>sys@AAA&gt;</span><span class="keyword">select</span><span>&nbsp;file_name&nbsp;</span><span class="keyword">from</span><span>&nbsp;dba_data_files; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>FILE_NAME &nbsp;&nbsp;</span></li>
    <li><span class="comment">-------------------------------------------------- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\USERS01.DBF &nbsp;&nbsp;</span></li>
    <li><span>D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\SYSAUX01.DBF &nbsp;&nbsp;</span></li>
    <li><span>D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\UNDOTBS01.DBF &nbsp;&nbsp;</span></li>
    <li><span>D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\SYSTEM01.DBF &nbsp;&nbsp;</span></li>
    <li><span>D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\BBB.DBF &nbsp;&nbsp;</span></li>
    <li><span>D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\PERFSTAT.DBF &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>已选择6行。&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">C:\Documents and Settings\Administrator&gt;sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 4月 14 10:51:41 2010
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
sys@AAA&gt;show user;
USER 为 "SYS"
sys@AAA&gt;select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\USERS01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\SYSAUX01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\UNDOTBS01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\SYSTEM01.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\BBB.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\PERFSTAT.DBF
已选择6行。</pre>
<p>&nbsp;</p>
<p>2.创建statspack存储数据的表空间，（注：statspack往往会产生大量的分析数据，所以表空间还是大点为好）。</p>
<p>&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span class="keyword">create</span><span>&nbsp;tablespace&nbsp;perfstat&nbsp;datafile&nbsp;</span><span class="string">'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\PERFSTAT.DBF'</span><span>&nbsp;</span><span class="keyword">size</span><span>&nbsp;2G;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">create tablespace perfstat datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AAA\PERFSTAT.DBF' size 2G;</pre>
<p>&nbsp;</p>
<p>3.运行statspack安装脚本。默认位置在<span>$oracle_home\rdbms\admin\spcreate.sql</span></p>
<p>&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>sys@AAA&gt;&nbsp;@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spcreate.sql &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>................... &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>输入&nbsp;perfstat_password&nbsp;的值:&nbsp;&nbsp;perfstat &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>... &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>输入&nbsp;default_tablespace&nbsp;的值:&nbsp;&nbsp;perfstat &nbsp;&nbsp;</span></li>
    <li><span>.......... &nbsp;&nbsp;</span></li>
    <li><span>.......... &nbsp;&nbsp;</span></li>
    <li><span>输入&nbsp;temporary_tablespace&nbsp;的值:&nbsp;</span><span class="keyword">temp</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>.......... &nbsp;&nbsp;</span></li>
    <li><span>..........&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">sys@AAA&gt; @D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spcreate.sql
...................
输入 perfstat_password 的值:  perfstat
...
输入 default_tablespace 的值:  perfstat
..........
..........
输入 temporary_tablespace 的值: temp
..........
..........
</pre>
<p>&nbsp;</p>
<p>安装完之后 会自动切换用户到perfstat下：</p>
<p>&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>PERFSTAT@AAA&gt;&nbsp;show&nbsp;</span><span class="func">user</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="func">USER</span><span>&nbsp;</span><span class="keyword">is</span><span>&nbsp;</span><span class="string">"PERFSTAT"</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">PERFSTAT@AAA&gt; show user;
USER is "PERFSTAT"
</pre>
<p>&nbsp;</p>
<p>&nbsp;安装完毕！</p>
<p>&nbsp;</p>
<p>4.接下来采样分析，设定一个job，每小时执行一次采样。</p>
<p>&nbsp;&nbsp; 首先查看当前DB中有没有正在运行的JOB：</p>
<p>&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>perfstat@AAA&gt;</span><span class="keyword">select</span><span>&nbsp;job,schema_user,next_date,interval,what&nbsp;</span><span class="keyword">from</span><span>&nbsp;user_jobs; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>未选定行&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">perfstat@AAA&gt;select job,schema_user,next_date,interval,what from user_jobs;
未选定行</pre>
<p>&nbsp;</p>
<p>创建statspack采样的job，没每个小时采样一次。</p>
<p>&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>perfstat@AAA&gt;variable&nbsp;job&nbsp;number; &nbsp;&nbsp;</span></span></li>
    <li><span>perfstat@AAA&gt;</span><span class="keyword">begin</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;2&nbsp;&nbsp;dbms_job.submit(:job,</span><span class="string">'statspack.snap;'</span><span>,trunc(sysdate+1/24,</span><span class="string">'hh24'</span><span>),</span><span class="string">'trunc(sysdate+1/24,'</span><span class="string">'hh24'</span><span class="string">')'</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;3&nbsp;&nbsp;</span><span class="keyword">commit</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;4&nbsp;&nbsp;</span><span class="keyword">end</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;5&nbsp;&nbsp;/ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>PL/SQL&nbsp;过程已成功完成。&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">perfstat@AAA&gt;variable job number;
perfstat@AAA&gt;begin
2  dbms_job.submit(:job,'statspack.snap;',trunc(sysdate+1/24,'hh24'),'trunc(sysdate+1/24,''hh24'')');
3  commit;
4  end;
5  /
PL/SQL 过程已成功完成。</pre>
<p>&nbsp;</p>
<p>查看当前正在运行的job有哪些？</p>
<p>&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>perfstat@AAA&gt;</span><span class="keyword">select</span><span>&nbsp;job&nbsp;</span><span class="keyword">as</span><span>&nbsp;j,schema_user,next_date,interval,what&nbsp;</span><span class="keyword">from</span><span>&nbsp;user_jobs; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J&nbsp;SCHEMA_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NEXT_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTERVAL&nbsp;&nbsp;&nbsp;WHAT &nbsp;&nbsp;</span></li>
    <li><span class="comment">----------&nbsp;------------------------------&nbsp;--------------&nbsp;----------&nbsp;---------- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;PERFSTAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14-4月&nbsp;-10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trunc(sysd&nbsp;statspack. &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ate+1/24,'&nbsp;snap; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hh24')&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">perfstat@AAA&gt;select job as j,schema_user,next_date,interval,what from user_jobs;
J SCHEMA_USER                    NEXT_DATE      INTERVAL   WHAT
---------- ------------------------------ -------------- ---------- ----------
1 PERFSTAT                       14-4月 -10     trunc(sysd statspack.
ate+1/24,' snap;
hh24')</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5.由于statspack的采集和分析会做很多DB的分析，产生大量的分析数据，所以频繁的采样肯定会消耗系统性能，特别是在生产库中，所以当你建立了上面每小时执行一次的那个job，请务必在不需要的时候停止它。不然的话，这个失误可能会是致命的（ statspack job每小时都会跑，永不停的跑下去，呵呵。），尤其在生产库中。</p>
<p>&nbsp;</p>
<p>明天凌晨，系统比较清闲，采样已经没多大意义（采样分析的最终目的是分析高峰时段的系统瓶颈），所以停止这个job.</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>perfstat@AAA&gt;variable&nbsp;job&nbsp;number; &nbsp;&nbsp;</span></span></li>
    <li><span>perfstat@AAA&gt;</span><span class="keyword">begin</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;2&nbsp;&nbsp;dbms_job.submit(:job,</span><span class="string">'dbms_job.broken(1,true);'</span><span>,trunc(sysdate+1),</span><span class="string">'null'</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;3&nbsp;&nbsp;</span><span class="keyword">commit</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;4&nbsp;&nbsp;</span><span class="keyword">end</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;5&nbsp;&nbsp;/ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>PL/SQL&nbsp;过程已成功完成。&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">perfstat@AAA&gt;variable job number;
perfstat@AAA&gt;begin
2  dbms_job.submit(:job,'dbms_job.broken(1,true);',trunc(sysdate+1),'null');
3  commit;
4  end;
5  /
PL/SQL 过程已成功完成。</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>6.几个小时候后，看看生成的哪些快照。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>perfstat@AAA&gt;</span><span class="keyword">select</span><span>&nbsp;snap_id,snap_time,startup_time&nbsp;</span><span class="keyword">from</span><span>&nbsp;stats$snapshot; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;SNAP_ID&nbsp;SNAP_TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STARTUP_TIME &nbsp;&nbsp;</span></li>
    <li><span class="comment">----------&nbsp;--------------&nbsp;-------------- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;14-4月&nbsp;-10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14-4月&nbsp;-10 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;14-4月&nbsp;-10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14-4月&nbsp;-10&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">perfstat@AAA&gt;select snap_id,snap_time,startup_time from stats$snapshot;
SNAP_ID SNAP_TIME      STARTUP_TIME
---------- -------------- --------------
1 14-4月 -10     14-4月 -10
2 14-4月 -10     14-4月 -10
</pre>
<p>&nbsp;</p>
<p>7.设定任意两个快照，产生这段时间内的性能分析报告（此时需要跑spreport脚本，路径和刚才那个脚本一致）。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>perfstat@AAA&gt;@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spreport.sql &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">Current</span><span>&nbsp;Instance &nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~~~~~~ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;DB&nbsp;Id&nbsp;&nbsp;&nbsp;&nbsp;DB&nbsp;</span><span class="keyword">Name</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inst&nbsp;Num&nbsp;Instance &nbsp;&nbsp;</span></span></li>
    <li><span class="comment">-----------&nbsp;------------&nbsp;--------&nbsp;------------ </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;1858440386&nbsp;AAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;aaa &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Instances&nbsp;</span><span class="op">in</span><span>&nbsp;this&nbsp;Statspack&nbsp;</span><span class="keyword">schema</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;DB&nbsp;Id&nbsp;&nbsp;&nbsp;&nbsp;Inst&nbsp;Num&nbsp;DB&nbsp;</span><span class="keyword">Name</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Host &nbsp;&nbsp;</span></span></li>
    <li><span class="comment">-----------&nbsp;--------&nbsp;------------&nbsp;------------&nbsp;------------ </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;1858440386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;AAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aaa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6979580041BD &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;490 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Using&nbsp;1858440386&nbsp;</span><span class="keyword">for</span><span>&nbsp;</span><span class="keyword">database</span><span>&nbsp;Id &nbsp;&nbsp;</span></span></li>
    <li><span>Using&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;</span><span class="keyword">for</span><span>&nbsp;instance&nbsp;number &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Specify&nbsp;the&nbsp;number&nbsp;</span><span class="keyword">of</span><span>&nbsp;days&nbsp;</span><span class="keyword">of</span><span>&nbsp;snapshots&nbsp;</span><span class="keyword">to</span><span>&nbsp;choose&nbsp;</span><span class="keyword">from</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ &nbsp;&nbsp;</span></li>
    <li><span>Entering&nbsp;the&nbsp;number&nbsp;</span><span class="keyword">of</span><span>&nbsp;days&nbsp;(n)&nbsp;will&nbsp;result&nbsp;</span><span class="op">in</span><span>&nbsp;the&nbsp;most&nbsp;recent &nbsp;&nbsp;</span></span></li>
    <li><span>(n)&nbsp;days&nbsp;</span><span class="keyword">of</span><span>&nbsp;snapshots&nbsp;being&nbsp;listed.&nbsp;&nbsp;Pressing&nbsp;&lt;</span><span class="keyword">return</span><span>&gt;&nbsp;without &nbsp;&nbsp;</span></span></li>
    <li><span>specifying&nbsp;a&nbsp;number&nbsp;lists&nbsp;</span><span class="op">all</span><span>&nbsp;completed&nbsp;snapshots. &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Listing&nbsp;</span><span class="op">all</span><span>&nbsp;Completed&nbsp;Snapshots &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Snap &nbsp;&nbsp;</span></li>
    <li><span>Instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DB&nbsp;</span><span class="keyword">Name</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Snap&nbsp;Id&nbsp;&nbsp;&nbsp;Snap&nbsp;Started&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">Level</span><span>&nbsp;Comment &nbsp;&nbsp;</span></span></li>
    <li><span class="comment">------------&nbsp;------------&nbsp;---------&nbsp;-----------------&nbsp;-----&nbsp;------------- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>aaa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;14&nbsp;4月&nbsp;&nbsp;2010&nbsp;09:5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;14&nbsp;4月&nbsp;&nbsp;2010&nbsp;09:5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;14&nbsp;4月&nbsp;&nbsp;2010&nbsp;11:0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Specify&nbsp;the&nbsp;</span><span class="keyword">Begin</span><span>&nbsp;</span><span class="op">and</span><span>&nbsp;</span><span class="keyword">End</span><span>&nbsp;Snapshot&nbsp;Ids &nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ &nbsp;&nbsp;</span></li>
    <li><span>输入&nbsp;begin_snap&nbsp;的值:&nbsp;&nbsp;1 &nbsp;&nbsp;</span></li>
    <li><span class="keyword">Begin</span><span>&nbsp;Snapshot&nbsp;Id&nbsp;specified:&nbsp;1 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>输入&nbsp;end_snap&nbsp;的值:&nbsp;&nbsp;2 &nbsp;&nbsp;</span></li>
    <li><span class="keyword">End</span><span>&nbsp;&nbsp;&nbsp;Snapshot&nbsp;Id&nbsp;specified:&nbsp;2 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Specify&nbsp;the&nbsp;Report&nbsp;</span><span class="keyword">Name</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~~~~~~~~~~~~~ &nbsp;&nbsp;</span></li>
    <li><span>The&nbsp;</span><span class="keyword">default</span><span>&nbsp;report&nbsp;file&nbsp;</span><span class="keyword">name</span><span>&nbsp;</span><span class="keyword">is</span><span>&nbsp;sp_1_2.&nbsp;&nbsp;</span><span class="keyword">To</span><span>&nbsp;use&nbsp;this&nbsp;</span><span class="keyword">name</span><span>, &nbsp;&nbsp;</span></span></li>
    <li><span>press&nbsp;&lt;</span><span class="keyword">return</span><span>&gt;&nbsp;</span><span class="keyword">to</span><span>&nbsp;</span><span class="keyword">continue</span><span>,&nbsp;otherwise&nbsp;enter&nbsp;an&nbsp;alternative. &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>输入&nbsp;report_name&nbsp;的值:&nbsp;&nbsp;d:\myreport.txt&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">perfstat@AAA&gt;@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spreport.sql
Current Instance
~~~~~~~~~~~~~~~~
DB Id    DB Name     Inst Num Instance
----------- ------------ -------- ------------
1858440386 AAA                 1 aaa
Instances in this Statspack schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id    Inst Num DB Name      Instance     Host
----------- -------- ------------ ------------ ------------
1858440386        1 AAA          aaa          6979580041BD
490
Using 1858440386 for database Id
Using          1 for instance number
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed.  Pressing &lt;return&gt; without
specifying a number lists all completed snapshots.
Listing all Completed Snapshots
Snap
Instance     DB Name        Snap Id   Snap Started    Level Comment
------------ ------------ --------- ----------------- ----- -------------
aaa          AAA                  1 14 4月  2010 09:5     5
2
2 14 4月  2010 09:5     5
3
3 14 4月  2010 11:0     5
0
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
输入 begin_snap 的值:  1
Begin Snapshot Id specified: 1
输入 end_snap 的值:  2
End   Snapshot Id specified: 2
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2.  To use this name,
press &lt;return&gt; to continue, otherwise enter an alternative.
输入 report_name 的值:  d:\myreport.txt</pre>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>...回车&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">...回车</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>8.完成后，会产生一个分析报告（d:\myreport.txt）。</p>
<p>附件：报告的截取片段：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span>STATSPACK&nbsp;report&nbsp;</span><span class="keyword">for</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">Database</span><span>&nbsp;&nbsp;&nbsp;&nbsp;DB&nbsp;Id&nbsp;&nbsp;&nbsp;&nbsp;Instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inst&nbsp;Num&nbsp;Startup&nbsp;</span><span class="keyword">Time</span><span>&nbsp;&nbsp;&nbsp;&nbsp;Release&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAC &nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~&nbsp;</span><span class="comment">-----------&nbsp;------------&nbsp;--------&nbsp;---------------&nbsp;-----------&nbsp;--- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1858440386&nbsp;aaa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;14-4月&nbsp;-10&nbsp;09:2&nbsp;10.2.0.1.0&nbsp;&nbsp;</span><span class="keyword">NO</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Host&nbsp;&nbsp;</span><span class="keyword">Name</span><span>:&nbsp;&nbsp;&nbsp;6979580041BD490&nbsp;&nbsp;Num&nbsp;CPUs:&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Phys&nbsp;Memory&nbsp;(MB):&nbsp;&nbsp;&nbsp;&nbsp;3,326 &nbsp;&nbsp;</span></span></li>
    <li><span>~~~~ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Snapshot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Snap&nbsp;Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Snap&nbsp;</span><span class="keyword">Time</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sessions&nbsp;Curs/Sess&nbsp;Comment &nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">----------&nbsp;------------------&nbsp;--------&nbsp;---------&nbsp;------------------- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">Begin</span><span>&nbsp;Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;14-4月&nbsp;-10&nbsp;09:52:22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">End</span><span>&nbsp;Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;14-4月&nbsp;-10&nbsp;09:53:20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.8 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;Elapsed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.97&nbsp;(mins) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Cache&nbsp;Sizes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">Begin</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">End</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">----------&nbsp;---------- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffer&nbsp;Cache:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;184M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Std&nbsp;Block&nbsp;</span><span class="keyword">Size</span><span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8K &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shared&nbsp;Pool&nbsp;</span><span class="keyword">Size</span><span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;380M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log&nbsp;Buffer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6,860K &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">Load</span><span>&nbsp;Profile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Per&nbsp;</span><span class="keyword">Second</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Per&nbsp;</span><span class="keyword">Transaction</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">---------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--------------- </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Redo&nbsp;</span><span class="keyword">size</span><span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10,075.66&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;584,388.00 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logical&nbsp;reads:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;58.41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3,388.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Block&nbsp;changes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18.81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,091.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Physical&nbsp;reads:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Physical&nbsp;writes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">User</span><span>&nbsp;calls:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30.00 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parses:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.83&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;164.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hard&nbsp;parses:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.72&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sorts:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.76&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;102.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logons:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Executes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;631.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transactions:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.02 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;%&nbsp;Blocks&nbsp;changed&nbsp;per&nbsp;</span><span class="keyword">Read</span><span>:&nbsp;&nbsp;&nbsp;32.20&nbsp;&nbsp;&nbsp;&nbsp;Recursive&nbsp;Call&nbsp;%:&nbsp;&nbsp;&nbsp;&nbsp;99.69 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="keyword">Rollback</span><span>&nbsp;per&nbsp;</span><span class="keyword">transaction</span><span>&nbsp;%:&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">Rows</span><span>&nbsp;per&nbsp;Sort:&nbsp;&nbsp;&nbsp;&nbsp;70.69 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Instance&nbsp;Efficiency&nbsp;Percentages &nbsp;&nbsp;</span></li>
    <li><span>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffer&nbsp;Nowait&nbsp;%:&nbsp;&nbsp;100.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Redo&nbsp;NoWait&nbsp;%:&nbsp;&nbsp;100.00 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffer&nbsp;&nbsp;Hit&nbsp;&nbsp;&nbsp;%:&nbsp;&nbsp;&nbsp;99.62&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="op">In</span><span>-memory&nbsp;Sort&nbsp;%:&nbsp;&nbsp;100.00 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Library&nbsp;Hit&nbsp;&nbsp;&nbsp;%:&nbsp;&nbsp;&nbsp;90.06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Soft&nbsp;Parse&nbsp;%:&nbsp;&nbsp;&nbsp;74.39 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">Execute</span><span>&nbsp;</span><span class="keyword">to</span><span>&nbsp;Parse&nbsp;%:&nbsp;&nbsp;&nbsp;74.01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Latch&nbsp;Hit&nbsp;%:&nbsp;&nbsp;100.00 &nbsp;&nbsp;</span></span></li>
    <li><span>Parse&nbsp;CPU&nbsp;</span><span class="keyword">to</span><span>&nbsp;Parse&nbsp;Elapsd&nbsp;%:&nbsp;&nbsp;&nbsp;14.29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Non-Parse&nbsp;CPU:&nbsp;&nbsp;&nbsp;98.41 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;Shared&nbsp;Pool&nbsp;</span><span class="keyword">Statistics</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">Begin</span><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">End</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">------&nbsp;&nbsp;------ </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memory&nbsp;Usage&nbsp;%:&nbsp;&nbsp;&nbsp;21.05&nbsp;&nbsp;&nbsp;20.98 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;SQL&nbsp;</span><span class="keyword">with</span><span>&nbsp;executions&gt;1:&nbsp;&nbsp;&nbsp;54.05&nbsp;&nbsp;&nbsp;60.06 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;%&nbsp;Memory&nbsp;</span><span class="keyword">for</span><span>&nbsp;SQL&nbsp;w/</span><span class="keyword">exec</span><span>&gt;1:&nbsp;&nbsp;&nbsp;80.51&nbsp;&nbsp;&nbsp;83.00 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">Top</span><span>&nbsp;5&nbsp;Timed&nbsp;Events&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">Avg</span><span>&nbsp;%Total &nbsp;&nbsp;</span></span></li>
    <li><span>~~~~~~~~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait&nbsp;&nbsp;&nbsp;Call &nbsp;&nbsp;</span></li>
    <li><span>Event&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Waits&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">Time</span><span>&nbsp;(s)&nbsp;&nbsp;&nbsp;(ms)&nbsp;&nbsp;&nbsp;</span><span class="keyword">Time</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="comment">-----------------------------------------&nbsp;------------&nbsp;-----------&nbsp;------&nbsp;------ </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>CPU&nbsp;</span><span class="keyword">time</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;70.7 &nbsp;&nbsp;</span></span></li>
    <li><span>control&nbsp;file&nbsp;sequential&nbsp;</span><span class="keyword">read</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;189&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;23.6 &nbsp;&nbsp;</span></span></li>
    <li><span>db&nbsp;file&nbsp;sequential&nbsp;</span><span class="keyword">read</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;2.5 &nbsp;&nbsp;</span></span></li>
    <li><span>control&nbsp;file&nbsp;parallel&nbsp;write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;1.9 &nbsp;&nbsp;</span></li>
    <li><span>log&nbsp;file&nbsp;sync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.6 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>..................... &nbsp;&nbsp;</span></li>
    <li><span>......................... &nbsp;&nbsp;</span></li>
    <li><span>...........................&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">STATSPACK report for
Database    DB Id    Instance     Inst Num Startup Time    Release     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
1858440386 aaa                 1 14-4月 -10 09:2 10.2.0.1.0  NO
2
Host  Name:   6979580041BD490  Num CPUs:    2        Phys Memory (MB):    3,326
~~~~
Snapshot       Snap Id     Snap Time      Sessions Curs/Sess Comment
~~~~~~~~    ---------- ------------------ -------- --------- -------------------
Begin Snap:          1 14-4月 -10 09:52:22      15       4.3
End Snap:          2 14-4月 -10 09:53:20      15       5.8
Elapsed:                0.97 (mins)
Cache Sizes                       Begin        End
~~~~~~~~~~~                  ---------- ----------
Buffer Cache:       184M             Std Block Size:         8K
Shared Pool Size:       380M                 Log Buffer:     6,860K
Load Profile                            Per Second       Per Transaction
~~~~~~~~~~~~                       ---------------       ---------------
Redo size:             10,075.66            584,388.00
Logical reads:                 58.41              3,388.00
Block changes:                 18.81              1,091.00
Physical reads:                  0.22                 13.00
Physical writes:                  0.00                  0.00
User calls:                  0.52                 30.00
Parses:                  2.83                164.00
Hard parses:                  0.72                 42.00
Sorts:                  1.76                102.00
Logons:                  0.02                  1.00
Executes:                 10.88                631.00
Transactions:                  0.02
% Blocks changed per Read:   32.20    Recursive Call %:    99.69
Rollback per transaction %:    0.00       Rows per Sort:    70.69
Instance Efficiency Percentages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait %:  100.00       Redo NoWait %:  100.00
Buffer  Hit   %:   99.62    In-memory Sort %:  100.00
Library Hit   %:   90.06        Soft Parse %:   74.39
Execute to Parse %:   74.01         Latch Hit %:  100.00
Parse CPU to Parse Elapsd %:   14.29     % Non-Parse CPU:   98.41
Shared Pool Statistics        Begin   End
------  ------
Memory Usage %:   21.05   20.98
% SQL with executions&gt;1:   54.05   60.06
% Memory for SQL w/exec&gt;1:   80.51   83.00
Top 5 Timed Events                                                    Avg %Total
~~~~~~~~~~~~~~~~~~                                                   wait   Call
Event                                            Waits    Time (s)   (ms)   Time
----------------------------------------- ------------ ----------- ------ ------
CPU time                                                         1          70.7
control file sequential read                       189           0      1   23.6
db file sequential read                              8           0      3    2.5
control file parallel write                         27           0      1    1.9
log file sync                                        1           0      5     .6
.....................
.........................
...........................</pre>
<p>&nbsp;</p>
<p>&nbsp;9.若想删除某个快照，制定snapid直接delete</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://diegoball.javaeye.com/blog/643533#"><img alt="复制代码" src="http://diegoball.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span class="keyword">delete</span><span>&nbsp;stats$snapshot&nbsp;</span><span class="keyword">where</span><span>&nbsp;snap_id=1;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">delete stats$snapshot where snap_id=1;</pre>
<p>&nbsp;</p>
<p>若想删除所有快照 ，只保留statspack结构，执行<span lang="EN-US">@sptrunc。脚本路径也在rdbms/admin下。若想连statspack一起干掉，也可以，请执行下面的脚本：<span lang="EN-US">@spdrop</span></span></p>
<p></p>
<p>&nbsp;</p>
<p>从此你也可以利用statspack来了解当前数据库的运行状况了。&nbsp;</p>
 <img src ="http://www.blogjava.net/xzclog/aggbug/328189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-08-07 11:18 <a href="http://www.blogjava.net/xzclog/archive/2010/08/07/328189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>闪回删除(Flashback drop)</title><link>http://www.blogjava.net/xzclog/archive/2010/08/04/327969.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 04 Aug 2010 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/08/04/327969.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/327969.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/08/04/327969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/327969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/327969.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">大家在平时开发中，有时意外的删除过表，可能就是直接重新创建该表。在oracle10g中，可以用Flashback drop恢复用一个被删除(drop)了的对象，<a onclick="javascript:tagshow(event, 'oracle');" href="javascript:;" target="_self"><u><strong>oracle</strong></u></a>自动将该对象放入回收站。Flashback drop恢复的原理也是利用oracle的回收站来恢复被删除(drop)的对象。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">回收站，是一个虚拟的容器，用于存放所有被删除的对象。其实，对于一个对象的删除，<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target="_self"><u><strong>数据库</strong></u></a>仅仅是简单的重命名操作。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">数据库参数recyclebin设置为on.(即默认设置)。参数recyclebin为on，则表示把Drop的对象放入回收站。为off，则表示直接删除对象而不放入回收站。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">查看recyclebin值命令如：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">SQL&gt; show parameter bin;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUE</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">------------------------------------ ----------- ------------------------------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">recyclebin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">在系统或会话级别中修改参数recyclebin值的命令为：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">SQL&gt;alter system set recyclebin = on|off;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">SQL&gt;alter session set recyclebin = on|off;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">查看回收站的相关信息视图有：recyclebin/user_recyclebin/dba_recyclebin.</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">手动清除回收站的信息为：purge recyclebin(或purge table original_name);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">删除一张表而不想放入回收站的命令为：drop table table_name purge;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">示例1：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">1.</span><span style="font-size: 9pt; font-family: 宋体">查看用户下回收站的信息，此时回收站为空</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体"><a onclick="javascript:tagshow(event, 'SQL');" href="javascript:;" target="_self"><u><strong>SQL</strong></u></a></span><span style="font-size: 9pt; color: black; font-family: 宋体">&gt;selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;<br />
OBJECT_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORIGINAL_NAME&nbsp;TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><em><span style="font-size: 9pt; color: red; font-family: 宋体">------------------------------ ------------- ------</span></em><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
2.</span><span style="font-size: 9pt; color: black; font-family: 宋体">创建测试表tab_test,并为该表增加ind_test索引<br />
SQL&gt;createtabletab_testasselect*fromall_objects;<br />
Tablecreated<br />
SQL&gt;createindexind_testontab_test(object_id);<br />
Indexcreated</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; select count(*) from tab_test;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;COUNT(*)</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">----------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;40699<br />
3</span><span style="font-size: 9pt; color: black; font-family: 宋体">。用drop命令删除tab_test表<br />
SQL&gt;droptabletab_test;<br />
<br />
Tabledropped<br />
4。查看用户回收站信息,此时会记录删除后的对象在回收站中的相关信息，此时还能正常操作回收站中的对象，但不能操作DDL/DML语句<br />
SQL&gt;selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;<br />
<br />
OBJECT_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORIGINAL_NAME&nbsp;TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><em><span style="font-size: 9pt; color: red; font-family: 宋体">------------------------------ ------------- ------</span></em><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
BIN$a+iPOcq+QXiwUT8B3c3QoA==$0 IND_TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INDEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
BIN$zFJjV8zFSlqbLecXbDeANQ==$0 TAB_TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
SQL&gt;selectcount(*)from"BIN$zFJjV8zFSlqbLecXbDeANQ==$0";<br />
<br />
&nbsp;COUNT(*)<br />
</span><em><span style="font-size: 9pt; color: red; font-family: 宋体">----------</span></em><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt; color: #0000f0; font-family: 宋体">40699</span><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
<br />
SQL&gt;deletefrom"BIN$zFJjV8zFSlqbLecXbDeANQ==$0";<br />
<br />
deletefrom"BIN$zFJjV8zFSlqbLecXbDeANQ==$0"<br />
ORA-</span><span style="font-size: 9pt; color: #0000f0; font-family: 宋体">38301</span><span style="font-size: 9pt; color: black; font-family: 宋体">:</span><span style="font-size: 9pt; color: black; font-family: 宋体">无法对回收站中的对象执行DDL/DML</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">5</span><span style="font-size: 9pt; color: black; font-family: 宋体">．用flashback恢复表到删除之前的状态<br />
SQL&gt;flashbacktabletab_testtobeforedrop;<br />
Done</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; select count(*) from tab_test;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;COUNT(*)</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">----------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;40699</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">6.</span><span style="font-size: 9pt; font-family: 宋体">恢复表的索引（此时表中的索引同时也被恢复了，只不过该索引还是保留回收站中的索引名称）</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">SQL&gt; select index_name from user_indexes where table_name = 'TAB_TEST';</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">INDEX_NAME</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">------------------------------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">BIN$a+iPOcq+QXiwUT8B3c3QoA==$0</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">SQL&gt; alter index "BIN$a+iPOcq+QXiwUT8B3c3QoA==$0" rename to ind_test;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">Index altered</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">SQL&gt; select index_name from user_indexes where table_name = 'TAB_TEST';</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">INDEX_NAME</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">------------------------------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">IND_TEST</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">示例2：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">1.</span><span style="font-size: 9pt; font-family: 宋体">查看用户下回收站的信息，此时回收站为空</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL</span><span style="font-size: 9pt; color: black; font-family: 宋体">&gt;selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;<br />
OBJECT_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORIGINAL_NAME&nbsp;TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><em><span style="font-size: 9pt; color: red; font-family: 宋体">------------------------------ ------------- ------</span></em><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
2.</span><span style="font-size: 9pt; color: black; font-family: 宋体">创建测试表test1，并输入数据<br />
SQL&gt; create table test1(id number);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">Table created</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; insert into test1 values(1);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">1 row inserted</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; insert into test1 values(2);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">1 row inserted</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; insert into test1 values(3);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">1 row inserted</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; insert into test1 values(4);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">1 row inserted</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; commit;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">Commit complete</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; select count(*) from test1;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;COUNT(*)</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">----------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">3</span><span style="font-size: 9pt; color: black; font-family: 宋体">．删除test1表，然后在重新创建test1表</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; drop table test1;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">Table dropped</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; create table test1(id number);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">Table created</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; insert into test1 values(1);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">1 row inserted</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; commit;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">Commit complete</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; select count(*) from test1;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;COUNT(*)</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">----------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">4.</span><span style="font-size: 9pt; color: black; font-family: 宋体">再次删除test1表</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; drop table test1;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">Table dropped</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">5</span><span style="font-size: 9pt; color: black; font-family: 宋体">．查询回收站信息(此时回收站中有两条test1表的数据)</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL</span><span style="font-size: 9pt; color: black; font-family: 宋体">&gt;select*fromuser_recyclebin;<br />
<br />
OBJECT_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORIGINAL_NAME&nbsp;&nbsp;TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><em><span style="font-size: 9pt; color: red; font-family: 宋体">------------------------------ --------------------</span></em><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
BIN$Uk69X077TQWqQ0OQ3u1FdQ==$0 TEST1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
BIN$kpG5ZWdlRUi/jO6X0EYP+A==$0 TEST1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">5.</span><span style="font-size: 9pt; color: black; font-family: 宋体">用flashback恢复表到删除之前的状态</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; flashback table test1 to before drop;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">Done</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">SQL&gt; select count(*) from test1;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;COUNT(*)</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">----------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; color: black; font-family: 宋体">此时查看恢复后的test1，发现恢复到最近一次的信息，因此可说明多次删除后，在回收站中会存在多条与test1有关的数据，而用flashback table test1 to before drop命令恢复到的是test1表中最近一次删除的信息</span></p>
<br />
<img src ="http://www.blogjava.net/xzclog/aggbug/327969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-08-04 20:40 <a href="http://www.blogjava.net/xzclog/archive/2010/08/04/327969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle闪回查询恢复delete删除数据</title><link>http://www.blogjava.net/xzclog/archive/2010/08/04/327967.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 04 Aug 2010 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/08/04/327967.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/327967.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/08/04/327967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/327967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/327967.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Flashback query(</font><span style="font-family: 宋体">闪回查询</span><font face="Times New Roman">)</font><span style="font-family: 宋体">原理</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">&nbsp;&nbsp;<a onclick="javascript:tagshow(event, 'Oracle');" href="javascript:;" target="_self"><u><strong>Oracle</strong></u></a></font><span style="font-family: 宋体">根据</span><font face="Times New Roman">undo</font><span style="font-family: 宋体">信息，利用</span><font face="Times New Roman">undo</font><span style="font-family: 宋体">数据，类似一致性读取方法，可以把表置于一个删除前的时间点</span><font face="Times New Roman">(</font><span style="font-family: 宋体">或</span><font face="Times New Roman">SCN)</font><span style="font-family: 宋体">，从而将数据找回。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Flashback query(</font><span style="font-family: 宋体">闪回查询</span><font face="Times New Roman">)</font><span style="font-family: 宋体">前提：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; show parameter undo;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUE</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">------------------------------------ ----------- ------------------------------</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">undo_management&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AUTO</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">undo_retention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integer&nbsp;&nbsp;&nbsp;&nbsp;900</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">undo_tablespace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNDOTBS1</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">其中</span><font face="Times New Roman">undo_management = auto</font><span style="font-family: 宋体">，设置自动</span><font face="Times New Roman">undo</font><span style="font-family: 宋体"><a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="javascript:;" target="_self"><u><strong>管理</strong></u></a>（</span><font face="Times New Roman">AUM</font><span style="font-family: 宋体">），该参数默认设置为：</span><font face="Times New Roman">auto</font><span style="font-family: 宋体">；</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Undo_retention = n(</font><span style="font-family: 宋体">秒</span><font face="Times New Roman">),</font><span style="font-family: 宋体">设置决定</span><font face="Times New Roman">undo</font><span style="font-family: 宋体">最多的保存时间，其值越大，就需要越多的</span><font face="Times New Roman">undo</font><span style="font-family: 宋体">表空间的支持。修改</span><font face="Times New Roman">undo_retention</font><span style="font-family: 宋体">的命令如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; alter system set undo_retention = 3600;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">System altered</font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">闪回实现方式</font></span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-family: 宋体">获取数据删除前的一个时间点或</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">，如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt;select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn&nbsp;from dual;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCN</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">------------------- ----------------------------------------</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">2010-06-29 23:03:14 1060499</font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-family: 宋体">查询该时间点（或</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">）的数据，如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; select * from t as of timestamp to_timestamp('2010-06-29 22:57:47', 'yyyy-mm-dd hh24:mi:ss');</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; select * from t as of scn 1060174;</font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-family: 宋体">将查询到的数据，新增到表中。也可用更直接的方法，如：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">SQL&gt;</font>create<span style="font-size: 8pt; color: black; font-family: 'Courier New'">&nbsp;table tab_test as select * from t of timestamp to_timestamp(</span></font><span style="font-size: 8pt; font-family: 'Courier New'"><font size="2">'2010-06-29 22:57:47', 'yyyy-mm-dd hh24:mi:ss'</font><span style="color: black"><font size="2">);<br />
</font></span></span><font size="2"><font face="Times New Roman">SQL&gt;</font>insert into tab_test select * from<span style="font-size: 8pt; font-family: 'Courier New'">1060174;</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-size: 8pt; font-family: 宋体">示例：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 8pt; font-family: 'Courier New'"><font size="2">Create table t(id&nbsp;number);</font></span></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">insert</font><font size="2">into t values(1);<br />
insert into t values(2);<br />
insert into t values(3);<br />
insert into t values(4);<br />
insert into t values(5);</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">1.</font><span style="font-family: 宋体">查看</span><font face="Times New Roman">t</font><span style="font-family: 宋体">表中的原始数据</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; select * from t;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID</font></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 26.25pt"><font face="Times New Roman" size="2">---------</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">2</font><span style="font-family: 宋体">．获取数据删除前的一个时间点或</span><font face="Times New Roman">scn</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn&nbsp;from dual;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCN</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">------------------- ----------------------------------------</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">2010-06-29 23:23:33&nbsp;&nbsp;1061279</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">3</font><span style="font-family: 宋体">．删除</span><font face="Times New Roman">t</font><span style="font-family: 宋体">表中的数据，并提交事物</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; delete from t;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">5 rows deleted</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; commit;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">Commit complete</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">4</font><span style="font-family: 宋体">．在查看</span><font face="Times New Roman">t</font><span style="font-family: 宋体">表，此时</span><font face="Times New Roman">t</font><span style="font-family: 宋体">表中数据以删除</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; select * from t;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">----------</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">5</font><span style="font-family: 宋体">．查看</span><font face="Times New Roman">t</font><span style="font-family: 宋体">表中</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">为</span><font face="Times New Roman">1061279(</font><span style="font-family: 宋体">或时间点为</span><font face="Times New Roman">2010-06-29 23:23:33)</font><span style="font-family: 宋体">时的数据</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; select * from t as of scn 1061279;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">----------</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">6</font><span style="font-family: 宋体">．确认要恢复后，将</span><font face="Times New Roman">t</font><span style="font-family: 宋体">表中的数据还原到</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">为</span><font face="Times New Roman">1061279(</font><span style="font-family: 宋体">或时间点为</span><font face="Times New Roman">2010-06-29 23:23:33)</font><span style="font-family: 宋体">时的数据，并提交事物</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; insert into t select * from t as of scn 1061279;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">5 rows inserted</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; commit;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">Commit complete</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">7</font><span style="font-family: 宋体">．确认</span><font face="Times New Roman">t</font><span style="font-family: 宋体">表数据的还原情况</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt; select * from t;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">----------</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">注：推荐使用</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">，由于</span><font face="Times New Roman">oracle9i</font><span style="font-family: 宋体">中，因为</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">与时间点的同步需要</span><font face="Times New Roman">5</font><span style="font-family: 宋体">分钟，如果最近</span><font face="Times New Roman">5</font><span style="font-family: 宋体">分钟之内的数据需要</span><font face="Times New Roman">Falshback query</font><span style="font-family: 宋体">查询，可能会查询丢失，而</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">则不存在这个问题。</span><font face="Times New Roman">Oracle10g</font><span style="font-family: 宋体">中这个问题已修正（</span><font face="Times New Roman">scn</font><span style="font-family: 宋体">与时间点的大致关系，可以通过</span><font face="Times New Roman">logmnr</font><span style="font-family: 宋体">分析归档日志获得）。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Falshback query</font><span style="font-family: 宋体">查询的局限：</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">1．&nbsp;</font><span style="font-family: 宋体">不能</span><font face="Times New Roman">Falshback</font><span style="font-family: 宋体">到</span><font face="Times New Roman">5</font><span style="font-family: 宋体">天以前的数据。</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">2．&nbsp;</font><span style="font-family: 宋体">闪回查询无法恢复到表结构改变之前，因为闪回查询使用的是当前的数据字典。</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">3．&nbsp;</font><span style="font-family: 宋体">受到</span><font face="Times New Roman">undo_retention</font><span style="font-family: 宋体">参数的影响，对于</span><font face="Times New Roman">undo_retention</font><span style="font-family: 宋体">之前的数据，</span><font face="Times New Roman">Flashback</font><span style="font-family: 宋体">不保证能</span><font face="Times New Roman">Flashback</font><span style="font-family: 宋体">成功。</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">4．&nbsp;</font><span style="font-family: 宋体">对</span><font face="Times New Roman">drop,truncate</font><span style="font-family: 宋体">等不记录回滚的操作，不能恢复。</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font size="2"><font face="Times New Roman">5．&nbsp;</font><span style="font-family: 宋体">普通用户使用</span><font face="Times New Roman">dbms_flashback</font><span style="font-family: 宋体">包，必须通过管理员授权。命令如下</span><font face="Times New Roman">:</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="2">SQL&gt;grant execute on dbms_flashback to scott;</font></p>
<img src ="http://www.blogjava.net/xzclog/aggbug/327967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-08-04 20:39 <a href="http://www.blogjava.net/xzclog/archive/2010/08/04/327967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>