Oracle 基於 RMAN 的不完全恢復(incomplete recovery by RMAN)

us_yunleiwang發表於2013-12-05

 Oracle 資料庫可以實現資料庫不完全恢復與完全恢復。完全恢復是將資料庫恢復到最新時刻,也就是無損恢復,保證資料庫無丟失的恢復。而不完全恢復則是根據需要特意將資料庫恢復到某個過去的特定時間點或特定的SCN以及特定的Sequence。我們可以透過基於使用者管理的不完全恢復實現,也可以透過基於RMAN方式來實現。本文主要描述是基於RMAN的不完全恢復的幾種情形並給出示例。有關資料庫備份恢復,RMAN備份恢復的概念與實戰可以參考文章尾部給出的連結。

 

一、不完全恢復的步驟
    a、關閉資料庫並備份資料庫(以防止恢復失敗)
    b、啟動資料庫到mount 狀態
    c、還原資料庫
    d、將資料庫恢復至某個時間點、序列、或系統改變號
    e、使用RESETLOGS關鍵字開啟資料庫

 

二、不完全恢復的幾種型別
  Type of Recovery        Function 
  -------------------     ----------------------------
  Time-based recovery     Recovers the data up to a specified point in time. 
  Cancel-based recovery   Recovers until you issue the CANCEL statement (not available when using Recovery Manager). 
  Change-based recovery   Recovers until the specified SCN. 
  Log sequence recovery   Recovers until the specified log sequence number (only available when using Recovery Manager). 
  
三、RMAN不完全恢復的主要操作命令

  1. a、基於TIME 引數不完全恢復  
  2. run {   
  3.       shutdown immediate;  
  4.       startup mount;  
  5.       set until time "to_date('20130705 10:09:53','yyyymmdd hh24:mi:ss')";  
  6.       restore database;  
  7.       recover database;  
  8.       alter database open resetlogs;  
  9. }  
  10.   
  11. b、基於SCN 引數不完全恢復  
  12. run {   
  13.       shutdown immediate;  
  14.       startup mount;  
  15.       set until scn 3400;   
  16.       restore database;  
  17.       recover database;  
  18.       alter database open resetlogs;  
  19. }  
  20.   
  21. c、基於SEQUENCE 引數不完全恢復:  
  22. run {   
  23.       shutdown immediate;  
  24.       startup mount;  
  25.       set until sequence 12903;  
  26.       restore database;  
  27.       recover database;  
  28.       alter database open resetlogs;  
  29. }  

