FLASHBACK TABLE用法介紹

1.作用

在人爲操作或應用程序錯誤時,使用FLASHBACK TABLE語句恢復表到一個早期狀態。表可以閃回到過去的時間點,依賴於系統中撤銷數據的數據量。此外,Oracle數據庫不能恢復到通過任何DDL操作改變了表結構的早期狀態。

(注意:Oracle強烈建議數據庫運行在自動撤銷模式下,通過設置UNDO_MANAGEMENT初始參數值爲AUTO,默認是自動模式。另外,設置UNDO_RETENTION初始化參數的間隔足夠大,包括你預計需要的最早數據。)

你不能回滾FLASHBACK TABLE語句。但是,你可以執行另一個FLASHBACK TABLE語句,指定一個早於當前時間的時間點。

 

2.權限

要閃回一個表到早期的SCN或時間戳。你必須有表的 FLASHBACK對象權限,或者FLASHBACK ANY TABLE系統權限。另外,你必須還有表的 SELECT, INSERT, DELETE和 ALTER對象權限。

閃回列表中的所有表必須啓用行移動,除非你是正在閃回表到BEFORE DROP。這種操作叫做閃回刪除操作,他使用的是回收站中的刪除數據,而不撤銷數據。

要閃回表到一個還原點,你必須有SELECT ANY DICTIONARY或FLASHBACK ANY TABLE系統權限,或者SELECT_CATALOG_ROLE角色。

要閃回表到DROP TABLE操作之前。你只需要刪除該表的必須權限。

 

3.語法

 

語義:

在執行閃回表操作期間,數據庫獲取閃回列表中所有指定的報表獨立DML鎖。當正在恢復到之前狀態時,這些鎖阻止對錶的任何操作.

閃回表操作在單個事物中執行,不管閃回表中指定表的數量。要麼所有的表都恢復到早期狀態,要麼都沒恢復。如果任何表的閃回表操作失敗,那麼整個語句都失敗。

閃回操作完成時,表中的數據與表之前的時間點一直。但是,FLASHBACK TABLE到SCN或時間戳不保存rowid,FLASHBACK TABLE TO BEFORE DROP不能恢復引用約束。

數據庫不能恢復與表關聯的早期結構的統計信息。表當前的索引是恢復,並反映還原點表的狀態。如果該索引在還原點不存在,數據更新索引裏來反映還原點表的狀態。然而,如果索引是在當前時間和還原點之間被刪除,是不能恢復。

 

schema

指定模式包含的表。如果缺省,數據庫假定該表是在你自己的模式。

table

指定一個或多個表名稱。

閃回表收受以下限制:

  • 對於這些對象類型閃回表操作是無效的:表是集羣的一部分,物化視圖,高級隊列表,靜態數據字典表,系統表,遠程表,對象表,嵌套表,獨立分區表和子分區表。
  • 以下DDL操作改變了表的結構,所以不能接着使用 TO SCN或 TO TIMESTAMP閃回到操作之前的時間點:升級,移動,截取表(truncate);增加表約束,增加表到集羣;刪除或修改列;更改列的加密密鑰;增加,刪除,合併,分離,聯合,截取分區或子分區(除了增加範圍分區)

TO SCN Clause

指定你返回的時間對應系統改變SCNexpr必須計算一個數字,代表有效的SCN。

TO TIMESTAMP Clause

指定你要返回表的時間點對應的時間戳。 expr 必須計算一個過去有效的時間戳。表將被閃回到指定時間戳大約3秒內的時間點。

TO RESTORE POINT Clause

指定你要閃回表的還原點,該還原點在之前必須配創建。

ENABLE | DISABLE TRIGGERS

默認情況下,數據庫禁用在閃回表操作期間的表上定義的所有啓用觸發器,在閃回表操作完成之後再啓用他們。如果你想覆蓋默認的行爲,並在執行閃回過程中啓用觸發器,指定ENABLE TRIGGERS。

TO BEFORE DROP Clause

使用這個子句檢索回收站中已刪除的表,及其可能依賴的對象。該表必須是駐留在本地管理表空間,而不是其他系統表空間。

你可以指定原始用戶指定的表的名稱,或對象刪除時數據庫分配的系統生成名稱。

  • 回收站中系統生成的對象名稱是唯一的。因此,如果指定系統生成名稱,那麼數據庫檢索指定的對象。

要查看回收站中的內容,查詢USER_RECYCLEBIN數據字典,也可以使用RECYCLEBIN同義詞替代。下面兩個語句返回相同行:

select * from  recyclebin;

select * from user_recyclebin;

  •  如果指定了用戶指定的名稱,且如果回收站中包含多個該名稱的對象,然後數據庫檢索回收站中最近移動的對象。如果想要檢索更早版本的表,你可以這樣做:
    • 指定你想要檢索的表的系統生成名稱。
    • 執行FLASHBACK TABLE ... TO BEFORE DROP語句,直到你要檢索表。

RENAME TO Clause

爲從回收站正在檢索的表,指定一個新的名稱。

 

4.Examples

FLASHBACK TABLE語句的用法主要分成兩大類:從撤銷數據中閃回和從回收站中閃回。其中從撤銷數據中閃回必須要啓用表的行移動,用戶要有SELECT ANY FLASHBACK系統權限。爲了查詢閃回事務,用戶要有SELECT ANY TRANSACTION系統對象權限。

使用DBA用戶給scott用戶

GRANT FLASHBACK ANY TABLE TO SCOTT;

GRANT SELECT ANY TRANSACTION TO SCOTT;

 

4.1.從撤銷數據中閃回表到之前某個時間點

