﻿<?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-Thinking in java &lt;p&gt;&lt;font color='#DF7401'&gt;学海无涯乐作舟&lt;/font&gt;&lt;/p&gt;-文章分类-Oracle</title><link>http://www.blogjava.net/wuynng/category/28132.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 21 Nov 2009 22:05:58 GMT</lastBuildDate><pubDate>Sat, 21 Nov 2009 22:05:58 GMT</pubDate><ttl>60</ttl><item><title>Oracle JOB相关资料介绍</title><link>http://www.blogjava.net/wuynng/articles/302783.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Wed, 18 Nov 2009 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/302783.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/302783.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/302783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/302783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/302783.html</trackback:ping><description><![CDATA[<p>Oracle JOB相关资料介绍 <br />
&nbsp;<br />
（一）关于Oracle JOB的用法<br />
一、设置初始化参数 job_queue_processes</p>
<p>　　sql&gt; alter system set job_queue_processes=n;（n&gt;0）<br />
　　job_queue_processes最大值为1000<br />
　　<br />
二、查看job queue 后台进程</p>
<p>SQL&gt; select name,description from v$bgprocess;</p>
<p>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESCRIPTION<br />
---------- --------------------------------------------<br />
PMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process cleanup<br />
DIAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diagnosibility process<br />
FMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File Mapping Monitor Process<br />
LMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global enqueue service monitor<br />
LMD0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global enqueue service daemon 0<br />
LMS0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global cache service process 0<br />
LMS1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global cache service process 1<br />
LMS2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global cache service process 2<br />
LMS3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global cache service process 3<br />
LMS4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global cache service process 4<br />
LMS5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global cache service process 5<br />
。。。。。。。。。。。。。。。。。。。。<br />
　　<br />
三、dbms_job package 语法介绍</p>
<p>　　包含以下子过程： <br />
　　<br />
　　Broken()过程。<br />
　　change()过程。<br />
　　Interval()过程。<br />
　　Isubmit()过程。<br />
　　Next_Date()过程。<br />
　　Remove()过程。<br />
　　Run()过程。<br />
　　Submit()过程。<br />
　　User_Export()过程。<br />
　　What()过程。<br />
　　<br />
　　A、Broken()过程更新一个已提交的工作的状态，典型地是用来把一个已破工作标记为未破工作。<br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程有三个参数：job ，broken与next_date。<br />
　　<br />
　　PROCEDURE Broken (job&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN binary_integer,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; Broken&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN boolean,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; next_date&nbsp;&nbsp; IN date :=SYSDATE)<br />
　　<br />
　　job参数是工作号，它在问题中唯一标识工作。<br />
　　broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破，而FLASE说明此工作将标记为未破。<br />
　　next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。<br />
　　job如果由于某种原因未能成功之行，oracle将重试16次后，还未能成功执行，将被标记为broken重新启动状态为broken的job，有如下两种方式;<br />
　　a、利用dbms_job.run()立即执行该job<br />
　　　 sql&gt;begin<br />
　　　 sql&gt;dbms_job.run(:jobno) 该jobno为submit过程提交时返回的job number<br />
　　　 sql&gt;end;<br />
　　　 sql&gt;/<br />
　　b、利用dbms_job.broken()重新将broken标记为false<br />
　　　 sql&gt;begin<br />
　　　 sql&gt;dbms_job.broken (:job,false,next_date)<br />
　　　 sql&gt;end;<br />
　　　 sql&gt;/<br />
　　B、Change()过程用来改变指定工作的设置。<br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程有四个参数：job、what 、next_date与interval。<br />
　　<br />
　　PROCEDURE Change (job　　　　 IN binary_integer,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; What　　　 IN varchar2,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; next_date　 IN date,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; interval　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN varchar2)<br />
　　<br />
　　此job参数是一个整数值，它唯一标识此工作。<br />
　　What参数是由此工作运行的一块PL/SQL代码块。<br />
　　next_date参数指示何时此工作将被执行。<br />
　　interval参数指示一个工作重执行的频度。<br />
　　<br />
　　C、Interval()过程用来显式地设置重执行一个工作之间的时间间隔数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程有两个参数：job与interval。<br />
　　<br />
　　PROCEDURE Interval (job　　　IN binary_integer,<br />
　　　　　　　　　　　　 Interval&nbsp;&nbsp;&nbsp; IN varchar2)<br />
　　<br />
　　job参数标识一个特定的工作。interval参数指示一个工作重执行的频度。<br />
　　<br />
　　D、ISubmit()过程用来用特定的工作号提交一个工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程有五个参数：job、what、next_date、interval与no_parse。<br />
　　<br />
　　PROCEDURE ISubmit (job　　　 IN binary_ineger,<br />
　　　　　　　　　　　 What　　　 IN varchar2,<br />
　　　　　　　　　　　 next_date&nbsp;&nbsp;&nbsp;&nbsp; IN date,<br />
　　　　　　　　　　　 interval　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN varchar2,<br />
　　　　　　　　　　　 no_parse　 IN booean:=FALSE)<br />
　　<br />
　　这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。如果提供的工作号已被使用，将产生一个错误。<br />
　　<br />
　　E、Next_Date()过程用来显式地设定一个工作的执行时间。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程接收两个参数：job与next_date。<br />
　　<br />
　　PROCEDURE Next_Date(job　　　　 IN binary_ineger,<br />
　　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; next_date　 IN date)<br />
　　job标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。<br />
　　<br />
　　F、Remove()过程来删除一个已计划运行的工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程接收一个参数：<br />
　　<br />
　　PROCEDURE Remove(job IN　binary_ineger);<br />
　　<br />
　　job参数唯一地标识一个工作。这个参数的值是由为此工作调用Submit()过程返回的job参数的值。已正在运行的工作不能由调用过程序删除。<br />
　　<br />
　　G、Run()过程用来立即执行一个指定的工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程只接收一个参数：<br />
　　<br />
　　PROCEDURE Run(job IN binary_ineger) <br />
　　<br />
　　job参数标识将被立即执行的工作。<br />
　　<br />
　　H、使用Submit()过程，工作被正常地计划好。<br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程有五个参数：job、what、next_date、interval与no_parse。<br />
　　<br />
　　PROCEDURE Submit ( job　　　&nbsp;&nbsp; OUT binary_ineger,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; What　　　IN　varchar2,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; next_date&nbsp;&nbsp; IN　date,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; interval　&nbsp;&nbsp;&nbsp; IN　varchar2,<br />
　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; no_parse　IN　booean:=FALSE)<br />
　　<br />
　　job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。<br />
　　what参数是将被执行的PL/SQL代码块。<br />
　　next_date参数指识何时将运行这个工作。<br />
　　interval参数何时这个工作将被重执行。<br />
　　no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析，而FALSE指示本PL/SQL代码应立即进行语法分析。<br />
　　<br />
　　I、User_Export()过程返回一个命令，此命令用来安排一个存在的工作以便此工作能重新提交。<br />
　　&nbsp;&nbsp;&nbsp; 此程序有两个参数：job与my_call。<br />
　　<br />
　　PROCEDURE User_Export(job　　　　IN binary_ineger,<br />
　　　　　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp; my_call　　IN OUT varchar2)<br />
　　<br />
　　job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。<br />
　　<br />
　　J、What()过程应许在工作执行时重新设置此正在运行的命令。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程接收两个参数：job与what。<br />
　　<br />
　　PROCEDURE What (job　IN binary_ineger,<br />
　　　　　　　　　　&nbsp;&nbsp;&nbsp; What IN OUT varchar2)<br />
　　job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。<br />
　　<br />
四、查看相关job信息</p>
<p>　　a、相关视图</p>
<p>　　dba_jobs<br />
　　all_jobs<br />
　　user_jobs<br />
　　dba_jobs_running 包含正在运行job相关信息<br />
　　<br />
　　查看相关信息<br />
　　<br />
　　SQL&gt;SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM DBA_JOBS;<br />
　　<br />
　　正在运行的JOB相关信息<br />
　　<br />
　　SELECT SID, r.JOB, LOG_USER, r.THIS_DATE, r.THIS_SEC FROM DBA_JOBS_RUNNING r, DBA_JOBS j　WHERE r.JOB = j.JOB;<br />
　　</p>
<p>　　JOB QUEUE LOCK相关信息<br />
　　<br />
　　SELECT SID, TYPE, ID1, ID2 FROM V$LOCK WHERE TYPE = 'JQ';<br />
　　<br />
四、简单例子　　<br />
　　<br />
创建JOB<br />
begin<br />
sys.dbms_job.submit(job =&gt; :job,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; what =&gt; 'P_CLEAR_PACKBAL;',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next_date =&gt; to_date('24-04-2008 05:44:09', 'dd-mm-yyyy hh24:mi:ss'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interval =&gt; 'sysdate+ 1/360');<br />
commit;<br />
end;<br />
/　　<br />
（二）关于Oracle Job 语法和时间间隔的设定</p>
<p>begin<br />
sys.dbms_job.submit(job =&gt; :job,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; what =&gt; 'P_CLEAR_PACKBAL;',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next_date =&gt; to_date('24-04-2008 05:44:09', 'dd-mm-yyyy hh24:mi:ss'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interval =&gt; 'sysdate+ 1/360');<br />
commit;<br />
end;<br />
/</p>
<p>1:每分钟执行</p>
<p>Interval =&gt; TRUNC(sysdate,'mi') + 1/ (24*60)</p>
<p>2:每天定时执行</p>
<p>例如：每天的凌晨1点执行</p>
<p>Interval =&gt; TRUNC(sysdate) + 1 +1/ (24)</p>
<p>3:每周定时执行</p>
<p>例如：每周一凌晨1点执行</p>
<p>Interval =&gt; TRUNC(next_day(sysdate,'星期一'))+1/24</p>
<p>4:每月定时执行</p>
<p>例如：每月1日凌晨1点执行</p>
<p>Interval =&gt;TRUNC(LAST_DAY(SYSDATE))+1+1/24</p>
<p>5:每季度定时执行</p>
<p>例如每季度的第一天凌晨1点执行</p>
<p>Interval =&gt; TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24</p>
<p>6:每半年定时执行</p>
<p>例如：每年7月1日和1月1日凌晨1点</p>
<p>Interval =&gt; ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24</p>
<p>7:每年定时执行</p>
<p>例如：每年1月1日凌晨1点执行</p>
<p>Interval =&gt;ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24</p>
<p>(三）Oracle JOB问题解决汇总</p>
<p>一。job的运行频率设置</p>
<p>1.每天固定时间运行，比如早上8:10分钟：Trunc(Sysdate+1) + (8*60+10)/24*60</p>
<p>2.Toad中提供的：</p>
<p>每天：trunc(sysdate+1)</p>
<p>每周：trunc(sysdate+7)</p>
<p>每月：trunc(sysdate+30)</p>
<p>每个星期日：next_day(trunc(sysdate),'SUNDAY')</p>
<p>每天6点：trunc(sysdate+1)+6/24</p>
<p>半个小时：sysdate+30/1440</p>
<p>3.每个小时的第15分钟运行，比如：8:15，9:15，10:15...：trunc(sysdate,'hh')+75/1440。原先我设置的是trunc(sysdate,'hh')+15/1440，发现居然不行。</p>
<p>二。JOB为什么不运行？</p>
<p>1.先来了解一下JOB的参数说明：与job相关的参数一个是job_queue_processes，这个是运行JOB时候所起的进程数，当然系统里面JOB大于这个数值后，就会有排队等候的，最小值是0，表示不运行JOB，最大值是36，在OS上对应的进程时SNPn，9i以后OS上管理JOB的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。</p>
<p>select * from v$bgprocess，这个paddr不为空的snp/cjq进程就是目前空闲的进程，有的表示正在工作的进程。</p>
<p>另外一个是job_queue_interval，范围在1--3600之间，单位是秒，这个是唤醒JOB的process，因为每次snp运行完他就休息了，需要定期唤醒他，这个值不能太小，太小会影响数据库的性能。</p>
<p>2.诊断：先确定上面这两个参数设置是否正确，特别是第一个参数，设置为0了，所有JOB就不会跑，确认无误后，我们继续向下。</p>
<p>3.使用下面的SQL察看JOB的的broken,last_date和next_date，last_date是指最近一次job运行成功的结束时间，next_date是根据设置的频率计算的下次执行时间，根据这个信息就可以判断JOB上次是否正常，还可以判断下次的时间对不对，SQL如下：</p>
<p>select * from dba_jobs</p>
<p>有时候我们发现他的next_date是4000年1月1日，说明job要不就是在running，要不就是状态是break(broken=Y)，如果发现JOB的broken值为Y，找用户了解一下，确定该JOB是否可以broken，如果不能broken，那就把broken值修改成N，修改再使用上面的SQL察看就发现他的last_date已经变了，JOB即可正常运行，修改broken状态的SQL如下：</p>
<p>declare</p>
<p>BEGIN</p>
<p>DBMS_JOB.BROKEN(&lt;JOB_ID&gt;,FALSE);</p>
<p>END;</p>
<p>4.使用下面的SQL查询是否JOB还在Running</p>
<p>select * from dba_jobs_running</p>
<p>如果发现JOB已经Run了很久了还没有结束，就要查原因了。一般的JOB running时会锁定相关的相关的资源，可以查看一下v$access和v$locked_object这两个view，如果发现其他进程锁定了与JOB相关的Object，包括PKG/Function/Procedure/Table等资源，那么就要把其他进程删除，有必要的话，把JOB的进程也删除，再重新跑看看结果。</p>
<p>5.如果上面都正常，但是JOB还不run，怎么办？那我们要考虑把JOB进程重启一次，防止是SNP进程死了造成JOB不跑，指令如下：</p>
<p>alter system set job_queue_processes=0 --关闭job进程，等待5--10秒钟</p>
<p>alter system set job_quene_processes=5 --恢复原来的值</p>
<p>6.Oracle的BUG</p>
<p>Oracle9i里面有一个BUG，当计数器到497天时，刚好达到它的最大值，再计数就会变成-1，继续计数就变成0了，然后计数器将不再跑了。如果碰到这种情况就得重启数据库，我们这边有一个生产型的数据库版本是9205，就发生过这样一次问题，后来和用户约时间重启后就没问题了。但是其他的Oracle7345和Oracle8i的数据库没有发现这个问题。</p>
<p>7.数据库上的检查基本上就这多，如果JOB运行还有问题，那需要配合用户察看一下是否是程序本身的问题，比如处理的资料量大，或者网络速度慢等造成运行时过长，那就需要具体情况具体分析了。我们可以通过下面的SQL手工执行一下JOB看看：</p>
<p>declare</p>
<p>begin</p>
<p>dbms_job.run(&lt;job&gt;_ID)</p>
<p>end;</p>
<p>如果发现JOB执行不正常，就要结合程序具体分析一下。</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/leiru/archive/2008/09/23/2968636.aspx</p>
<img src ="http://www.blogjava.net/wuynng/aggbug/302783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2009-11-18 12:46 <a href="http://www.blogjava.net/wuynng/articles/302783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 9i 分区操作管理</title><link>http://www.blogjava.net/wuynng/articles/302403.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Sun, 15 Nov 2009 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/302403.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/302403.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/302403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/302403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/302403.html</trackback:ping><description><![CDATA[<font face="Arial, Helvetica, sans-serif" color="#330099">Truncating Partitions(删除分区)</font><br />
方法1: 适合数据量较大的表<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">--</span><span style="color: #008080">truncate&nbsp;名称为dec98的分区</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<span style="color: #0000ff">ALTER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;sales&nbsp;</span><span style="color: #0000ff">TRUNCATE</span><span style="color: #000000">&nbsp;PARTITION&nbsp;dec98;&nbsp;</span><span style="color: #008080"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #0000ff"><span style="color: #008080">--</span><span style="color: #008080">重建全局索引</span><br />
ALTER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INDEX</span><span style="color: #000000">&nbsp;sales_area_ix&nbsp;REBUILD;&nbsp;</span></div>
<br />
<br />
参考: <a title="Managing Partitioned Tables and Indexes" href="http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/partiti.htm#27573">Managing Partitioned Tables and Indexes</a><a href="http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/partiti.htm#27573"></a></a>
<img src ="http://www.blogjava.net/wuynng/aggbug/302403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2009-11-15 12:57 <a href="http://www.blogjava.net/wuynng/articles/302403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Sql Loader中文字符导入乱码的解决方案</title><link>http://www.blogjava.net/wuynng/articles/301033.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Wed, 04 Nov 2009 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/301033.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/301033.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/301033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/301033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/301033.html</trackback:ping><description><![CDATA[<p>服务器端字符集NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK</p>
<p>控制文件ctl:<br />
LOAD DATA<br />
<span style="color: red">CHARACTERSET ZHS16GBK</span><br />
INFILE 'c:\test.csv'<br />
APPEND&nbsp; INTO TABLE stk_al_version<br />
FIELDS TERMINATED BY ","<br />
(org_no,stk_c,version,name)</p>
<p>加入红色这段文字</p>
<p>导入成功</p>
<img src ="http://www.blogjava.net/wuynng/aggbug/301033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2009-11-04 13:11 <a href="http://www.blogjava.net/wuynng/articles/301033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看和修改Oracle服务器端的字符集</title><link>http://www.blogjava.net/wuynng/articles/301032.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Wed, 04 Nov 2009 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/301032.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/301032.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/301032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/301032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/301032.html</trackback:ping><description><![CDATA[<p>下面是查看和修改Oracle服务器端的字符集两方法：</p>
<p>方法一：</p>
<p>1)&nbsp; 查看服务器端字符集：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;v$nls_parameters;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;nls_database_parameters;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;sys.props$;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>2)&nbsp; 修改服务器端字符集(用sys用户)：</p>
<p>首先执行：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">update</span><span style="color: #000000">&nbsp;props$&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;value$&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">WE8ISO8859P1</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;name&nbsp;</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">NLS_CHARACTERSET</span><span style="color: #ff0000">'</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">update</span><span style="color: #000000">&nbsp;props$&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;value$&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">china</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;name&nbsp;</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">NLS_LANGUAGE</span><span style="color: #ff0000">'</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>提交（commit），然后，重新启动数据库；</p>
<p>3）用客户端工具（PL/SQL DEVELOP or PB etc.）查询数据库，若显示乱码，先查询出数据库端的字符集，然后，从注册表中修改NLS_LANG字段的值，可能为AMERICAN_AMERICA.WE8ISO8859P1或者SIMPLIFIED CHINESE_CHINA.ZHS16GBK或者NA等。</p>
<p><br />
<br />
方法二：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">alter</span><span style="color: #000000">&nbsp;system&nbsp;enable&nbsp;restricted&nbsp;session;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">alter</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">database</span><span style="color: #000000">&nbsp;ORCL&nbsp;</span><span style="font-weight: bold; color: #000000">character</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;ZHS16GBK;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">alter</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">database</span><span style="color: #000000">&nbsp;ORCL&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">character</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;ZHS16GBK;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/wuynng/aggbug/301032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2009-11-04 13:09 <a href="http://www.blogjava.net/wuynng/articles/301032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLPLUS下执行多个文件中的SQL脚本</title><link>http://www.blogjava.net/wuynng/articles/265726.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Wed, 15 Apr 2009 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/265726.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/265726.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/265726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/265726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/265726.html</trackback:ping><description><![CDATA[目前在做PL/SQL的开发，一个FEATURE需要建立多个TABLE、VIEW或PROCEDURE，因此需要有比较快捷的方式来部署这些数据库对象。 <br />
方法如下： <br />
--deploy.bat文件，完成数据库的登录,内容如下 <br />
<span class="hilite1">sqlplus</span> username/password@dbservice @"E:\xxx\deploy.sql" <br />
--deploy.sql中按顺序罗列出待执行的SQL语句的文件，内容如下 <br />
@"E:\xxx\1.VIEW_xxx.SQL" <br />
@"E:\xxx\2.PACKAGE_xxx.pck" <br />
<br />
注意事项如下： <br />
1. 需要注意的是最好用双引号给出文件待执行文件的路径，至少ORACLE 10G不支持路径名带空格。 <br />
2. 文件中的SQL脚本有空行的话会引起一些错误。 
<img src ="http://www.blogjava.net/wuynng/aggbug/265726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2009-04-15 12:51 <a href="http://www.blogjava.net/wuynng/articles/265726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UNION 与 UNION ALL 的排序问题</title><link>http://www.blogjava.net/wuynng/articles/242419.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Mon, 24 Nov 2008 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/242419.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/242419.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/242419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/242419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/242419.html</trackback:ping><description><![CDATA[<p>UNION：默认排序，如果第一个字段重复，则按第二个字段排序，以此类推；<br />
UNION ALL：不排序。<br />
<br />
注意：<br />
1、对UNION的结果集排序时，在最后一个UNION子句后添加排序字段；<br />
2、对UNION的结果集排序时不能使用字段名，只能使用别名或者SELECT字段集的索引值，索引从 1 开始。</p>
<img src ="http://www.blogjava.net/wuynng/aggbug/242419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2008-11-25 01:15 <a href="http://www.blogjava.net/wuynng/articles/242419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 分页查询出现重复记录的解决办法</title><link>http://www.blogjava.net/wuynng/articles/239006.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Thu, 06 Nov 2008 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/239006.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/239006.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/239006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/239006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/239006.html</trackback:ping><description><![CDATA[分页语句：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">user</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;userName)&nbsp;<br />
</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;rownum&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;rownum&nbsp;</span><span style="color: #808080">&gt;=</span><span style="font-weight: bold; color: #800000">1</span></div>
在这里，如果排序字段userName是唯一的则不会出现问题，否则就会出现重复记录的问题。<br />
<br />
解决办法是，如果不能确定排序字段是唯一的，必须添加另外一个排序字段，该字段最好是唯一索引键，如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">user</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;userName,&nbsp;<span style="color: red">userId</span>)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;rownum&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;rownum&nbsp;</span><span style="color: #808080">&gt;=</span><span style="font-weight: bold; color: #800000">1</span></div>
<img src ="http://www.blogjava.net/wuynng/aggbug/239006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2008-11-06 13:07 <a href="http://www.blogjava.net/wuynng/articles/239006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Start with...Connect By子句递归查询</title><link>http://www.blogjava.net/wuynng/articles/198890.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Wed, 07 May 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/198890.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/198890.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/198890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/198890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/198890.html</trackback:ping><description><![CDATA[Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。<br />
创建示例表：<br />
CREATE TABLE TBL_TEST<br />
(<br />
&nbsp; ID&nbsp;&nbsp;&nbsp; NUMBER,<br />
&nbsp; NAME&nbsp; VARCHAR2(100 BYTE),<br />
&nbsp; PID&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT 0<br />
);<br />
&nbsp;<br />
插入测试数据：<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');<br />
&nbsp;<br />
从Root往树末梢递归<br />
select * from TBL_TEST<br />
&nbsp;start with id=1<br />
&nbsp;connect by prior id = pid<br />
&nbsp;<br />
从末梢往树ROOT递归<br />
select * from TBL_TEST<br />
&nbsp;start with id=5<br />
&nbsp;connect by prior pid = id
 <img src ="http://www.blogjava.net/wuynng/aggbug/198890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2008-05-07 10:48 <a href="http://www.blogjava.net/wuynng/articles/198890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用flashback query 恢复误操作的数据</title><link>http://www.blogjava.net/wuynng/articles/170184.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Mon, 24 Dec 2007 15:40:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/170184.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/170184.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/170184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/170184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/170184.html</trackback:ping><description><![CDATA[利用Flashback Query 恢复误操作的数据<br />
Author：Kamus Seraphim（张乐奕）<br />
Date：2003-10<br />
Mail：kamus@itpub.net<br />
转载请注明出处及作者<br />
Oracle9i 中新增的闪回查询（Flashback Query）功能对于误删除或者误更新并且已经commit<br />
了的情况，提供了简便快捷的恢复方法，而在Oracle 提供闪回查询之前，碰到这种情况只<br />
能通过备份来进行基于时间点的恢复，无疑这比闪回查询要麻烦而且费时。<br />
什么是Flashback Query<br />
利用Oracle 多版本读一致的特性，在需要的时候通过undo 来提供所需的前镜像中的数据。<br />
利用这个功能，可以看到历史数据（呵呵，就像时光倒流。月光宝盒？），甚至用历史数据<br />
来修复误操作引起的错误。可以通过指定时间或者SCN 来检索需要的数据。<br />
前提条件<br />
数据库必须处于Automatic Undo Management 状态。<br />
最大可以闪回查询的时间段由UNDO_RETENTION 初始化参数（单位为秒）指定<br />
可以通过ALTER SYSTEM SET UNDO_RETENTION = &lt;seconds&gt;;来修改参数值<br />
如何使用Flashback Query<br />
通过SQL<br />
使用SELECT 语句的AS OF 来进行闪回查询，语法如下：<br />
SQL&gt; show parameter undo_retention<br />
NAME TYPE VALUE<br />
------------------------------------ ----------- ------------------------------<br />
undo_retention integer 10800<br />
SQL&gt; show parameter undo_management<br />
NAME TYPE VALUE<br />
------------------------------------ ----------- ------------------------------<br />
undo_management string AUTO<br />
使用AS OF 关键字来对表，视图，或者物化视图进行Flashback Query，如果指定了SCN，<br />
那么expr 部分必须是一个数字，如果指定了TIMESTAMP，那么expr 必须是一个timestamp<br />
类型的值。查询结果将返回在指定的SCN 或者时间点上的数据。<br />
下面我们使用scott 方案来作一个实验。<br />
[zhangleyi@linux9 bin]$ sqlplus /nolog<br />
SQL*Plus: Release 9.2.0.1.0 - Production on Thu Oct 9 23:44:07 2003<br />
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.<br />
SQL&gt; connect scott/tiger<br />
Connected.<br />
SQL&gt; select sal from emp where empno=7369;<br />
SAL<br />
----------<br />
800<br />
SQL&gt; update emp set sal=4000 where empno=7369;<br />
1 row updated.<br />
SQL&gt; commit;<br />
Commit complete.<br />
SQL&gt; select sal from emp where empno=7369;<br />
SAL<br />
----------<br />
4000<br />
备注：TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY)指查询距当前时间一天以<br />
前的时间点的数据，如果我们要查询一小时以前的，那么需要将DAY 替换成HOUR 即可，<br />
查询10 分钟以前的将'1' DAY 替换'10' MINUTE。<br />
以上演示了对于误更新的字段进行恢复的方法，但是如果想在update 的子查询部分使用AS<br />
OF 那么该查询只能返回一条记录，否则将会报错。如下：<br />
SQL&gt; select empno,sal from emp;<br />
EMPNO SAL<br />
---------- ----------<br />
7369 800<br />
7499 1600<br />
7521 1250<br />
7566 2975<br />
7654 1250<br />
7698 2850<br />
7782 2450<br />
7788 3000<br />
SQL&gt; select sal from emp<br />
2 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);<br />
3 where empno=7369;<br />
SAL<br />
----------<br />
800<br />
SQL&gt; update emp set sal=<br />
2 (select sal from emp<br />
3 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY)<br />
4 where empno=7369)<br />
5 where empno=7369;<br />
1 row updated.<br />
SQL&gt; select sal from emp where empno=7369;<br />
SAL<br />
----------<br />
800<br />
SQL&gt; commit;<br />
7839 5000<br />
7844 1500<br />
7876 1100<br />
EMPNO SAL<br />
---------- ----------<br />
7900 950<br />
7902 3000<br />
7934 1300<br />
14 rows selected.<br />
SQL&gt; update emp set sal=4000;<br />
14 rows updated.<br />
SQL&gt; commit;<br />
Commit complete.<br />
SQL&gt; select empno,sal from emp;<br />
EMPNO SAL<br />
---------- ----------<br />
7369 4000<br />
7499 4000<br />
7521 4000<br />
7566 4000<br />
7654 4000<br />
7698 4000<br />
7782 4000<br />
7788 4000<br />
7839 4000<br />
7844 4000<br />
7876 4000<br />
EMPNO SAL<br />
---------- ----------<br />
7900 4000<br />
7902 4000<br />
7934 4000<br />
14 rows selected.<br />
SQL&gt; select empno,sal from emp<br />
2 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);<br />
EMPNO SAL<br />
---------- ----------<br />
7369 800<br />
7499 1600<br />
7521 1250<br />
7566 2975<br />
7654 1250<br />
7698 2850<br />
7782 2450<br />
7788 3000<br />
7839 5000<br />
7844 1500<br />
7876 1100<br />
EMPNO SAL<br />
---------- ----------<br />
7900 950<br />
7902 3000<br />
7934 1300<br />
14 rows selected.<br />
SQL&gt; update emp a set sal =<br />
2 (select sal from emp b<br />
3 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY)<br />
4 where a.empno=b.empno);<br />
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY)<br />
*<br />
ERROR at line 3:<br />
ORA-00907: missing right parenthesis<br />
其实上面的语法是没有问题的，但是可能是因为闪回查询的特殊性导致上面的SQL 报错，<br />
而这种错误update 了大量数据时候的恢复才真正是闪回查询的方便所在，对于这种情况我<br />
们可以有两种处理方法，一种是使用DBMS_FLASHBACK 包，将在后面介绍，另外一种方<br />
法仍然是直接使用SQL，但是添加一个临时表作为中转，如下：<br />
SQL&gt; create table empsal_temp as<br />
2 select empno,sal from emp<br />
3 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);<br />
Table created.<br />
SQL&gt; update emp a set sal =<br />
2 (select sal from empsal_temp b<br />
3 where a.empno=b.empno);<br />
14 rows updated.<br />
SQL&gt; select empno,sal from emp;<br />
EMPNO SAL<br />
---------- ----------<br />
7369 800<br />
7499 1600<br />
7521 1250<br />
7566 2975<br />
7654 1250<br />
7698 2850<br />
7782 2450<br />
7788 3000<br />
7839 5000<br />
7844 1500<br />
7876 1100<br />
EMPNO SAL<br />
---------- ----------<br />
7900 950<br />
7902 3000<br />
7934 1300<br />
14 rows selected.<br />
SQL&gt; commit;<br />
Commit complete.<br />
SQL&gt; drop table empsal_temp;<br />
Table dropped.<br />
这样我们就完成了错误数据的恢复。COOL!! RIGHT? :D<br />
介绍DBMS_FLASHBACK 包<br />
DBMS_FLASHBACK 包提供了以下几个函数：<br />
ENABLE_AT_TIME：设置当前SESSION 的闪回查询时间<br />
ENABLE_AT_SYSTEM_CHANGE_NUMBER：设置当前SESSION 的闪回查询SCN<br />
GET_SYSTEM_CHANGE_NUMBER：取得当前数据库的SCN<br />
比如：select dbms_flashback.get_system_change_number from dual；<br />
DISABLE：关闭当前SESSION 的闪回查询<br />
当将一个SESSION 设置为闪回查询模式之后，后续的查询都会基于那个时间点或者SCN 的<br />
数据库状态，如果SESSION 结束，那么即使没有明确指定DISABLE，闪回查询也会自动失<br />
效。<br />
当SESSION 运行在闪回查询状态时，不允许进行任何DML 和DDL 操作。如果要用DML<br />
操作来进行数据恢复就必须使用PL/SQL 游标。<br />
即使SESSION 运行在闪回查询模式，SYSDATE 函数也不会受到影响，仍然会返回当前正<br />
确的系统时间。<br />
下面我们用一个例子说明如何使用DBMS_FLASHBACK 包来恢复数据。<br />
假设由于误操作删除了SCOTT.EMP 表中的所有数据，现在我们要恢复。<br />
SQL&gt; delete from emp;<br />
14 rows deleted.<br />
SQL&gt; commit;<br />
Commit complete.<br />
SQL&gt; select count(*) from emp;<br />
COUNT(*)<br />
----------<br />
0<br />
然后执行下面的SQL 创建一个存储过程用于恢复数据<br />
CREATE OR REPLACE PROCEDURE prc_recoveremp IS<br />
CURSOR c_emp IS<br />
SELECT * FROM scott.emp;<br />
v_row c_emp%ROWTYPE;<br />
BEGIN<br />
DBMS_FLASHBACK.ENABLE_AT_TIME(SYSTIMESTAMP - INTERVAL '1' DAY);<br />
OPEN c_emp;<br />
DBMS_FLASHBACK.DISABLE;<br />
LOOP<br />
FETCH c_emp<br />
INTO v_row;<br />
EXIT WHEN c_emp%NOTFOUND;<br />
INSERT INTO scott.emp<br />
VALUES<br />
(v_row.EMPNO,<br />
v_row.ENAME,<br />
v_row.JOB,<br />
v_row.MGR,<br />
v_row.HIREDATE,<br />
v_row.SAL,<br />
v_row.COMM,<br />
v_row.DEPTNO);<br />
END LOOP;<br />
CLOSE c_emp;<br />
COMMIT;<br />
END prc_recoveremp;<br />
SQL&gt; execute prc_recoveremp;<br />
PL/SQL procedure successfully completed.<br />
SQL&gt; select count(*) from emp;<br />
COUNT(*)<br />
----------<br />
14<br />
到此成功结束，检查EMP 表可以看到所有的数据已经全部都恢复了。<br />
备注：在存储过程中我们创建了游标之后就将执行了DBMS_FLASHBACK.DISABLE，只<br />
有这样我们才能在这个SESSION 中进行DML 操作。否则将产生ORA-08182 错误，In<br />
Flashback mode, user cannot perform DML or DDL operations。<br />
以上例子中的所有恢复都是基于时间点的，下面介绍基于SCN 的闪回查询。<br />
既然已经有基于时间点的恢复，为什么还需要基于SCN 呢，我们先来看一个例子。<br />
[zhangleyi@linux9 oralinux]$ sqlplus scott/tiger<br />
SQL*Plus: Release 9.2.0.1.0 - Production on Sat Oct 11 02:26:20 2003<br />
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.<br />
Connected to:<br />
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production<br />
With the Partitioning, OLAP and Oracle Data Mining options<br />
JServer Release 9.2.0.1.0 - Production<br />
SQL&gt; select * from dept;<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
SQL&gt; set time on;<br />
02:26:50 SQL&gt; insert into dept values(60,'FLASH','BEIJING');<br />
1 row created.<br />
02:27:53 SQL&gt; commit;<br />
Commit complete.<br />
02:27:57 SQL&gt; delete from dept where deptno=60;<br />
1 row deleted.<br />
02:28:19 SQL&gt; commit;<br />
Commit complete.<br />
02:28:21 SQL&gt; select * from dept as of TIMESTAMP (SYSTIMESTAMP -<br />
INTERVAL '1' MINUTE);<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
02:29:49 SQL&gt; select * from dept as of TIMESTAMP (SYSTIMESTAMP -<br />
INTERVAL '2' MINUTE);<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
02:31:11 SQL&gt; select * from dept as of TIMESTAMP (SYSTIMESTAMP -<br />
INTERVAL '3' MINUTE);<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
02:31:19 SQL&gt; select * from dept as of TIMESTAMP (SYSTIMESTAMP -<br />
INTERVAL '4' MINUTE);<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
02:31:30 SQL&gt; select * from dept as of TIMESTAMP (SYSTIMESTAMP -<br />
INTERVAL '5' MINUTE);<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
02:31:39 SQL&gt; select * from dept as of TIMESTAMP (SYSTIMESTAMP -<br />
INTERVAL '6' MINUTE);<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
可以发现我们闪回查询了1 分钟到6 分钟之前的所有前镜像都没有找到新插入的那条<br />
DEPTNO＝60 的记录，虽然TIMESTAMP 可以精确到毫秒，但是很显然我们很难准确地<br />
定位到毫秒级的时间点。至于为什么如此，biti 在论坛上的某个帖子中有所探讨，这里暂时<br />
先不追究产生这种结果的原因。在这种情况下，使用基于SCN 的闪回查询是解决问题的最<br />
好办法。<br />
以往的一些测试例子，都是在insert 数据之后立刻使用DBMS_FLASHBACK 包中的<br />
GET_SYSTEM_CHANGE_NUMBER 函数来返回当时的SCN，然后再利用AS OF SCN 来进<br />
行闪回查询，但是实际应用中这是不可能的，因为在误操作之前不会运行这个函数。所以我<br />
们要使用LOGMINER 来对redolog 进行分析，得到当时错误地update 或者delete 数据时的<br />
SCN。<br />
对于LOGMINER 的安装和使用方法本文不进行详细的叙述，请自行查阅文档。<br />
下面是结合LOGMINER 进行闪回查询的例子，为了描述简便，假设从删除数据到目前<br />
ONLINE REDO LOG 没有进行LOG SWITCH，也就是我们只需要分析当前ACTIVE 的<br />
ONLINE REDO LOG 就可以了。<br />
SQL&gt; connect / as sysdba<br />
Connected.<br />
SQL&gt; select b.MEMBER,a.STATUS from v$log a,v$logfile b where a.GROUP#=b.GROUP#;<br />
MEMBER STATUS<br />
-------------------------------------------- ----------------<br />
/oracle/oradata/oralinux/redo01.log INACTIVE<br />
/oracle/oradata/oralinux/redo02.log INACTIVE<br />
/oracle/oradata/oralinux/redo03.log CURRENT<br />
SQL&gt; EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LogFileName =&gt;<br />
'/oracle/oradata/oralinux/redo03.log',Options =&gt; DBMS_LOGMNR.NEW);<br />
PL/SQL procedure successfully completed.<br />
SQL&gt; EXECUTE DBMS_LOGMNR.START_LOGMNR(DictFileName =&gt;<br />
'/oracle/admin/oralinux/orcldict.ora');<br />
PL/SQL procedure successfully completed.<br />
SQL&gt; select scn,sql_redo from (select * from v$logmnr_contents where<br />
sql_redo like 'delete%' order by scn desc) where rownum&lt;2;<br />
SCN SQL_REDO<br />
---------- -------------------------------------------------------------------<br />
543523 delete from "SCOTT"."DEPT" where "DEPTNO" = '60' and "D<br />
现在我们已经找到了删除那条记录时候的SCN 是543523。<br />
SQL&gt; select * from scott.dept as of scn 543523;<br />
DEPTNO DNAME LOC<br />
---------- -------------- -------------<br />
10 ACCOUNTING NEW YORK<br />
20 RESEARCH DALLAS<br />
30 SALES CHICAGO<br />
40 OPERATIONS BOSTON<br />
60 FLASH BEIJING<br />
搞定！我们利用SCN 进行闪回查询找到了删除前的那条数据，此时利用上文描述过的SQL<br />
方法或者DBMS_FLASHBACK 方法都可以进行数据恢复了。<br />
几个注意点：<br />
1． Flashback Query 对于DDL 操作（比如DROP）无效，只能适用于DML 的误操作<br />
（UPDATE，DELETE）<br />
2． SYS 用户不允许执行DBMS_FLASHBACK 包，将会产生ORA-08185 错误，<br />
Flashback not supported for user SYS<br />
3．可能需要给其它用户授权才能允许其它用户执行DBMS_FLASHBACK 包，需要执<br />
行：GRANT EXECUTE ON DBMS_FLASHBACK TO SCOTT;<br />
4．闪回查询的功能不止是适用于数据恢复，同样适用于DSS 和OLAP，比如需要查询<br />
在前一个小时内生成的新订单，那么就可以利用AS OF 来取得两个时间点的查询结<br />
果的差集。<br />
5．如果结合使用LOGON TRIGGERS，那么可以实现不更改代码就支持各个时间点的<br />
报表查询功能。<br />
6． Flashback Query 的查询速度依赖于需要执行多少UNDO，也就是想查询多长时间以<br />
前的数据库快照，回溯的时间越久可能执行的速度就越慢。<br />
7． Flashback Query 不会真正的UNDO 任何数据，仅仅是一个查询的机制而已。<br />
8． Flashback Query 不会告诉你到底数据发生了哪些变化，这是LOGMINER 的功能。<br />
9．如果需要恢复的表中有巨大的数据量，那么闪回查询会是一个极为昂贵的操作，此<br />
时可能作基于时间点的恢复反而更有效。
 <img src ="http://www.blogjava.net/wuynng/aggbug/170184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2007-12-24 23:40 <a href="http://www.blogjava.net/wuynng/articles/170184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle忘记用户名和密码怎样恢复</title><link>http://www.blogjava.net/wuynng/articles/167999.html</link><dc:creator>wuyanhong</dc:creator><author>wuyanhong</author><pubDate>Sat, 15 Dec 2007 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/wuynng/articles/167999.html</guid><wfw:comment>http://www.blogjava.net/wuynng/comments/167999.html</wfw:comment><comments>http://www.blogjava.net/wuynng/articles/167999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuynng/comments/commentRss/167999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuynng/services/trackbacks/167999.html</trackback:ping><description><![CDATA[su - oracle <br />
sqlplus /nolog<br />
conn / as sysdba<br />
startup (如果数据库不是处于启动状态则启动)<br />
alter user sys identified by pw123<br />
然后就可以使用sys用户密码登陆了
  <img src ="http://www.blogjava.net/wuynng/aggbug/167999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuynng/" target="_blank">wuyanhong</a> 2007-12-15 20:48 <a href="http://www.blogjava.net/wuynng/articles/167999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>