1. 程式人生 > >Oracle閃回技術之一Oracle 11g 利用FlashTable (閃回表)恢復(用delete)誤刪的資料

Oracle閃回技術之一Oracle 11g 利用FlashTable (閃回表)恢復(用delete)誤刪的資料

閃回表,實際上就是將表中的資料快速恢復到過去的一個時間點或者系統改變號SCN上。實現表的閃回,需要用到撤銷表空間相關的UNDO資訊,通過SHOW PARAMETER UNDO命令就可以瞭解這些資訊。使用者對錶的資料的修改操作,都記錄在撤銷表空間中,這為表的閃回提供的資料恢復的基礎。

修改記錄被提交到undo表空間中的預設保留時間為900秒,使用者可以在這900秒的時間內對錶的進行閃回操作,從而將表中的資料恢復的修改前的狀態。

如上圖顯示的預設900秒,我們通過sql來修改這個預設時間為1200:

flashtable的語法:

flashback table [schema.]table_name to {[before drop [rename to new_table_name]] | [SCN | TIMESTAMP] expr [enable | desable] triggers}

schema:模式名 table_name :表名

before drop 表示回覆到刪除之前

rename new_table_name 重新定義表名稱

timestamp 時間戳,包括年月日時分秒

expr 制定一個值或表示式

enable triggers 觸發器恢復後,呈啟用狀態

disabled triggers 觸發器回覆後,呈禁用狀態,預設情況下為此選項。

下面演示一個示例:

首先在資料庫中建立一個表,並插入3條資料

SQL>create table tb_flash1(id number primary key,content varchar2(40));

表已建立。

SQL> insert into tb_flash1(id,content)
  2  select 1,'第一行資料' from dual
  3  union all
  4  select 2,'第二行資料' from dual
  5  union
  6  select 3,'第三行資料' from dual
  7  /

已建立3行。

SQL> commit
  2  /

提交完成。

查詢剛才插入的資料:

SQL> select * from tb_flash1
  2  /

        ID CONTENT
---------- ----------------------------------------
         1 第一行資料
         2 第二行資料
         3 第三行資料

假設現在誤刪除一條id=2的資料:

SQL> delete from tb_flash1 where id=2
  2  /

已刪除 1 行。

SQL> commit;

提交完成。

再次查詢,表中只剩兩條記錄:

SQL> select * from tb_flash1
  2  /

        ID CONTENT
---------- ----------------------------------------
         1 第一行資料
         3 第三行資料

接下來對剛刪除的資料執行恢復操作:

1、開啟表的移動功能

SQL> alter table tb_flash1 enable row movement
  2  /

表已更改。

2、將表恢復到刪除資料的時間之前(注意這個時間儘量與您刪除資料的時間相同或稍微靠前)

SQL> flashback table tb_flash1 to timestamp
  2  to_timestamp('2013-01-26 15:58:30','yyyy-mm-dd hh24:mi:ss')
  3  /

閃回完成。

SQL> select * from tb_flash1;

        ID CONTENT
---------- ----------------------------------------
         1 第一行資料
         2 第二行資料
         3 第三行資料

至此資料已恢復。

下面介紹恢復到scn

將時間戳轉換到scn

SQL> select timestamp_to_scn(to_timestamp('2013-01-26 15:58:30','yyyy-mm-dd hh24
:mi:ss')) from dual;

TIMESTAMP_TO_SCN(TO_TIMESTAMP('2013-01-2615:58:30','YYYY-MM-DDHH24:MI:SS'))
---------------------------------------------------------------------------
                                                                    1263136

SQL> flashback table tb_flash1 to 1263136;


閃回完成。閃回完成。閃回完成。