ARCHIVELOG模式下使用者管理的不完全恢復—基於時間點的不完全恢復
阿新 • • 發佈:2018-11-10
基於時間點的恢復主要使用於以下情況:誤刪除表、誤截斷表、提交了錯誤的資料。(從oracle 10g利用閃回更easy!)
首先關閉資料庫執行一個冷全備份(冷備份的時候使用者u1的t表中是有3條記錄的。)
[sql] view plain copy print ?- SQL> conn /as sysdba
- 已連線。
- SQL> shutdown immediate
- 資料庫已經關閉。
- 已經解除安裝資料庫。
- ORACLE 例程已經關閉。
- 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> conn /as sysdba
- 已連線到空閒例程。
- SQL> startup
- ORACLE 例程已經啟動。
- Total System Global
- 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;
- 未選定行
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 ?- 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/
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> 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行。
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 ?- SQL> recover database until time '2011-10-09 02:12:01';
- 完成介質恢復。
- SQL> alter database open;
- alter database open
- *
- 第 1 行出現錯誤:
- ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項
- SQL> alter database open resetlogs;
- 資料庫已更改。
- SQL> conn u1/u1
- 已連線。
- SQL> select * from t;
- ID VALUE
- ---------- ----------
- 1 a
- 2 b
- 3 c