1. 程式人生 > >oracle閃回(flashback)的部分實用操作(徹底刪除的除外)

oracle閃回(flashback)的部分實用操作(徹底刪除的除外)

一、資料delete並且commit提交之後的閃回

(一):根據時間來恢復:
1、查詢資料庫當前時間(目的是為了檢查資料庫時間是否與你電腦時間相近,避免時間不同而將資料恢復到錯誤時間點)
select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
2、查詢刪除資料時間點之前的資料
select * from 表名 as of timestamp to_timestamp('2018-08-11 16:12:11','yyyy-mm-dd hh24:mi:ss');
(若沒有資料 ,將時間繼續提前)
3、恢復資料(激動人心的時刻)
flashback table 表名 to timestamp to_timestamp('2018-08-11 16:12:11','yyyy-mm-dd hh24:mi:ss');
但是也可能會出現問題,比如報錯:ORA-08189:未啟用行移動功能,不能閃回表,不要怕,這個很簡單;
alter table 表名 enable row movement;
然後再次執行上面SQL即可;
大功告成,資料恢復成功;

例項:

1、建立測試資料:

select * from test_tmp;

2、刪除IDS=3的資料並提交

delete from test_tmp where ids = 3;
commit;

3、查詢刪除資料時間點之前的資料(操作delete之前的時間)

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--2018-11-09 16:34:32     --檢視當前時間(往前推)

select * from test_tmp as of timestamp to_timestamp('2018-11-09 16:30:00','yyyy-mm-dd hh24:mi:ss');  --取一個delete之前的資料(原則離你刪除最近的時間,防止其他人的操作資料庫增刪改發生問題)

ps(還有一個簡單的方法就是用plsql時,你可以按ctrl+e檢視操作歷史,這樣更為精確,時間選取在你delete和上一條dml語句之間,如下就可以選取2018/11/9 17:27:09前一點的資料,閃回前檢視下資料)

select * from test_tmp as of timestamp to_timestamp('2018-11-09 17:27:00','yyyy-mm-dd hh24:mi:ss');--檢視這個時間點的資料

 4、最後閃回資料

flashback table test_tmp to timestamp to_timestamp('2018-11-09 17:27:00','yyyy-mm-dd hh24:mi:ss');

若報錯:ORA-08189:未啟用行移動功能,不能閃回表先執行下下面語句再閃回

alter table 表名 enable row movement;
alter table 表名 disable row movement;  --關閉

ps(將row movement設定為enable,有可能發生行的物理移動,行的rowid會變化,某一行更新時,如果更新的是分割槽列,並且更新後的列值不屬於原來的這個分割槽,如果開啟了這個選項,就會把這行從這個分割槽中delete掉,並加到更新後所屬的分割槽。相當於一個隱式的delete+insert,但是不會觸發insert/delete觸發器。如果沒有開啟這個選項,就會在更新時報錯。

(二):根據資料庫SCN恢復資料
1、查詢當前資料庫SCN號
select current_scn from v$database;(不能執行的話,切換到sys使用者或system使用者查詢)  

 
查詢到的當前值為:759447476367
2、縮小SCN號查詢被刪除表資料(若無資料繼續縮小SCN,由於資料庫操作不止一人,SCN號變化比較多,可以多縮小几個號)
select * from 表名 as of scn 759447472000;
select * from test_tmp as of scn 759447472000;
3、恢復資料
flashback table test_tmp to scn 759447472000;
恢復完成。若報錯:ORA-08189:未啟用行移動功能,不能閃回表;結果方案同上。

建議:用方案(一)

二、表被drop掉後閃回

1、drop表
drop table test_bak;
2、閃回表
flashback table test_bak to before drop;

(注:drop table test_bak purge;此操作無法閃回,因為已經直接清空了回收站)

 (其他後續補充)

 

原文參考:https://blog.csdn.net/qq_35052774/article/details/52184164

原文參考:https://blog.csdn.net/rockpk008/article/details/38504931