Oracle Flashback之Flashback table和flashback drop

來源:互聯網
上載者:User

在Oracle 10g中, Flash back家族分為以下成員:
Flashback Database
Flashback Drop
Flashback Table
Flashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query)
下面介紹一下Flashback Drop 和 Flashback Table

                            Flashback DROP

Flashback Drop 是從Oracle 10g 開始出現的, 用於恢複使用者誤刪除的對象(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(資料表空間資源回收筒),這個功能和windows的資源回收筒非常類似。
這個功能和資料庫閃回沒有關係,和flashback參數沒有關係,表也不要求row movement.
經過測試SQL> alter database flashback off 能夠閃回drop掉的表.
Flashback 不支援sys使用者. system資料表空間下的對象,也不能從資源回收筒裡拿到。故使用SYS 或者SYSTEM使用者登陸時, show recyclebin 為空白。
1. Tablespace Recycle Bin
從Oracle 10g 開始, 每個資料表空間都會有一個叫作資源回收筒的邏輯地區,當使用者執行drop命令時, 被刪除的表和表的關聯對象( 包括索引, 約束,觸發器,LOB段,LOB index 段) 不會被物理刪除, 這些對象先轉移到資源回收筒中,這就給使用者提供了一個恢複的可能。
初始化參數recyclebin 用於控制是否啟用recyclebin功能,預設是ON, 可以使用OFF關閉。
SQL> show parameter recycle
recyclebin                    string      on

禁用該功能:
SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;
SQL> alter session set recyclebin=off;
SQL> alter session set recyclebin=on;
禁用後刪除的對象將直接刪除,不會寫到Recycle中,當然在刪除時,指定purge 參數,表也將直接刪除,不會寫到recyclebin中。

資料表空間的Recycle Bin 地區只是一個邏輯地區,而不是從資料表空間上物理的划出一塊地區固定用於資源回收筒,因此Recycle Bin是和普通對象共用資料表空間的儲存地區,或者說是Recycle Bin的對象要和普通對象搶奪儲存空間。當發生空間不夠時,Oracle會按照先入先出的順序覆蓋Recycle Bin中的對象。也可以手動的刪除Recycle Bin佔用的空間。

1). Purge tablespace tablespace_name : 用於清空資料表空間的Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定資料表空間的Recycle Bin中指定使用者的對象
3). Purge recyclebin: 刪除目前使用者的Recycle Bin中的對象
4). Purge dba_recyclebin: 刪除所有使用者的Recycle Bin中的對象,該命令要sysdba許可權
5). Drop table table_name purge:  刪除對象並且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢複。
6). Purge index recycle_bin_object_name: 當想釋放Recycle bin的空間,又想能恢複表時,可以通過釋放該對象的index所佔用的空間來緩解空間壓力。 因為索引是可以重建的。

2. Flashback Drop 執行個體操作

下面在系統參數recyclebin=on的時候操作:
1,SQL> drop table test1;
Table dropped.

2,查看recyclebin的資訊
SQL> col origninal_name format a15;
SQL> col type format a15;
SQL> select object_name,original_name,type from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------
BIN$fR5G/49+SZ2oESrTX4UCHg==$0 IDX_TESTID                       INDEX
BIN$x1Ey4hTFSeilywuQ7KKM+w==$0 TEST1                            TABLE
SQL> show recyclebin; --注意這是sqlplus的命令
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1            BIN$x1Ey4hTFSeilywuQ7KKM+w==$0 TABLE        2012-01-13:16:35:24

3,將刪除的表閃回
SQL> flashback table test1 to before drop;
Flashback complete.
SQL> select * from test1;
        ID NAME
---------- ----------
   3763392 A

如果出現這樣的情況,表test1刪除後,一個同名的對象test1(表或者procedure..)被建立,閃回的時候需要重新命名
flashback table test1 to before drop rename to testX
還有一種情況是;同名的表被多次drop到了recyclebin中,這時候遵循後進先出的原則.
一旦完成閃回恢複,Recycle Bin中的對象就消失了.
SQL> select object_name,original_name,type from user_recyclebin;
no rows selected

