1. 程式人生 > >ARCHIVELOG模式下使用者管理的不完全恢復—基於SCN的不完全恢復

ARCHIVELOG模式下使用者管理的不完全恢復—基於SCN的不完全恢復

當用戶執行不完全恢復時,如果能夠確定恢復點所對應的SCN值,那麼可以使用這種方法恢復!

 

首先關閉資料庫執行一個冷全備份

[sql] view plain copy print ?
  1. SQL> conn /as sysdba  
  2. 已連線。  
  3. SQL> shutdown immediate  
  4. 資料庫已經關閉。  
  5. 已經解除安裝資料庫。  
  6. ORACLE 例程已經關閉。  
  7. SQL> ! cp /u01/app/oracle/oradata/orcl/*.dbf /u01/app/oracle/backup/  
SQL> conn /as sysdba
已連線。
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> ! cp /u01/app/oracle/oradata/orcl/*.dbf /u01/app/oracle/backup/


開啟資料庫,可以看見使用者u1的t表裡面是有資料的,然後截斷表

[sql] view plain copy print ?
  1. SQL> conn /as sysdba  
  2. 已連線到空閒例程。  
  3. SQL> startup  
  4. ORACLE 例程已經啟動。  
  5.   
  6. Total System Global Area  167772160 bytes  
  7. Fixed Size                  1266392 bytes  
  8. Variable Size              71306536 bytes  
  9. Database Buffers           92274688 bytes  
  10. Redo Buffers                2924544 bytes  
  11. 資料庫裝載完畢。  
  12. 資料庫已經開啟。  
  13. SQL> conn u1/u1  
  14. 已連線。  
  15. SQL> select * from t;  
  16.   
  17.         ID VALUE  
  18. ---------- ----------  
  19.          1 a  
  20.          2 b  
  21.          3 c  
  22.   
  23. SQL> truncate table t;  
  24.   
  25. 表被截斷。  
  26.   
  27. SQL> select * from t;  
  28.   
  29. 未選定行  
SQL> conn /as sysdba
已連線到空閒例程。
SQL> startup
ORACLE 例程已經啟動。

Total System Global Area  167772160 bytes
Fixed Size                  1266392 bytes
Variable Size              71306536 bytes
Database Buffers           92274688 bytes
Redo Buffers                2924544 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> conn u1/u1
已連線。
SQL> select * from t;

        ID VALUE
---------- ----------
         1 a
         2 b
         3 c

SQL> truncate table t;

表被截斷。

SQL> select * from t;

未選定行

 

現在使用者發現錯誤的刪除了t表的資料,要求恢復。在不完全恢復之前資料庫處於open狀態,必須先關閉資料庫,再mount,把備份的資料檔案複製過來

[sql] view plain copy print ?
  1. SQL> conn /as sysdba  
  2. 已連線。  
  3. SQL> shutdown immediate  
  4. 資料庫已經關閉。  
  5. 已經解除安裝資料庫。  
  6. ORACLE 例程已經關閉。  
  7. SQL> startup mount  
  8. ORACLE 例程已經啟動。  
  9.   
  10. Total System Global Area  167772160 bytes  
  11. Fixed Size                  1266392 bytes  
  12. Variable Size              71306536 bytes  
  13. Database Buffers           92274688 bytes  
  14. Redo Buffers                2924544 bytes  
  15. 資料庫裝載完畢。  
  16. SQL> ! rm -rf /u01/app/oracle/oradata/orcl/*.dbf  
  17.   
  18. SQL> ! mv /u01/app/oracle/backup/*.dbf /u01/app/oracle/oradata/orcl/  
SQL> conn /as sysdba
已連線。
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。

Total System Global Area  167772160 bytes
Fixed Size                  1266392 bytes
Variable Size              71306536 bytes
Database Buffers           92274688 bytes
Redo Buffers                2924544 bytes
資料庫裝載完畢。
SQL> ! rm -rf /u01/app/oracle/oradata/orcl/*.dbf

SQL> ! mv /u01/app/oracle/backup/*.dbf /u01/app/oracle/oradata/orcl/


檢視如下檢視,可以看見需要恢復的資料檔案,備份時間是“2011-10-09 02:12:08”,scn是“504040 ”。還可以看見控制檔案中scn號碼要比資料檔案中scn號碼新。

[sql] view plain copy print ?
  1. SQL> select file#,online_status,error,change#,to_char(time,'yyyy-mm-dd hh24:mi:ss'from v$recover_file;  
  2.   
  3.      FILE# ONLINE_ ERROR                                                                CHANGE# TO_CHAR(TIME,'YYYY-  
  4. ---------- ------- ----------------------------------------------------------------- ---------- -------------------  
  5.          1 ONLINE                                                                        504040 2011-10-09 04:07:52  
  6.          2 ONLINE                                                                        504040 2011-10-09 04:07:52  
  7.          3 ONLINE                                                                        504040 2011-10-09 04:07:52  
  8.          4 ONLINE                                                                        504040 2011-10-09 04:07:52  
  9.          5 ONLINE                                                                        504040 2011-10-09 04:07:52  
  10.          6 ONLINE                                                                        504040 2011-10-09 04:07:52  
  11.   
  12. 已選擇6行。  
  13.   
  14. SQL> select file#,checkpoint_change# from v$datafile;                --檢視控制檔案中的scn號碼  
  15.   
  16.      FILE# CHECKPOINT_CHANGE#  
  17. ---------- ------------------  
  18.          1             504428  
  19.          2             504428  
  20.          3             504428  
  21.          4             504428  
  22.          5             504428  
  23.          6             504428  
  24.   
  25. 已選擇6行。  
  26.   
  27. SQL> select file#,checkpoint_change# from v$datafile_header;          --檢視資料檔案中的scn號碼  
  28.   
  29.      FILE# CHECKPOINT_CHANGE#  
  30. ---------- ------------------  
  31.          1             504040  
  32.          2             504040  
  33.          3             504040  
  34.          4             504040  
  35.          5             504040  
  36.          6             504040  
  37.   
  38. 已選擇6行。  
SQL> select file#,online_status,error,change#,to_char(time,'yyyy-mm-dd hh24:mi:ss') from v$recover_file;

     FILE# ONLINE_ ERROR                                                                CHANGE# TO_CHAR(TIME,'YYYY-
---------- ------- ----------------------------------------------------------------- ---------- -------------------
         1 ONLINE                                                                        504040 2011-10-09 04:07:52
         2 ONLINE                                                                        504040 2011-10-09 04:07:52
         3 ONLINE                                                                        504040 2011-10-09 04:07:52
         4 ONLINE                                                                        504040 2011-10-09 04:07:52
         5 ONLINE                                                                        504040 2011-10-09 04:07:52
         6 ONLINE                                                                        504040 2011-10-09 04:07:52

已選擇6行。

SQL> select file#,checkpoint_change# from v$datafile;                --檢視控制檔案中的scn號碼

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1             504428
         2             504428
         3             504428
         4             504428
         5             504428
         6             504428

已選擇6行。

SQL> select file#,checkpoint_change# from v$datafile_header;          --檢視資料檔案中的scn號碼

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1             504040
         2             504040
         3             504040
         4             504040
         5             504040
         6             504040

已選擇6行。


恢復,由於備份的時候scn是504040,這裡就是採用這個值來恢復。

[sql] view plain copy print ?
  1. SQL> recover database until change 504040;  
  2. 完成介質恢復。  
  3. SQL> alter database open;  
  4. alter database open  
  5. *  
  6. 第 1 行出現錯誤:  
  7. ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項  
  8.   
  9.   
  10. SQL> alter database  open resetlogs;  
  11.   
  12. 資料庫已更改。  
  13.   
  14. SQL> conn u1/u1  
  15. 已連線。  
  16. SQL> select * from t;  
  17.   
  18.         ID VALUE  
  19. ---------- ----------  
  20.          1 a  
  21.          2 b  
  22.          3 c