閃回表技術

skyin_1603發表於2016-09-29
有時候,我們插入更新資料,已經成功插入部分資料並提交commit了,發現有些資料插入錯誤或者不想插入,
我們想返回某個時間點(timestamp)或者scn的資料狀態,這時候,我們可以透過閃回表技術幫忙解決這個問題。

此處,我們只透過時間來做一次閃回表:
進入scoot使用者建立的test1表,並顯示時間,檢視此時狀態的資料,
conn scott/tiger0520

SQL> set time on

22:12:25 SQL>

22:12:25 SQL>  select * from test1;

no rows selected

插入一條資料,提交併插敘此時的資料,

22:19:50 SQL> insert into test1 values(10,'ACCOUNTING','NEW YORK');

1 row created.

22:19:55 SQL> commit;

Commit complete.

 

22:20:01 SQL> select * from test1;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

再插入一條資料,提交併查詢此時的資料,

22:20:21 SQL> insert into test1 values(20,'RESEARCH','DALLAS');

1 row created.

22:20:37 SQL> commit;

Commit complete.

22:20:45 SQL> select * from test1;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS
此時,發現插入資料錯誤,只想插入上述的第一條資料,這時馬上閃回,
22:20:56 SQL> flashback table test1 to timestamp

22:28:33   2  to_timestamp('2016-09-29 22:20:37','yyyy-mm-dd hh24:mi:ss');

flashback table test1 to timestamp

                *

ERROR at line 1:

ORA-08189: cannot flashback the table because row movement is not enabled

此時發現報錯。
因為閃回表時,資料的rowid已經發生了改變,一般情況下,資料庫不允許隨意改變表資料的rowid,
這時候,我們已改用
alter table  test1 enable row movement,允許改動rowid,
alter table  test1 enable row movement;
再次執行閃回表,發現,資料恢復到時間為22:20:37的資料

22:31:09 SQL> flashback table test1 to timestamp

22:31:23   2  to_timestamp('2016-09-29 22:20:37','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

22:31:40 SQL> select * from test1;                                        

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK


閃回表成功。





















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

相關文章