10g之前,如果采用了resetlogs打開資料庫, 必須進行全備份,因為以前的歸檔日志對于以後
恢複将不在起作用。即ORACLE不能跨越incarnation恢複。因為scn和日志序列号都被重置。10g
之後。ORACLE可以跨越incarnation恢複,(很多高手還是建議resetlogs之後全備).測試過程如下:
SQL> create table mytest as select * from dba_objects where rownum>11
2 /
表已建立。
SQL> alter system checkpoint
系統已更改。
然後執行全備:
RMAN> backup database;
啟動 backup 于 04-7月 -10
....省略
完成 backup 于 04-7月 -10
SQL> alter system switch logfile
SQL> select recid,sequence#,first_change#,next_change# from v$archived_log
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
1 30 511526 522464
2 30 511526 522464
3 31 522464 522646
4 31 522464 522646
再插入10條記錄
SQL> insert into mytest select * from mytest;
已建立10行。
SQL> commit
送出完成。
4 31 522464 522646
5 32 522646 523748
6 32 522646 523748
已選擇6行。
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area 603979776 bytes
Fixed Size 1250380 bytes
Variable Size 167775156 bytes
Database Buffers 427819008 bytes
Redo Buffers 7135232 bytes
資料庫裝載完畢。
RMAN> restore database;
RMAN> list incarnation;
資料庫原型清單
DB 關鍵字 Inc 關鍵字 DB 名 DB ID STATUS 重置 SCN 重置時間
------- ------- -------- ---------------- --- ---------- ----------
1 1 ANRAN 885607663 CURRENT 1 04-7月 -10
恢複到sequence 32:
RMAN> recover database until sequence 32 ;
啟動 recover 于 04-7月 -10
使用通道 ORA_DISK_1
正在開始媒體的恢複
存檔日志線程 1 序列 31 已作為檔案 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00031_07234
68783.001 存在于磁盤上
存檔日志檔案名 =D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00031_0723468783.001 線程 =1
序列 =31
媒體恢複完成, 用時: 00:00:04
完成 recover 于 04-7月 -10
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(1) from mytest
COUNT(1)
----------
10
恢複完成。
添加10行資料:
6 32 522646 523748
7 33 523748 523871
8 33 523748 523871
9 1 522647 524058
10 1 522647 524058
11 2 524058 524165
12 2 524058 524165
13 3 524165 524611
14 3 524165 524611
用上一次的備份進行恢複:
RMAN> recover database ;
存檔日志線程 1 序列 1 已作為檔案 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00001_072347
3384.001 存在于磁盤上
存檔日志線程 1 序列 2 已作為檔案 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00002_072347
存檔日志線程 1 序列 3 已作為檔案 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00003_072347
存檔日志檔案名 =D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00001_0723473384.001 線程 =1
序列 =1
媒體恢複完成, 用時: 00:00:08
從恢複代碼上可以看到恢複跳過了32,33兩個歸檔檔案,從v$archived_log中也可能看到31與1的SCN是連續的,即新的SCN是應用日志到的最後一條日志SCN+1。
SQL> alter database open
20
完成完全恢複。
仍然用原來的備份我們還可以不完全恢複到sequence 1.
RMAN> recover database until sequence 1
注意的是這裡的1目前incarnation的sequence。是以sequence 不要超過incarnation中的sequence最大值
RMAN> recover database until sequence 6;
報Rman-06054:媒體恢複正請求未知的日志
(不知道怎麼回事,從CMD上拷不下這段輸出,現在也沒整明白)
1 1 ANRAN 885607663 PARENT 1 04-7月 -10
2 2 ANRAN 885607663 CURRENT 522647 04-7月 -10
可以看到目前資料庫存在兩個incarnation。 [incarnation的資訊存在控制檔案中,重建控制檔案之後,incarnation會恢複到1]。
如果這時仍然還想恢複到第一個incarnation的sequence 32.
要首先執行
RMAN> reset database to incarnation 1;
RMAN> recover database until sequence 32.
以後的操作都是一樣的,這裡就不示範了。
實驗過程中,10.2.0.1有時會報 ORA-600 [krhpfh_03-1209] 錯誤,這是ORACLE的BUG[Bug 5701695].
ORA-600 [KCVSOR_CURRENT_INC_RDFAIL] 錯誤,這也是ORACLE的BUG[Bug 5443660]
更新到10.2.0.4 就可以了,新功能總是不太穩定。
本文轉自 anranran 51CTO部落格,原文連結:http://blog.51cto.com/guojuanjun/343720