上一回演示了運用閃回表查詢恢復delete刪除的數據以及其原理,今天了解下閃回表。
原理:
閃回表(Flashback table)與閃回查詢(Flashback query)的原理大致相同,也是利用undo信息來恢復表對象到以前的某一個時間點(一個快照),因此也要確保AUM有足夠的Retention值。但閃回表不等于閃回查詢,其區別如下:
閃回查詢只是查詢以前的一個快照而已,并不改變當前表的狀態。
閃回表則是將恢復當前表及附屬對象一起回到以前的時間點。
特性:
1. 在線操作
2. 恢復到指定的時間點(或者SCN)的任何數據
3. 自動恢復相關屬性
4. 滿足分布式的一致性
5. 數據的一致性,所有相關對象將自動一致。
語法:
SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss');
SQL> flashback table tab_test to scn 1154953;
SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss') enable triggers;
運用閃回表前提
1.普通用戶中需要有Flashback any table的系統權限。命令如:
SQL>grant flashback any table to scott;
2.有該表的select、insert、delete、alter權限。
3.必須保證該表有row movement(行移動)。
示例:
1.創建tab_test表
SQL> create table tab_test as select * from all_objects;
Table created
2.查詢tab_test表中數據量
SQL> select count(*) from tab_test;
COUNT(*)
----------
40699
3.為tab_test表創建索引和觸發器(觸發器為null,不做任何操作)
SQL> create index ind_test on tab_test(object_name);
Index created
SQL> create or replace trigger tr_test
2 after update on tab_test
3 for each row
4 begin
5 null;
6
7 end tr_test;
8 /
Trigger created
4.記錄當時的時間點,試圖恢復到該時間點
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;
TIME SCN
------------------- ----------------------------------------
2010-06-30 23:02:37 1160764
5.刪除tab_test表中數據
SQL> delete from tab_test;
40699 rows deleted
SQL> commit;
Commit complete
6.查詢刪除數據后的tab_test,確定其表中已沒有數據
SQL> select count(*) from tab_test;
COUNT(*)
----------
7.刪除tab_test表中索引ind_test
SQL> drop index ind_test;
Index dropped
8.更改tr_test觸發器
SQL> create or replace trigger tr_test
2 after insert on tab_test
3 for each row
4 begin
5 null;
6
7 end tr_test;
8 /
Trigger created
9.確保該表中的行遷移(row movement)功能
SQL> alter table tab_test enable row movement;
Table altered
10.恢復tab_test表到剛記錄的時間點(或scn),由于表中存在觸發器,因此使用了關鍵字enable triggers;
SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 23:02:37', 'yyyy-mm-dd hh24:mi:ss') enable triggers;
Done
11.查看恢復結果如下:
SQL> select count(*) from tab_test;
COUNT(*)
----------
40699
SQL> select index_name from user_indexes where table_name = 'TAB_TEST';
INDEX_NAME
------------------------------
SQL> select object_name, status from user_objects where object_name in('TR_TEST', 'IND_TEST');
OBJECT_NAME STATUS
------------------ -------
TR_TEST VALID
SQL> set pages 0
SQL> set lines 1000
Cannot SET LINES
SQL> set long 2000
SQL> select text from user_source t where t.name = 'TR_TEST' order by line;
trigger tr_test
after insert on tab_test
for each row
begin
null;
end tr_test;
總結:
1. Flashback table在真正的高可用環境中,使用意義不大,受限比較多,要必須確保行遷移功能
2. Flashback table過程中,阻止寫操作
3. 表中數據能恢復,而表中索引確不能正常恢復
4. 恢復的觸發器本身還是修改后的,并不隨表flashback到修改以前的時間點。說明關鍵字enable triggers只能保證觸發器的狀態正常,而不是內容回滾.
5. 由于原理利用其undo信息,來恢復其對象,因此也是不能恢復truncate數據
6. 恢復數據用flashback query實現比較好
posted on 2010-08-04 20:39
xzc 閱讀(3086)
評論(0) 編輯 收藏 所屬分類:
Oracle