【Flashback】Flashback Table功能實踐

secooler發表於2011-05-07
1.Flashback Table功能描述
將資料表恢復到之前的一個時間點或SCN號。
注意:該功能將改變當前表及相關物件統一閃回到之前的一個狀態。

2.需要修改的系統引數
undo_management,引數需要是“AUTO”,保證回滾段使用模式是SMU mode
undo_retention,單位是秒,調整可回滾的時間範圍
確認系統的相關引數
sys@ora10g> show parameter undo

NAME              TYPE       VALUE     
----------------- ---------- ----------------
undo_management   string     AUTO
undo_retention    integer    2000
undo_tablespace   string     UNDOTBS1

3.10g的flashback table閃回特點
線上操作
恢復到指定時間點或者SCN的任何資料.
自動恢復相關屬性,如索引,觸發器等
滿足分散式的一致性
滿足資料一致性,所有相關物件將自動一致

4.
Flashback Table語法
FLASHBACK TABLE tablename TO TIMESTAMP to_timestamp('2011-05-07 08:23:48','yyyy-mm-dd hh24:mi:ss');
FLASHBACK TABLE employee TO SCN 123456;
FLASHBACK TABLE t1 TO TIMESTAMP to_timestamp('2011-05-07 08:23:48','yyyy-mm-dd hh24:mi:ss'); ENABLE TRIGGERS;

5.閃回的前提條件
需要有flashback any table的系統許可權或者是該表的flashback物件許可權。
需要有該表的SELECT, INSERT, DELETE, ALTER許可權
必須保證該表ROW MOVEMENT

6.實驗內容及目的
使用flashback table閃回到之前某個時間點
驗證flashback table不能夠閃回被drop掉的索引
驗證flashback table不能夠閃回truncate的表內容

7.建立測試表
sec@ora10g> set time on
08:23:09 sec@ora10g> create table t1 as select * from dba_objects;

Table created.

08:23:13 sec@ora10g> create table t2 as select * from t1;

Table created.

08:23:19 sec@ora10g> select count(*) from t1;

  COUNT(*)
----------
     11413

08:23:30 sec@ora10g> select count(*) from t2;

  COUNT(*)
----------
     11413

08:23:34 sec@ora10g> create index inx_test1 on t1(object_name);

Index created.

08:23:40 sec@ora10g> create index inx_test2 on t1(object_id);

Index created.

08:23:43 sec@ora10g> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2011-05-07 08:23:48

8.模擬刪除:刪除表的索引,delete方式刪除資料,truncate方式刪除資料
08:24:11 sec@ora10g> drop index inx_test1;

Index dropped.

08:24:14 sec@ora10g> delete from t1;

11413 rows deleted.

08:24:24 sec@ora10g> commit;

Commit complete.

08:24:33 sec@ora10g> truncate table t2;

Table truncated.

08:24:38 sec@ora10g> select count(*) from t1;

  COUNT(*)
----------
         0

08:24:41 sec@ora10g> select count(*) from t2;

  COUNT(*)
----------
         0

9.Flashback Table閃回測試
08:24:45 sec@ora10g> alter table t1 enable row movement;

Table altered.

08:25:01 sec@ora10g> alter table t2 enable row movement;

Table altered.

08:25:04 sec@ora10g> flashback table t1 to timestamp to_timestamp('2011-05-07 08:23:48','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

08:26:09 sec@ora10g> flashback table t2 to timestamp to_timestamp('2011-05-07 08:23:48','yyyy-mm-dd hh24:mi:ss');
flashback table t2 to timestamp to_timestamp('2011-05-07 08:23:48','yyyy-mm-dd hh24:mi:ss')
                *
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed


08:26:22 sec@ora10g> select count(*) from t1;

  COUNT(*)
----------
     11413

08:26:34 sec@ora10g> select count(*) from t2;

  COUNT(*)
----------
         0

08:26:38 sec@ora10g> select index_name from user_indexes where table_name = 'T1';

INDEX_NAME
------------------------------
INX_TEST2

10.小結
  使用flashback table可以將delete方式刪除的表閃回到之前某個時間點。
  flashback table功能不能夠將被drop掉的索引恢復出來,因為drop索引的過程屬於DDL操作,不記錄undo資訊。
  flashback table功能不能夠將被truncate的表內容恢復出來,原因也是truncate操作過程是不記錄undo資訊。

Good luck.

secooler
11.05.07

-- The End --


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-588847/,如需轉載,請註明出處,否則將追究法律責任。

相關文章