Oracle Flashback家族有四個成員,分別是以下:
Flashback Database ——閃回數據庫
Flashback Drop ——閃回刪除Flashback Table ——閃回表
Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query) ——閃回查詢
今天討論下Flashback Database技術
Flashback Database(利用閃回日誌恢復)
Oracle
Flashback Database特性允許通過SQL語句Flashback
Database語句,讓數據庫前滾到當前的前一個時間點或者SCN,而不需要做時間點的恢復。閃回數據庫可以迅速將數據庫回到誤操作或人爲錯誤的前一個時間點,如Word中的"撤消"操作,可以不利用備份就快速的實現基於時間點的恢復。Oracle通過創建新的Flashback
Logs(閃回日誌),記錄數據庫的閃回操作。如果希望能閃回數據庫,需要設置如下參數:DB_RECOVER_FILE_DEST日誌的存放位置,DB_RECOVER_FILE_DEST_SIZE恢復區的大小。在創建數據庫的時候,Oracle將自動創建恢復區,但默認是關閉的,需要執行alter
database flashback on命令。打開Flashback Database功能之前不保證數據庫是Archivelog模式。
打開Flashback Database功能:
shutdown immediate
startup mount
alter database archive log;(打開歸檔模式)
archive log list;(確認數據庫歸檔模式)
alter Database Flashback on;(on爲打開,off爲關閉)
alter database open;(打開數據庫)
select current_scn ,log_mode,flashback_on from v$database;(查詢當前scn號,歸檔模式,閃回功能)
執行破壞性操作,delete from test;(誤刪除了test表中數據)
shutdown immediate(關閉數據庫)
startup mount(啓動到mount狀態)
Flashback Database to scn ****;(按scn號閃回)
Flashback Database to timestamp to_timestamp('2015-10-10 07:30:10.350','yyyy-mm-dd hh24:mi:ss.ff') ;(按時間戳閃回)
select * from test;(查看閃回之後的效果)
在執行完flashback database 命令之後,oracle 提供了兩種方式讓你修復數據庫:
1). 先執行alter database open read only命令以read-only 模式打開數據庫,然後立刻通過邏輯導出的方式將誤操作涉及表的數據導出,再執行recover database 命令以重新應用數據庫產生的redo,將數據庫修復到flashback database 操作前的狀態,然後再通過邏輯導入的方式,將之前誤操作的表重新導入,這樣的話對現有數據的影響最小,不會有數據丟失。
假設現在有兩個表,test1和test2,
SQL> select * from test1;
ID NAME
---------- ----------
3759479 A
SQL> select * from test2;
ID VAL
---------- ----------
3759479 A
SQL>delete from test1;(誤刪除了test1表中數據,現在要閃回到當前scn號爲***)
SQL>insert
into test2 values(dbms_flashback.get_system_change_number,'B');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test2;
ID VAL
---------- ----------
3759479 A
3761885 B
在刪除之後又對test2表做了正確的插入操作。
閃回到scn號爲***時,雖然test1表中記錄回來了,但是test2表中記錄會丟失第二條記錄,此時需要應用scn號***之後的redo來恢復數據庫。
SQL> alter database open read only;(flashback database test1表中數據會恢復到刪除之前的狀態,此時以read
only模式打開數據庫,讀取test1中記錄,邏輯導出,以待最後再插入到test1中)
Database altered.
SQL> select * from test1;(記錄正常)
ID NAME
---------- ----------
3759479 A
SQL>
select * from test2;(丟失第二條記錄)
ID NAME
---------- ----------
3759479 A
SQL> shutdown immediate
SQL> startup mount
SQL> recover database;(應用redo來恢復數據庫)
Media recovery complete.
SQL> alter database open;
Database altered.
此時結果爲:
SQL>
select * from test1;(狀態回到刪除之後的,待邏輯插入剛纔導出的記錄)
no rows selected
SQL> select * from test2;(記錄正常)
ID VAL
---------- ----------
3759479 A
3761885 B
最後再邏輯插入剛纔從test1中導出的記錄。至此,恢復完畢,數據零丟失。
2). 直接alter database open resetlogs打開數據庫,當然,指定scn 或者timestamp 時間點之後產生的數據統統丟失。
SQL> alter database open resetlogs;
此時,所有表的狀態都回到恢復點,之後產生的數據都丟失了。
注意:Flashback Database 需要在數據庫mount模式下執行,sys用戶可以執行,注意兩種數據恢復方式。