在recyclebin被設定為off後不支援flashbacktable drop.
SQL> alter system set recyclebin=off;
System altered.
SQL> drop table test1;
Table dropped.
SQL> select object_name,original_name,type from user_recyclebin;
no rows selected

Flashback Drop 需要注意的地方:
1). 只能用於非系統資料表空間和本地管理的資料表空間
2). 對象的參考約束不會被恢複,指向該對象的外鍵約束需要重建。
3). 對象能否恢複成功,取決與對象空間是否被覆蓋重用。
4). 當刪除表時,信賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢複依賴其的物化視圖,需要dba 手工介入重新建立。
5). 對於Recycle Bin中的對象,只支援查詢.

                    Flashback Table

注意SYS使用者不支援閃回,這點前面已經說明過。
Flashback Table也是使用UNDO tablespace的內容來實現對資料的回退。該命令相對簡單,輸入:flashback table table_name to scn(to timestamp) 即可。
注意:如果想要對錶進行flashback,必須允許表的row movement.
Alter table table_name row movement;
要查看某表是否啟用row movement,可以到user_tables 中查詢(或all_tables,dba_tables),
例如:
SQL> select row_movement from user_tables where table_name='TEST1';
ROW_MOVE
--------
DISABLED
這時候為不支援行移動.

SQL> select current_scn from v$database;
CURRENT_SCN
-----------
    3769840
SQL> delete from test1;
1 row deleted.
SQL> commit;
Commit complete.
SQL> flashback table test1 to scn  3769840;
flashback table test1 to scn  3769840
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
這時候因為不支援行移動,出現上面的錯誤.
SQL> alter table test1 enable row movement;
Table altered.
SQL> flashback table test1 to scn  3769840;
Flashback complete.
SQL> select * from test1;
        ID
----------
         1
Flashback table 命令支援同時操作多個表,表名中間以逗號分隔即可,如果你執行一條flashback table命令時同時指定了多個表,要記住單個flashback table 是在同一個事務中,因此這些表的恢複操作要麼都成功,要麼都失敗。
如:flashback table a,b ,c to scn 1103864;

FLASHBACK TABLE HOUDINI TO 閃回到某一個時間點的樣本:FLASHBACK TABLE test1 TO TIMESTAMP TO_TIMESTAMP('2012-01-16 13:15:08.232349','YYYY-MM-DD HH24:MI:SS:FF')
Oracle還支援在操作之前建立一個'RESTORE POINT',標誌一個復原點,然後用於以後的falshback.
CREATE RESTORE POINT rp_acct_01;
FLASHBACK TABLE HOUDINI TO RESTORE POINT rp_acct_01;

DROP RESTORE POINT rp_acct_01;

基於undo 的表恢複,需要注意DDL 操作的影響

比如 truncate table 後不能flashback table,會發生錯誤:ORA-01466:unable to read data -table definition has changed.
其他動作包括:drop/modify 列, move 表, drop 分區(如果有的話), truncate table/partition,這些操作會另undo 資料表空間中的撤銷資料失效,對於執行過這些操作的表應用flashback query 會觸發ORA-01466 錯誤。另外一些表結構修改語句雖然並不會影響到undo 資料表空間中的撤銷記錄,但有可能因表結構修改導致undo 中重做記錄無法應用的情況,比如對於增加了約束,而flashback query 查詢出的undo 記錄已經不符合建立的約束條件,這個時候直接恢複顯然不可能成功,你要麼暫時disable
約束,要麼通過適當邏輯,對要恢複的資料進行處理之後,再執行恢複。
另外,flashback query 對v$tables,x$tables 等動態效能檢視無效,不過對於dba_*,all_*,user_*等資料字典是有效。同時該特性也完全支援訪問遠端資料庫,比如select * from tbl@dblink as of scn 360;的形式。
2. 基於undo 的表恢複,flashback table 實際上做的也是dml 操作(會在被操作的表上加dml 鎖),因此還需要注意triggers 對其的影響,預設情況下,flashback table to scn/timestamp 在執行時會自動disable 掉與其動作表相差的triggers,如果你希望在此期間trigger 能夠繼續發揮做用,可以在flashback table 後附加
ENABLE TRIGGERS 子句。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.