Oracle的閃回功能可以在對資料庫進行不完全恢複的情況下,對某一個指定的表進行恢複。閃回資料 庫是進行時間點恢複的新方法,它能夠快速將Oracle恢複到以前的時間,以更正由於邏輯資料損毀或用 戶錯誤而引起的問題。當需要恢複時,可以將資料庫恢複到錯誤前的時間點,並且只恢複改變的資料區塊 。
Oracle中的閃回操作包括以下4種:
(1)查詢閃回:查詢過去某個指定時間、指定實體的資料,恢複錯誤的資料庫更新、刪除等。
(2)表閃回:使表返回到過去的某一時間的狀態,恢複表、取消對錶進行的修改。
(3)刪除閃回:可以將刪除的表重新恢複。
(4)資料庫閃回:可以將整個資料庫回退到過去的某個時間點。
1、查詢閃回
查詢閃回可以查看過去某一時點的任何資料,如果要查詢某一表在某一時點的內容,可以把查詢目標 對象定位為該表在某一時點的表,表在某一時刻的表可以如下表示:
table_name as of timestamp real_timestamp; --它作為一個整體表示一個表*/
例如,要查詢person表在2012-6-2 19:00:00的狀態,可以使用如下語句:
select * from person as of timestamp to_timestamp('2012-6-2 19:00:00', 'yyyy-mm-dd HH24:mi:ss');
知道了表在某一時刻的表之後,我們就可以很容易的把表恢複到某一時刻的樣子了,例如我們在 2012-6-2 19:00:00這個時候刪除了person表中的3條記錄,之後我又想把它恢複,那應該如何恢複呢? 利用查詢閃回我們可以這樣操作:
方法一:
第一步,把當前表中的資料全刪了:delete from person;
第二步,我們通過查詢閃回把2012-6-2 19:00:00這個時點之前的資料拿出來然後插入到當前表中, 調用語句如下:
insert into person select * from person as of timestamp to_timestamp('2012-6-2 18:59:59', 'yyyy-mm-dd HH24:mi:ss');
方法二:
先找出從person表中刪除的記錄,然後再把它們插到person表中,Sql語句如下:
insert into person select * from person as of timestamp to_timestamp('2012-6-2 18:59:59', 'yyyy-mm-dd HH24:mi:ss') p where not exists(select * from person where id=p.id);
因為查詢閃回是跟時間有關係的,所以說到這就再說一個設定,在sqlplus中輸入set time on語句可 以開啟時間顯示功能,這會使得在每次執行語句後都會在該語句的前面顯示該語句的執行時間,使用set time off語句可以關閉該功能。
2、表閃回
利用表閃回可以輕鬆的取消對錶的修改。只有Oracle的企業版才能進行表閃回。
對進行表閃回的表必須row movement為enable。
表閃回的文法格式如下:
flashback table [schema.]table_name[,...n] to {[scn] | [timestamp] [[enable | disable] triggers]};
其中,
scn:表示系統改變號,可以從flashback_transaction_query資料字典中查詢。
timestamp:表示通過時間戳記的形式來進行閃回。
enable|disable triggers:表示觸發器恢複之後的狀態,預設為disable。
範例程式碼:
(1)確保需要閃回的表row movement為enable:
alter table hello enable row movement;
(2)對錶進行閃回:
flashback table hello to timestamp to_timestamp('2012-6-3 14:00:00','yyyy-mm-dd HH24:mi:ss');--恢複表到2012-6-3 14:00:00這個時候的樣子*/