Oracle對於誤刪誤操作的數據進行恢復(flashback query、flashback drop、flashback table、flashback database)

Oracle對於誤刪誤操作的數據進行恢復。
日常工作中難免遇到自己或者別人誤操作、刪除、修改了數據庫的數據。此時我們該如何恢復數據呢。
 
1、我們可以應用Flashback Query查詢過去的數據
Flashback Query這一特性,最常被應用的就是修復誤操作的數據了。注意,這並不是說Flashback Query能夠恢復數據。Flashback Query本身不會恢復任何操作或修改,也不能告訴你做過什麼操作或修改,實際上Flashback Query特性實際應用時,是基於標準SELECT的擴展,藉助該特性能夠讓用戶查詢到指定時間點的表中的記錄,相當於擁有了看到過去的能力,至於恢復,SELECT的結果都出來了,難道還不懂如何執行INSERT。
注意:Flashback Query查詢過去的數據僅對delete 等dml語句有效,如果是通過truncate更改了數據是無法使用Flashback Query查詢過去的數據的
下面舉個例子:
首先我準備了一張表,裏面有兩條數據。
 
此時我們執行delete語句 將數據刪除。
 
 
使用flashback query查詢
select * from O_MCHT_KEY_API_BAK as of timestamp to_timestamp('2020-03-13 11:00:57', 'yyyy-mm-dd hh24:mi:ss');

 

 
我們可以看到使用flashback query指定時間點爲2020-03-13 11:00:57,可以查詢到當時的數據是什麼樣,這個時候我們就可以把這兩條數據重新複製出來插到表裏,這樣就完成了數據恢復。
注意: flashback query有時效性,太久之前的數據會被清除。
如果我們drop了表,該如何恢復呢?
這裏我們先把表drop掉,使用查詢可以看到,表已經不存在
 
 
2、我們可以應用Flashback table恢復被drop操作的表
這時我們使用flashback query是無法查詢到表的原來數據,此時可以使用flashback table。
flashback table O_MCHT_KEY_API_BAK to before drop;

再執行查詢之後我們可以看到數據已經恢復成功。

 
 
當然flashback tabloe也可以用在對已經delete了的數據進行恢復。
 
此時我們先刪除一行數據,然後執行
flashback table O_MCHT_KEY_API_BAK to timestamp to_timestamp('2020-03-13 11:00:57', 'yyyy-mm-dd hh24:mi:ss');

可以看到,此時恢復報錯,提示[72000][8189] ORA-08189: 因爲未啓用行移動功能, 不能閃回表

這裏只需要給對應的表開啓行移動功能即可。
//開啓錶行移動功能
alter table T_TERM_MCHT_INFO enable row movement;

 

 
再次執行
flashback table O_MCHT_KEY_API_BAK to timestamp to_timestamp('2020-03-13 11:00:57', 'yyyy-mm-dd hh24:mi:ss');

可以看到被刪除的一條記錄已經恢復成功了。

 
 
3、我們可以應用Flashback table恢復被drop操作的表(數據被delete了,且!!新增字段表結構被改變!!!)
delete完數據之後,我們加了一列,此時再執行flashback quert 以及flashback table
這裏執行flashback query與falshback table 均可以恢復,但是新加的列被使用null填充。
次執
4、當表裏的數據被delete了,且!!刪除字段- - - -表結構被改變!!!
爲了模擬這種情況,首先我們將這個表還原成原始狀態並插入兩條記錄。
過5分鐘,我們刪除表中一列,然後再按flashback query或者flashback table的方式恢復。執行完系統報錯:[72000][1466] ORA-01466: 無法讀取數據 - 表定義已更改
因爲系統閃回的數據已經跟當前狀態的表不一致了。
 
此時如果要恢復之前的數據只能使用rename的方式,即將以前的數據按以前的表結構,恢復到另一張新表中,具體操作如下:
--將O_MCHT_KEY_API_BAK閃回並將數據轉存到另一張表:O_MCHT_KEY_API_BAK_1
flashback table O_MCHT_KEY_API_BAK to before drop rename to O_MCHT_KEY_API_BAK_1;

 

我們可以看到原始的數據已經被回覆到我們rename之後的一張新表中。
 
5、當表裏的數據被truncate了,只能通過flashback database來恢復
如果表被truncate了,那麼flashback query、flashback table都沒用了
直接通過flashback database來恢復
要使用flashback database 首先得確保FLASHBACK 是打開的,也就是下面你的語句 要返回YES
 
在FLASHBACK是打開的前提下,此時使用以下命令就能重新恢復。如果flashback沒有打開,且你已經truncate table,那麼恭喜你,找DBA吧,這是你跟他增進感情的絕佳機會!
flashback database to timestamp to_timestamp('2020-03-13 14:31:26', 'yyyy-mm-dd hh24:mi:ss');

 

 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章