四、演示RMAN不完全恢復

  1. 1、準備環境  
  2. ---&gt首先備份資料庫  
  3. [oracle@node1 ~]$ export ORACLE_SID=oradb  
  4. [oracle@node1 ~]$ more rman_full.rcv   
  5. run{  
  6. allocate channel ch1 device type disk;  
  7. allocate channel ch2 device type disk;  
  8. crosscheck archivelog all;  
  9. delete noprompt expired archivelog all;  
  10. backup database format '/u02/rman/full_%d_%U' tag=full_bak  
  11. plus archivelog format '/u02/rman/arch_%d_%U' tag=arch;  
  12. release channel ch1;  
  13. release channel ch2;  
  14. }  
  15. [oracle@node1 ~]$ rman target / cmdfile=/home/oracle/rman_full.rcv log=/home/oracle/rman_full.log  
  16. RMAN> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11>  
  17. --下面是產生的備份檔案  
  18. [oracle@node1 ~]$ ls -hltr /u02/rman  
  19. total 1.1G  
  20. -rw-r----- 1 oracle asmadmin  31M Jul  5 09:44 arch_ORADB_03odvgv2_1_1  
  21. -rw-r----- 1 oracle asmadmin 595M Jul  5 09:45 full_ORADB_04odvgv7_1_1  
  22. -rw-r----- 1 oracle asmadmin 490M Jul  5 09:45 full_ORADB_05odvgv7_1_1  
  23. -rw-r----- 1 oracle asmadmin  12K Jul  5 09:46 arch_ORADB_06odvh30_1_1     
  24.   
  25. --演示環境  
  26. SQL> select * from v$version where rownum<2;  
  27.   
  28. BANNER  
  29. --------------------------------------------------------------------------------  
  30. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production  
  31.   
  32. SQL> conn scott/tiger;  
  33. Connected.  
  34.   
  35. --&gt下面的查詢得到當前已產生的歸檔日誌  
  36. SQL> SELECT name,sequence# seq#,status,completion_time FROM v$archived_log;  
  37.   
  38. NAME                                                       SEQ# S COMPLETION_TIME  
  39. ---------------------------------------------------------- ---- - -----------------  
  40. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_26_8xd97058_.arc       26 A 20130705 09:44:01  
  41. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_27_8xd9c0f0_.arc       27 A 20130705 09:46:08  
  42. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc       28 A 20130705 10:03:36  
  43.   
  44. --&gt建立測試用表並插入記錄  
  45. 10:07:01 SQL> create table t2(id varchar2(10), dt varchar2(20));  
  46.   
  47. 10:07:57 SQL> insert into t2 select 'Robinson',to_char(sysdate,'yyyymmdd hh24:mi:ss'from dual;  
  48.   
  49. 10:08:15 SQL> commit;  
  50.   
  51. 10:08:18 SQL> alter system archive log current;  --&gt對當前日誌進行歸檔  
  52.   
  53. --&gt下面的查詢可知產生新的歸檔日誌29  
  54. 10:08:28 SQL> SELECT name,sequence# seq#,status,completion_time FROM v$archived_log where sequence#>=28;  
  55.   
  56. NAME                                                         SEQ# S COMPLETION_TIME  
  57. ------------------------------------------------------------ ---- - -----------------  
  58. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc         28 A 20130705 10:03:36  
  59. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc         29 A 20130705 10:08:23  
  60.   
  61. --&gt應證歸檔日誌中包含記錄Robinson  
  62. 10:09:53 SQL> ho strings /u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc | grep "Robinson"  
  63. Robinson  
  64.   
  65. ---&gt第二次插入記錄  
  66. 10:10:48 SQL> insert into t2 select 'Jackson',to_char(sysdate,'yyyymmdd hh24:mi:ss'from dual;  
  67.   
  68. 10:11:27 SQL> commit;  
  69.   
  70. 10:11:30 SQL> alter system archive log current;  
  71.   
  72. 10:11:47 SQL> SELECT name,sequence# seq#,status,completion_time FROM v$archived_log where sequence#>=28;  
  73.   
  74. NAME                                                       SEQ# S COMPLETION_TIME  
  75. ---------------------------------------------------------- ---- - -----------------  
  76. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc       28 A 20130705 10:03:36  
  77. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc       29 A 20130705 10:08:23  
  78. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc       30 A 20130705 10:11:47  
  79.   
  80. 10:12:17 SQL> ho strings /u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc | grep "Jackson"  
  81. Jackson  
  82.   
  83. --&gt檢視當前資料庫的SCN  
  84. 10:12:34 SQL> select name,current_scn from v$database;  
  85.   
  86. NAME                           CURRENT_SCN  
  87. ------------------------------ -----------  
  88. ORADB                              1365679  
  89.   
  90. ---&gt第三次插入記錄  
  91. 10:15:07 SQL> insert into t2 select 'Winson',to_char(sysdate,'yyyymmdd hh24:mi:ss'from dual;  
  92.   
  93. 10:15:47 SQL> commit;  
  94.   
  95. 10:21:18 SQL> alter system switch logfile;        
  96.   
  97. ---&gt第四次插入記錄  
  98. 10:22:53 SQL> insert into t2 select 'LastRecord',to_char(sysdate,'yyyymmdd hh24:mi:ss'from dual;  
  99.   
  100. 10:23:44 SQL> commit;  
  101.   
  102. 10:23:47 SQL> select * from t2;  
  103.   
  104. ID         DT  
  105. ---------- --------------------  
  106. Robinson   20130705 10:08:15  
  107. Jackson    20130705 10:11:27  
  108. Winson     20130705 10:15:47  
  109. LastRecord 20130705 10:23:44  
  110.   
  111. 10:23:52 SQL> alter system switch logfile;  
  112.   
  113. --&gt下面是最終的歸檔日誌情況  
  114. 10:24:00 SQL> SELECT name,sequence# seq#,status,completion_time FROM v$archived_log where sequence#>=28;  
  115.   
  116. NAME                                                         SEQ# S COMPLETION_TIME  
  117. ------------------------------------------------------------ ---- - -----------------  
  118. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc         28 A 20130705 10:03:36  
  119. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc         29 A 20130705 10:08:23  
  120. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc         30 A 20130705 10:11:47  
  121. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_31_8xdcg1wc_.arc         31 A 20130705 10:21:53  
  122. /u02/DB/oradb/arch/2013_07_05/o1_mf_1_32_8xdcl0rx_.arc         32 A 20130705 10:24:00  
  123.   
  124. 10:24:12 SQL> ho strings /u02/DB/oradb/arch/2013_07_05/o1_mf_1_31_8xdcg1wc_.arc | grep "Winson"  
  125. Winson  
  126.   
  127. ---&gt最後一次插入記錄  
  128. 10:25:16 SQL> insert into t2 select 'Completed',to_char(sysdate,'yyyymmdd hh24:mi:ss'from dual;  
  129.   
  130. 10:26:20 SQL> commit;  
  131.   
  132. --&gt此時資料庫當前的redo log並沒有歸檔,因此插入的資料位於聯機日誌  
  133. 10:27:40 SQL> ho strings /u02/DB/oradb/redo/redo03.log | grep "Completed"  
  134.         Completed  
  135.   
  136. ---&gt下面列出完成的記錄與日誌對照關係  
  137. SQL> select * from t2;  
  138.   
  139. ID         DT                    對應的歸檔日誌            對應的sequence  
  140. ---------- --------------------  ------------------------  --------------  
  141. Robinson   20130705 10:08:15     o1_mf_1_29_8xdbnqx9_.arc              29  
  142. Jackson    20130705 10:11:27     o1_mf_1_30_8xdbv338_.arc              30  
  143. Winson     20130705 10:15:47     o1_mf_1_31_8xdcg1wc_.arc              31  
  144. LastRecord 20130705 10:23:44     o1_mf_1_32_8xdcl0rx_.arc              32  
  145. Completed  20130705 10:26:20     redo03.log  
  146.   
  147. 2、實施不完全恢復  
  148. a、基於時間點的不完全恢復  
  149. [oracle@node1 ~]$ rman target /  
  150.   
  151. Recovery Manager: Release 11.2.0.1.0 - Production on Fri Jul 5 10:28:53 2013  
  152.   
  153. Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.  
  154.   
  155. connected to target database: ORADB (DBID=2557712192)  
  156.   
  157. RMAN> run{  
  158. 2> shutdown immediate;  
  159. 3> startup mount;  
  160. 4> set until time "to_date('20130705 10:09:53','yyyymmdd hh24:mi:ss')";  
  161. 5> restore database;  
  162. 6> recover database;  
  163. 7> }  
  164.   
  165. using target database control file instead of recovery catalog  
  166. database closed  
  167. database dismounted  
  168. Oracle instance shut down  
  169.   
  170. connected to target database (not started)  
  171. Oracle instance started  
  172. database mounted  
  173.   
  174. Total System Global Area     263639040 bytes  
  175.   
  176. executing command: SET until clause  
  177.   
  178. Starting restore at 20130705 10:33:36  
  179. allocated channel: ORA_DISK_1  
  180. channel ORA_DISK_1: SID=24 device type=DISK  
  181.   
  182. channel ORA_DISK_1: starting datafile backup set restore      ----&gt啟動資料檔案還原  
  183. channel ORA_DISK_1: specifying datafile(s) to restore from backup set  
  184. channel ORA_DISK_1: restoring datafile 00001 to /u02/DB/oradb/oradata/system01.dbf  
  185. channel ORA_DISK_1: restoring datafile 00003 to /u02/DB/oradb/oradata/undotbs01.dbf  
  186. channel ORA_DISK_1: reading from backup piece /u02/rman/full_ORADB_04odvgv7_1_1  
  187. channel ORA_DISK_1: piece handle=/u02/rman/full_ORADB_04odvgv7_1_1 tag=FULL_BAK  
  188. channel ORA_DISK_1: restored backup piece 1  
  189. channel ORA_DISK_1: restore complete, elapsed time: 00:01:05  
  190. channel ORA_DISK_1: starting datafile backup set restore  
  191. channel ORA_DISK_1: specifying datafile(s) to restore from backup set  
  192. channel ORA_DISK_1: restoring datafile 00002 to /u02/DB/oradb/oradata/sysaux01.dbf  
  193. channel ORA_DISK_1: restoring datafile 00004 to /u02/DB/oradb/oradata/users01.dbf  
  194. channel ORA_DISK_1: restoring datafile 00005 to /u02/DB/oradb/oradata/example01.dbf  
  195. channel ORA_DISK_1: reading from backup piece /u02/rman/full_ORADB_05odvgv7_1_1  
  196. channel ORA_DISK_1: piece handle=/u02/rman/full_ORADB_05odvgv7_1_1 tag=FULL_BAK  
  197. channel ORA_DISK_1: restored backup piece 1  
  198. channel ORA_DISK_1: restore complete, elapsed time: 00:00:45     ---&gt完成資料檔案還原  
  199. Finished restore at 20130705 10:35:28  
  200.   
  201. Starting recover at 20130705 10:35:29   ---&gt啟動資料恢復  
  202. using channel ORA_DISK_1  
  203.   
  204. starting media recovery  
  205. ----&gt下面提示歸檔日誌已經存在,是由於我們備份歸檔日誌後並沒有對其清除              
  206. archived log for thread 1 with sequence 27 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_27_8xd9c0f0_.arc  
  207. archived log for thread 1 with sequence 28 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc  
  208. archived log for thread 1 with sequence 29 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc  
  209. archived log for thread 1 with sequence 30 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc  
  210. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_27_8xd9c0f0_.arc thread=1 sequence=27 ---&gt列出日誌對應的sequence  
  211. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc thread=1 sequence=28  
  212. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc thread=1 sequence=29  
  213. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc thread=1 sequence=30  
  214. media recovery complete, elapsed time: 00:00:09   ---&gt介質恢復完成,可以看到介質恢復,日誌apply到了30(不包含sequence 30的內容)  
  215. Finished recover at 20130705 10:35:42             ---&gt完成恢復  
  216.   
  217. RMAN> alter database open resetlogs;              ---&gt手動open resetlogs  
  218.   
  219. database opened  
  220.   
  221. RMAN> host;         
  222.   
  223. [oracle@node1 ~]$ more query_t2.sh  
  224. #!/bin/bash  
  225. if [ -f ~/.bashrc ]; then     
  226.         . ~/.bashrc     
  227. fi     
  228.   
  229. export ORACLE_SID=oradb  
  230. sqlplus -S /nolog <
  231. connect scott/tiger  
  232. select * from scott.t2;  
  233. exit;  
  234. EOF  
  235. exit  
  236.   
  237. --&gt驗證結果,記錄Robinson已經被恢復  
  238. [oracle@node1 ~]$ ./query_t2.sh   
  239.   
  240. ID         DT  
  241. ---------- --------------------  
  242. Robinson   20130705 10:08:15  
  243.   
  244. [oracle@node1 ~]$ exit  
  245. exit  
  246. host command complete  
  247.   
  248. --&gt新的incarnation已經被產生,為3  
  249. RMAN> list incarnation;  
  250.   
  251. List of Database Incarnations  
  252. DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time  
  253. ------- ------- -------- ---------------- --- ---------- ----------  
  254. 1       1       ORADB    2557712192       PARENT  1          20090813 23:00:48  
  255. 2       2       ORADB    2557712192       PARENT  754488     20130111 17:37:07  
  256. 3       3       ORADB    2557712192       CURRENT 1365530    20130705 10:37:15  
  257.   
  258. b、基於SCN的不完全恢復  
  259. RMAN> shutdown immediate;  
  260. RMAN> startup mount;  
  261. RMAN> reset database to incarnation 2;   ---&gt在此需要reset incarnation  
  262. database reset to incarnation 2  
  263.   
  264. RMAN> run{  
  265. 2> set until scn 1365679;  
  266. 3> restore database;  
  267. 4> recover database;  
  268. 5> alter database open resetlogs;}  
  269.   
  270. executing command: SET until clause  
  271.   
  272. Starting restore at 20130705 11:01:14  
  273. allocated channel: ORA_DISK_1  
  274. channel ORA_DISK_1: SID=25 device type=DISK  
  275.   
  276. channel ORA_DISK_1: starting datafile backup set restore  
  277.            ......................  
  278. channel ORA_DISK_1: restored backup piece 1  
  279. channel ORA_DISK_1: restore complete, elapsed time: 00:00:55  
  280. Finished restore at 20130705 11:03:05  
  281.   
  282. Starting recover at 20130705 11:03:06  
  283. using channel ORA_DISK_1  
  284.   
  285. starting media recovery  
  286.   
  287. archived log for thread 1 with sequence 27 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_27_8xd9c0f0_.arc  
  288.                  .............................  
  289. archived log for thread 1 with sequence 31 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_31_8xdcg1wc_.arc  
  290. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_27_8xd9c0f0_.arc thread=1 sequence=27  
  291. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc thread=1 sequence=28  
  292. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc thread=1 sequence=29  
  293. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc thread=1 sequence=30  ---&gt該日誌包含記錄Jackson   
  294. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_31_8xdcg1wc_.arc thread=1 sequence=31    
  295. media recovery complete, elapsed time: 00:00:10                               ---&gt此時apply到了31(不包含sequence 31的內容)  
  296. Finished recover at 20130705 11:03:19  
  297.   
  298. database opened  
  299.   
  300. RMAN> host;  
  301.   
  302. --&gt驗證結果,記錄Jackson已經被恢復  
  303. [oracle@node1 ~]$ ./query_t2.sh   
  304.   
  305. ID         DT  
  306. ---------- --------------------  
  307. Robinson   20130705 10:08:15  
  308. Jackson    20130705 10:11:27  
  309.   
  310. c、基於sequence的不完全恢復  
  311. RMAN> shutdown immediate;  
  312. RMAN> startup mount;  
  313. RMAN> reset database to incarnation 2;  
  314. RMAN> run{  
  315. 2> set until sequence 32;  
  316. 3> restore database;  
  317. 4> recover database;  
  318. 5> alter database open resetlogs;}  
  319.   
  320. -- Author : Robinson  
  321. -- Blog   : http://blog.csdn.net/robinson_0612  
  322.   
  323. executing command: SET until clause  
  324.   
  325. Starting restore at 05-JUL-13  
  326. allocated channel: ORA_DISK_1  
  327. channel ORA_DISK_1: SID=24 device type=DISK  
  328.               ...................  
  329. channel ORA_DISK_1: restore complete, elapsed time: 00:00:45  
  330. Finished restore at 05-JUL-13  
  331.   
  332. Starting recover at 05-JUL-13  
  333. using channel ORA_DISK_1  
  334.   
  335. starting media recovery  
  336.             ...................................  
  337. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc thread=1 sequence=30  
  338. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_31_8xdcg1wc_.arc thread=1 sequence=31 ---&gt此時也是apply到了31  
  339. media recovery complete, elapsed time: 00:00:07                ---&gt我們指定了sequence為32(但不包含sequence 32)  
  340. Finished recover at 05-JUL-13  
  341.   
  342. database opened  
  343.   
  344. RMAN> host;  
  345.   
  346. Recovery Manager complete.  
  347.   
  348. --&gt驗證結果,記錄Winson已經被恢復  
  349. [oracle@node1 ~]$ ./query_t2.sh   
  350.   
  351. ID         DT  
  352. ---------- --------------------  
  353. Robinson   20130705 10:08:15  
  354. Jackson    20130705 10:11:27  
  355. Winson     20130705 10:15:47  
  356.   
  357. d、恢復到最近時刻  
  358. --&gt此處的恢復到最近(新)時刻,也就是我們希望恢復最後的記錄"Completed"  
  359. --&gt通常情況下,我們恢復到故障點為完全恢復,此時也可以說是做完全恢復  
  360. --&gt但是由於我們對資料庫作了不完全恢復,因此此時即使是做完全恢復,仍然為不完全恢復,見下面的示例  
  361. RMAN> shutdown immediate;  
  362. RMAN> startup mount;  
  363. RMAN> reset database to incarnation 2;  
  364. RMAN> run{  
  365. 2> restore database;  
  366. 3> recover database;  
  367. 4> alter database open;}  
  368.   
  369. Starting restore at 05-JUL-13  
  370. allocated channel: ORA_DISK_1  
  371. channel ORA_DISK_1: SID=24 device type=DISK  
  372.              ...........................  
  373. channel ORA_DISK_1: restore complete, elapsed time: 00:00:45  
  374. Finished restore at 05-JUL-13  
  375.   
  376. Starting recover at 05-JUL-13  
  377. using channel ORA_DISK_1  
  378.   
  379. starting media recovery  
  380.   
  381. archived log for thread 1 with sequence 27 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_27_8xd9c0f0_.arc  
  382.                             ......................  
  383. archived log for thread 1 with sequence 33 is already on disk as file /u02/DB/oradb/arch/2013_07_05/o1_mf_1_33_8xddbvsc_.arc  
  384. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_27_8xd9c0f0_.arc thread=1 sequence=27  
  385. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_28_8xdbcrht_.arc thread=1 sequence=28  
  386. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc thread=1 sequence=29  
  387. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc thread=1 sequence=30  
  388. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_31_8xdcg1wc_.arc thread=1 sequence=31  
  389. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_32_8xdcl0rx_.arc thread=1 sequence=32  
  390. archived log file name=/u02/DB/oradb/arch/2013_07_05/o1_mf_1_33_8xddbvsc_.arc thread=1 sequence=33  
  391. unable to find archived log  
  392. archived log thread=1 sequence=34  
  393. RMAN-00571: ===========================================================  
  394. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============  
  395. RMAN-00571: ===========================================================  
  396. RMAN-03002: failure of recover command at 07/05/2013 11:27:48  
  397. RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 34 and starting SCN of 1367222  
  398.   
  399. --可以看到,資料庫被apply到了sequence為33的歸檔日誌,現在資料庫尋找sequence為34為SCN為1367222的歸檔日誌  
  400. --細心的朋友可能會發現,我們之前僅僅歸檔到32,那sequence為33的歸檔日誌從而而來呢,應該是系統自動產生了一次歸檔  
  401. --但這裡我的歸檔日誌大小為50MB,因此也不可能是由於redo log滿而產生歸檔  
  402.   
  403. --檢視alert日誌  
  404. [oracle@node1 trace]$ tail -1280 alert_oradb.log | more     
  405. Media Recovery Log /u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc  
  406. Fri Jul 05 10:35:41 2013  
  407. ORA-279 signalled during: alter database recover logfile '/u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc'...  
  408. alter database recover logfile '/u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc'  
  409. Media Recovery Log /u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc  
  410. Incomplete Recovery applied until change 1365529 time 07/05/2013 10:09:59  
  411. Media Recovery Complete (oradb)     ---&gt提示介質恢復完成  
  412. Completed: alter database recover logfile '/u02/DB/oradb/arch/2013_07_05/o1_mf_1_30_8xdbv338_.arc'  
  413. Fri Jul 05 10:37:15 2013  
  414. alter database open resetlogs      ---&gt執行open resetlogs       
  415. Archived Log entry 8 added for thread 1 sequence 33 ID 0x98733640 dest 1:   ---&gt這個地方是關鍵  
  416. RESETLOGS after incomplete recovery UNTIL CHANGE 1365529  
  417. Resetting resetlogs activation ID 2557687360 (0x98733640)    
  418. Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_ora_30772.trc:    
  419. ORA-00367: checksum error in log file header     ---&gt下面伴隨一堆重置日誌檔案前的ORA校驗錯誤  
  420. ORA-00322: log 1 of thread 1 is not current copy  
  421. ORA-00312: online log 1 thread 1: '/u02/DB/oradb/redo/redo01.log'  
  422. Fri Jul 05 10:37:18 2013  
  423. Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_m000_30963.trc:  
  424. ORA-00316: log 1 of thread 1, type 0 in header is not log file  
  425. ORA-00312: online log 1 thread 1: '/u02/DB/oradb/redo/redo01.log'  
  426. Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_ora_30772.trc:  
  427. ORA-00367: checksum error in log file header  
  428. ORA-00322: log 2 of thread 1 is not current copy  
  429. ORA-00312: online log 2 thread 1: '/u02/DB/oradb/redo/redo02.log'  
  430. Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_m000_30963.trc:  
  431. ORA-00316: log 2 of thread 1, type 0 in header is not log file  
  432. ORA-00312: online log 2 thread 1: '/u02/DB/oradb/redo/redo02.log'  
  433. Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_ora_30772.trc:  
  434. ORA-00367: checksum error in log file header  
  435. ORA-00322: log 3 of thread 1 is not current copy  
  436. ORA-00312: online log 3 thread 1: '/u02/DB/oradb/redo/redo03.log'  
  437. Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_m000_30963.trc:  
  438. ORA-00316: log 3 of thread 1, type 0 in header is not log file  
  439. ORA-00312: online log 3 thread 1: '/u02/DB/oradb/redo/redo03.log'  
  440. Fri Jul 05 10:37:23 2013  
  441. Setting recovery target incarnation to 3          ---&gt設定新的incarnation  
  442.   
  443. --&gt下面的歸檔日誌的產生時間與alert日誌中的時間相吻合  
  444. [oracle@node1 2013_07_05]$ ls -al --full-time o1_mf_1_33_8xddbvsc_.arc  
  445. -rw-r----- 1 oracle asmadmin 259584 2013-07-05 10:37:15.000000000 +0800 o1_mf_1_33_8xddbvsc_.arc  
  446.   
  447. --&gt查詢檢視也可以得到在RESETLOGS時產生了歸檔日誌  
  448. SQL> col name format a60 wrap  
  449. SQL> SELECT name,sequence# seq#,status,completion_time,end_of_redo_type eof_type from v$archived_log where sequence#=33;  
  450.   
  451. NAME                                                               SEQ# S COMPLETION_TIME   EOF_TYPE  
  452. ------------------------------------------------------------ ---------- - ----------------- ----------  
  453. /u02/database/oradb/flash_recovery_area/ORADB/archivelog/201         33 A 20130705 10:37:15 RESETLOGS  
  454. 3_07_05/o1_mf_1_33_8xddbvsc_.arc  
  455.   
  456. --&gt驗證結果  
  457. SQL> alter database open resetlogs;  
  458.   
  459. Database altered.  
  460.   
  461. SQL> select * from scott.t2;  
  462.   
  463. ID         DT  
  464. ---------- --------------------  
  465. Robinson   20130705 10:08:15  
  466. Jackson    20130705 10:11:27  
  467. Winson     20130705 10:15:47  
  468. LastRecord 20130705 10:23:44  
  469. Completed  20130705 10:26:20  

五、小結
a、RMAN支援基於TIME,SCN,SEQUENCE引數的不完全恢復,不支援基於CANCEL的不完全恢復
b、所有實施了不完全恢復的資料庫都需要以open resetlogs方式開啟資料庫,且同時伴隨一個新的incarnation產生
c、不完全恢復之後即使是恢復到故障點,或者說想做完全恢復,都只能是做不完全恢復到最近時刻
d、不完全恢復後再次恢復到最新時刻,新的incarnation變為CURRENT狀態,中間的incarnation為ORPHAN狀態
e、首次不完全恢復以open resetlogs方式開啟資料庫時,未歸檔的聯機日誌被歸檔
f、注意until子句的用法。until子句是到什麼什麼,不包括,是一個非半閉包的形式
g、生產環境建議不完全恢復前後備份資料庫

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-1062396/,如需轉載,請註明出處,否則將追究法律責任。

相關文章