天天看點

Oracle 跨resetlogs的恢複

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