Oracle Flashback之flashback table

原文自:點擊打開鏈接http://blog.csdn.net/waterxcfg304/article/details/8473711

一,Flashback Table功能描述
將數據表恢復到之前的一個時間點或SCN號。
注意:該功能將改變當前表及附屬對象統一閃回到之前的一個狀態。

二,需要修改的系統參數
undo_management,參數需要是“AUTO”,保證回滾段使用模式是SMU mode
undo_retention,單位是秒,調整可回滾的時間範圍
確認系統的相關參數

三,原理
閃回表(Flashback table)與閃回查詢(Flashback query)的原理大致相同,也是利用undo信息來恢復表對象到以前的某一個時間點(一個快照),因此也要確

保AUM(automatic undo management)有足夠的Retention值。Flashback  table技術是以Undo segment中的內容爲基礎的, 因此受限於UNDO_RETENTON參數。要

使用flashback 的特性,必須啓用自動撤銷管理表空間。

但閃回表不等於閃回查詢,其區別如下:
閃回查詢只是查詢以前的一個快照而已,並不改變當前表的狀態。
閃回表則是將恢復當前表及附屬對象一起回到以前的時間點。

四,特性:
1.  在線操作
2.  恢復到指定的時間點(或者SCN)的任何數據
3.  自動恢復相關屬性
4.  滿足分佈式的一致性
5.  數據的一致性,所有相關對象將自動一致。

五,語法:
 SQL> flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss');
 SQL> flashback table flashback_table_test to scn 662421;
 SQL> flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

六,運用閃回表前提
  1,普通用戶中需要有Flashback any table的系統權限。命令如:
  2.,有該表的select、insert、delete、alter權限。
  3,必須保證該表有row movement(行移動)。

七,下面是具體的實驗:
SQL> show parameter undo

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


 1.創建flashback_table_test表
SQL> conn hr/hr
Connected.
SQL> create table flashback_table_test as select * from employees;

Table created.

2.查詢flashback_table_test表中數據量
SQL> select count(*) from flashback_table_test;

  COUNT(*)
----------
       107

3.爲flashback_table_test表創建索引和觸發器(觸發器爲null,不做任何操作)
SQL>create index ind_test on flashback_table_test(employee_id);

SQL> create or replace trigger tr_test
after update on flashback_table_test
for each row
begin
       null;
end 
tr_test;
/

Trigger created


4.記錄當時的時間點,試圖恢復到該時間點
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;

TIME                                   SCN
-------------------------------------- --------------------------------------------------------------------------------
2012-12-29 16:44:17                    662421


oracle 10g可以通過下面得到SCN。
SQL> SELECT current_scn from v$database;

CURRENT_SCN
-----------
     662403


5.刪除flashback_table_test表中數據
SQL> delete from flashback_table_test;

107 rows deleted.


SQL> commit;

Commit complete.


6.查詢刪除數據後的flashback_table_test,確定其表中已沒有數據
SQL> select count(*) from flashback_table_test;

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


7.刪除flashback_table_test表中索引ind_test

SQL> drop index ind_test;

Index dropped

8.更改tr_test觸發器

SQL> create or replace trigger tr_test
after insert on flashback_table_test
for each row
begin
       null;
end 
tr_test;
/

Trigger created

9.確保該表中的行遷移(row movement)功能

SQL> alter table flashback_table_test enable row movement;

Table altered

10.恢復flashback_table_test表到剛記錄的時間點(或scn),由於表中存在觸發器,因此使用了關鍵字enable triggers;
SQL>  flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

Flashback complete.


11.查看恢復結果如下:(數據回來了)
SQL> select count(*) from flashback_table_test;

  COUNT(*)
----------
       107

但是索引沒有回來
SQL> select index_name from user_indexes where table_name = 'flashback_table_test';

INDEX_NAME

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

SQL>  select object_name, status from user_objects where object_name in('TR_TEST', 'IND_TEST');

OBJECT_NAME                    STATUS
------------------------------ --------------
TR_TEST                        VALID


SQL> set pages 0
SQL> set line 100
SQL> set long 2000
SQL> select text from user_source t where t.name = 'TR_TEST';
trigger tr_test
after insert on flashback_table_test
for each row
begin
       null;
end
tr_test;

7 rows selected.


總結:

1. Flashback table在真正的高可用環境中,使用意義不大,受限比較多,要必須確保行遷移功能
2. Flashback table過程中,阻止寫操作
3. 使用flashback table可以將delete方式刪除的表閃回到之前某個時間點,而表中索引卻不能正常恢復,因爲drop索引的過程是不記錄undo的。
4. 恢復的觸發器本身還是修改後的,並不隨表flashback到修改以前的時間點。說明關鍵字enable triggers只能保證觸發器的狀態正常,而不是內容回滾.
5. 由於原理利用其undo信息,來恢復其對象,因此也是不能恢復truncate數據
6. 恢復數據用flashback query實現比較好
7,flashback table功能不能夠將被truncate的表內容恢復出來,原因也是truncate操作過程是不記錄undo信息。

其他注意:
1.當閃回刪除操作之前,如果某個鍵值如主鍵被重用,將導致違反主鍵約束,閃回失敗。
2.若閃回所需要的UNDO信息不存在,將引發ORA-08180:no snapshot found based on specified time(未找到基於指定時間的快照)錯誤
3.如果受閃回影響的記錄被其它用戶鎖定,將引發ORA-00054:resource busy and acquire with NOWAIT specified (資源忙碌)錯誤
4.表定義在閃回期間不能發生變化,否則導致ORA-01466:unable to read data - table definition has changed(表定義已變化)錯誤
5.閃回前未啓用row movement,將收到ORA-08189: cannot flashback the table because row movement is not enabled 錯誤
6.對於存在參照關係的情況,建議將主表等一起實施閃回,否則,將收到ORA-02091: transaction rolled back,ORA-02291錯誤
7.SYS 模式中的表不能使用表閃回技術


發佈了103 篇原創文章 · 獲贊 8 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章