oracle 10g flashback table
2024-08-29 13:37:24
供稿:網友
 
             Flashback table與9i的flashback query相似,利用undo信息來恢復一個或者一些表到現在以前的一個時間點(一個快照)。Undo相關參數如下,需要確保AUM與足夠的retention值。
SQL> show parameter undo
NAME TYPE VALUE
                                                                                            ------------------------------------ ----------- -----------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
首先要說明的是,flashback table不等于flashback query,所謂query,僅僅是查詢以前的一個快照點而已,并不改變當前表的狀態,而flashback table不一樣,將改變當前表及附屬對象一起回到以前的時間點。
其實9i的flashback query在10g中也有了新的變化,10g中可以簡單的利用以下語句實現flashback query,而不再需要象9i那樣需要調用DBMS_FLASHBACK包。
SELECT * FROM TABLENAME AS OF TIMESTAMP
TO_TIMESTAMP('2003-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
WHERE ……;10g的flashback table有如下特性
· 在線操作 
· 恢復到指定時間點或者SCN的任何數據. 
· 自動恢復相關屬性,如索引,觸發器等 
· 滿足分布式的一致性 
· 滿足數據一致性,所有相關對象將自動一致 
語法為:
FLASHBACK TABLE tablename TO TIMESTAMP (JUL-07-2003, 02:33:00) 
FLASHBACK TABLE employee TO SCN 123456;
FLASHBACK TABLE t1 TO TIMESTAMP '2003-03-03 12:05:00' ENABLE TRIGGERS;
其中ENABLE TRIGGERS表示觸發器恢復之后為enable狀態,而默認為disable狀態。注重:假如需要flashback一個表,需要保證
需要有flashback any table的系統權限或者是該表的flashback對象權限。
需要有該表的SELECT, INSERT, DELETE, ALTER權限
必須保證該表ROW MOVEMENT下面,我們用一個具體的例子來說明這個過程:
16:16:51 SQL> create user flash identified by flash;
User created.
16:17:04 SQL> grant connect,resource to flash;
Grant sUCceeded.
16:17:19 SQL> connect flash/flash;
Connected.
16:26:35 SQL> create table t1 as select * from all_objects;
Table created.
16:37:24 SQL> create table t2 as select * from t1;
Table created.16:37:35 SQL> select count(*) from t1;
COUNT(*)
----------
38949
16:37:43 SQL> select count(*) from t2;
COUNT(*)
----------
38949
16:38:06 SQL> create index inx_test1 on T1 (object_name);
Index created.
16:39:55 SQL> create index inx_test2 on T1 (object_id);
Index created.
16:40:47 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2004-04-06 16:41:18
以上獲得一個時間戳,假定我們要恢復該表到這個時間,那么以下對該表的操作都將被前滾。
16:41:18 SQL> drop index inx_test1;
Index dropped.
16:41:33 SQL> delete from t1;
38949 rows deleted.
16:41:46 SQL> commit;
Commit complete.
16:41:49 SQL> truncate table t2;
Table truncated.在以上的操作中,我們delete一個表,然后truncate一個表,下面,我們將來看看flashback table的效果,能恢復到什么程度
16:37:55 SQL> ALTER TABLE t1 ENABLE ROW MOVEMENT;
Table altered.
16:38:03 SQL> ALTER TABLE t2 ENABLE ROW MOVEMENT;
Table altered.16:43:10 SQL> flashback table t1 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
16:43:49 SQL> flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss')
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
                         我們可以發現,執行delete操作的表是可以恢復的,而執行truncate操作的表是不可以恢復的,這正好也說明了flashback table利用undo的結論。
看看我們的結果:
SQL> select count(*) from t1;
COUNT(*)
----------
38949
SQL> select count(*) from t2;
COUNT(*)
----------
0SQL> select t.index_name from user_indexes t where t.table_name='T1'; 
INDEX_NAME
------------------------------
INX_TEST2
還可以看到,對于drop的索引,也是沒有辦法恢復的,因為drop并不記錄undo,所以所謂索引的恢復,僅僅是相關索引樹的改變而不能找回刪除掉的索引。