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

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

基於時間點的恢復主要使用於以下情況:誤刪除表、誤截斷表、提交了錯誤的資料。(從oracle 10g利用閃回更easy!)

 

首先關閉資料庫執行一個冷全備份(冷備份的時候使用者u1的t表中是有3條記錄的。)

[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             117443880 bytes  
  9. Database Buffers           46137344 bytes  
  10. Redo Buffers                2924544 bytes  
  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  
  23.   
  24. SQL> truncate table t;  
  25.   
  26. 表被截斷。  
  27.   
  28. SQL> select * from t;  
  29.   
  30. 未選定行  
SQL> conn /as sysdba
已連線到空閒例程。
SQL> startup
ORACLE 例程已經啟動。

Total System Global Area  167772160 bytes
Fixed Size                  1266392 bytes
Variable Size             117443880 bytes
Database Buffers           46137344 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              62917928 bytes  
  13. Database Buffers          100663296 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              62917928 bytes
Database Buffers          100663296 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是“500441 ”。還可以看見控制檔案中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                                                                        500441 2011-10-09 02:12:08  
  6.          2 ONLINE                                                                        500441 2011-10-09 02:12:08  
  7.          3 ONLINE                                                                        500441 2011-10-09 02:12:08  
  8.          4 ONLINE                                                                        500441 2011-10-09 02:12:08  
  9.          5 ONLINE                                                                        500441 2011-10-09 02:12:08  
  10.          6 ONLINE                                                                        500441 2011-10-09 02:12:08  
  11.   
  12. 已選擇6行。  
  13.   
  14. SQL> select file#,checkpoint_change# from v$datafile;             --檢視控制檔案中的scn號碼  
  15.   
  16.      FILE# CHECKPOINT_CHANGE#  
  17. ---------- ------------------  
  18.          1             500814  
  19.          2             500814  
  20.          3             500814  
  21.          4             500814  
  22.          5             500814  
  23.          6             500814  
  24.   
  25. 已選擇6行。  
  26.   
  27. SQL> select file#,checkpoint_change# from v$datafile_header;     --檢視資料檔案中的scn號碼  
  28.   
  29.      FILE# CHECKPOINT_CHANGE#  
  30. ---------- ------------------  
  31.          1             500441  
  32.          2             500441  
  33.          3             500441  
  34.          4             500441  
  35.          5             500441  
  36.          6             500441  
  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                                                                        500441 2011-10-09 02:12:08
         2 ONLINE                                                                        500441 2011-10-09 02:12:08
         3 ONLINE                                                                        500441 2011-10-09 02:12:08
         4 ONLINE                                                                        500441 2011-10-09 02:12:08
         5 ONLINE                                                                        500441 2011-10-09 02:12:08
         6 ONLINE                                                                        500441 2011-10-09 02:12:08

已選擇6行。

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

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

已選擇6行。

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

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

已選擇6行。

 

恢復,由於備份的時間是“2011-10-09 02:12:08”,恢復時間我選在“2011-10-09 02:12:01”,提前了7秒。在實際生產環境中可以大致評估誤操作的時間,多基於幾個時間點來恢復多次,找到最合適的資料。

[sql] view plain copy print ?
  1. SQL> recover database until time '2011-10-09 02:12:01';  
  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