Oracle Flashback----flashback drop

        在Oracle 10g中,Flash back家族分爲以下成員:Flashback Database   |  Flashback Drop  |   Flashback Table         |  Flashback Query(Flashback Query,Flashback Version Query,Flashback Transaction Query)。

       閃回刪除表(dropped tables):
       語法:FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];
       Flashback Drop 是從Oracle 10g 開始出現的, 用於恢復用戶誤刪除的對象(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。這個功能和數據庫閃回沒有關係,和flashback參數沒有關係,表也不要求row movement.Flashback 不支持sys用戶. system表空間下的對象,也不能從回收站裏拿到。故使用SYS 或者SYSTEM用戶登陸時,show recyclebin 爲空。


       Flashback Drop 是從Oracle 10g 開始出現的, 用於恢復用戶誤刪除的對象(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。這個功能和數據庫閃回沒有關係,和flashback參數沒有關係,表也不要求row movement.Flashback 不支持sys用戶. system表空間下的對象,也不能從回收站裏拿到。故使用SYS 或者SYSTEM用戶登陸時,show recyclebin 爲空。


      Tablespace Recycle Bin
      從Oracle 10g 開始, 每個表空間都會有一個叫作回收站的邏輯區域,當用戶執行drop命令時, 被刪除的表和表的關聯對象( 包括索引, 約束,觸發器,LOB段,LOB index 段) 不會被物理刪除, 這些對象先轉移到回收站中,這就給用戶提供了一個恢復的可能。初始化參數recyclebin 用於控制是否啓用recyclebin功能,缺省是ON, 可以使用OFF關閉。

SQL> show user
USER is "SH"
SQL> 
SQL> set linesize 400
SQL> 
SQL> show parameter recyclebin

NAME                          TYPE                       VALUE
----------------------------- -------------------------- -----------------
recyclebin                    string                     on
SQL> 
     禁用與開始該功能可以使用下面SQL:

SQL> alter system set recyclebin=off;

System altered.

SQL> 
SQL> show parameter recyclebin

NAME                         TYPE                       VALUE
---------------------------- -------------------------- ------------------
recyclebin                   string                     OFF
SQL> 
SQL> 
SQL> alter system set recyclebin=on;                         

System altered.

SQL> 
           禁用後刪除的對象將直接刪除,不會寫到recyclebin中,當然在刪除時,指定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所佔用的空間來緩解空間壓力。 因爲索引是可以重建的。

      實驗開始:

     一:創建相關測試表

SQL> create table emp as select * from scott.emp;

Table created.

SQL> 
SQL> alter table emp add constraint EMP_PK primary key(empno);

Table altered.

SQL>  
SQL> select file_id,block_id,blocks from dba_extents where segment_name='EMP' and owner='SH'; 

   FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
         4         57          8

SQL> 
      

      二:刪除測試表,查看recyclebin內容

SQL> drop table emp;

Table dropped.

SQL> 
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP              BIN$ArIUf4D4N7ngUAoKiBsT3A==$0 TABLE        2014-09-10:15:34:19
SQL> 
SQL>
SQL> col segment_name format a50
SQL> col blocks format 99 
SQL> select segment_name,blocks from user_segments where segment_name='BIN$ArIUf4D4N7ngUAoKiBsT3A==$0';

SEGMENT_NAME                                       BLOCKS
-------------------------------------------------- ------
BIN$ArIUf4D4N7ngUAoKiBsT3A==$0                          8

SQL> 
           可以看到,“回收站”已經有表信息了。

      三:查看原來表佔的數據文件

SQL> col TABLESPACE_NAME format a40
SQL> col FILE_ID format 99
SQL> col BLOCK_ID format 99
SQL> col BYTES format 999999
SQL> col BLOCKS format 99
SQL> col RELATIVE_FNO format 99
SQL> 
SQL> select * from dba_free_space where file_id=4 and block_id=57;

TABLESPACE_NAME                          FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
---------------------------------------- ------- -------- ------- ------ ------------
USERS                                          4       57   65536      8            4

SQL> 
            通過dba_free_space視圖,可以到原來的數據文件塊已經清空數據了

       四:閃回刪除表

SQL> flashback table emp to before drop;

Flashback complete.                                                                                                                      NUMBER(2)

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> 
       表是回來,但是查詢剛纔的索引,發現索引也回來了,但是索引的名稱改變了。

SQL> select index_name from user_indexes where table_name='EMP';

INDEX_NAME
------------------------------------------------------------------------------------------
BIN$ArIUf4D3N7ngUAoKiBsT3A==$0

SQL> 
SQL> alter index "BIN$ArIUf4D3N7ngUAoKiBsT3A==$0" rename to "EMP_PK_";

Index altered.

SQL> 
             追求完美的我們,還是把索引名稱改回來吧!

        問題1:如果這個時候emp表,已經有其他表佔用“emp”的表名了,怎麼辦?

flashback table T to before drop rename to T2;
        那只有改名了,在閃回的時候。附上一些常用語法給大家

SQL> purge index idx_t;  --清除某個索引所佔用的空間
SQL> purge tablespace users; --清除回收站裏屬於users表空間的對象所佔用的空間
SQL> purge user_recyclebin; --清除回收站裏屬於當前用戶的所有對象所佔用的空間
SQL> purge dba_recyclebin;  --清除回收站裏所有的對象所佔用的空間

       

     


             




       

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