使用下面的命令,啓用閃回列表中表的行移動:

ALTER  TABLE table_name ROW MOVEMENT

創建emp_test測試表

create table emp_test(
  emp_id number,
  emp_code varchar2(5),
  emp_name varchar2(10)
);

--插入數據

insert into emp_test values (1,'01','chiclewu');
insert into emp_test values (1,'02','china');

 

使用下面命令,啓用表的行移動:

ALTER TABLE emp_test ENABLE ROW MOVEMENT

 

需要DBA先授予 select any transaction系統權限給scott用戶,查詢閃回事務。

 

SQL> select ftq.start_scn, ftq.start_timestamp
  2    from flashback_transaction_query ftq
  3   where ftq.table_name = 'EMP_TEST';
 
 
 START_SCN   START_TIMESTAMP
----------               ---------------
   2701570         2013/11/21 22:53:56
   2701570         2013/11/21 22:53:56

 

發現閃回事務查詢視圖中,有兩條撤銷數據。現在更新員工代碼爲02的員工ID爲2,姓名修改爲“hello”:

SQL> update emp_test et
  2     set et.emp_id = 2, et.emp_name = 'hello'
  3   where et.emp_code = '02';
 
1 row updated
 
SQL> commit;
 
Commit complete

 

查詢員工表:

SQL> select * from emp_test;
 
    EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
         1 01       chiclewu
         2 02       hello

員工02的ID和姓名已經修改成功了,並且已經提交了數據。這時候發現修改錯了,想要恢復到之前的時間點的數據。可是我沒有設置還原點呀!怎麼恢復呢?不用擔心,使用剛纔學過的閃回表SCN或時間戳就能夠實現:

先查詢閃回事務表中的撤銷記錄:

SQL> select ftq.start_scn,
  2         ftq.start_timestamp
  3    from flashback_transaction_query ftq
  4   where ftq.table_name = 'EMP_TEST';
 
 
 START_SCN   START_TIMESTAMP
----------                ---------------
   2702778         2013/11/21 23:14:59
   2701570         2013/11/21 22:53:56
   2701570         2013/11/21 22:53:56

 

使用閃回表SCN恢復到插入數據之前的時間點:

flashback table emp_test to  scn 2701570;

查詢員工表:

SQL> select * from emp_test;
 
    EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------

沒有數據,說明恢復成功!

 

忽然又覺的不對,又想要恢復到插入數據之後,修改之前的時間點。

使用閃回表時間戳進行恢復:
flashback table emp_test to timestamp to_timestamp('2013/11/21 23:14:59','yyyy-mm-dd hh24:mi:ss');

 

查詢員工表:

 SQL> select * from emp_test;
 
    EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
         1 01       chiclewu
         1 02       china

 和插入後數據一樣,說明恢復成功!

 

4.2.從撤銷數據中閃回表到之前保存點

先設置還原點,用於的數據恢復。

create restore point respt;


刪除02員工信息,並提交到事務。

SQL> delete from emp_test t where t.emp_code='02';
 
1 row deleted
 
SQL> commit;
 
Commit complete

查詢員工表:

SQL> select * from emp_test;
 
    EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
         1 01       chiclewu

 

現在使用之前設置的還原點,恢復到還原點時的數據。


flashback table emp_test to restore point respt;

 

查詢員工表

SQL> select * from emp_test;
 
    EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
         1 01       chiclewu
         1 02       china

 

有02員工記錄,說明保存點閃回恢復成功。

 

4.3.從回收中恢復刪除之前的表

在回收站中只有DROP的對象的數據,沒有新增、更新的撤銷數據。因此,在回收中只能執行 FALSHBACK TABLE ... TO BEFORE DROP語句。

清空回收站:

pruge  recyclebin;

查詢回收站

SQL> select object_name, original_name from recyclebin;
 OBJECT_NAME  ORIGINAL_NAME
----------- --------------------------------

沒有任何記錄

 

首先DROP員工表。

drop table emp_test;

 

查詢員工表

 
SQL> select * from emp_test;
 
select * from emp_test
 
ORA-00942: 表或視圖不存在

說明表已經刪除了。

 

在查詢回收站

SQL> select object_name, original_name from recyclebin;
 
OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$67M/gFgFfovgQAB/AQADTw==$0 EMP_TEST

執行閃回刪除恢復:

flashback table "BIN$67M/gFgFfovgQAB/AQADTw==$0" to before drop; --系統生成名稱

flashback table EMP_TEST to before drop; --原始表名稱

 

查看員工表:

SQL> select * from emp_test;
 
    EMP_ID EMP_CODE EMP_NAME
---------- -------- ----------
         1 01       chiclewu
         1 02       china

表已經恢復了,數據也恢復了!

 

5.總結

FLASHBACK TABLE語句能恢復多長時間之前的數據呢?即撤銷數據能保留多長時間。

Oracle數據庫基於撤銷表空間是如何配置的,自動調整撤銷保留期限。

  • 撤銷表空間是自動擴展的,數據庫動態調整撤銷保留期限,略長於系統中運行時間最常的主動查詢
  • 撤銷表空間是固定大小,UNDO_RETENTION參數值會被忽略。數據庫動態調整一個最佳的保留期限。

UNDO_MANAGEMENT初始化參數,默認值爲AUTO,即自動撤銷管理。UNDO_RETENTION初始化參數,默認值爲900(相當於15分鐘)。

通過動態數據自定v$undostat,查看最近4天數據庫動態動態調整撤銷保留期限的值:

select begin_time, end_time, tuned_undoretention
  from v$undostat
 order by desc end_time;

 

 

 

參考Oracle官方文檔

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章