【新炬網路名師大講堂】Oracle中的回收站(Recycle Bin)

shsnchyw發表於2014-12-17
什麼是Recycle Bin
回收站(Recycle Bin)實際上是包含刪除物件資訊的資料字典表。刪除表和其他相關物件,比如索引、約束和巢狀表,實際上沒有被真的刪除,還是繼續佔用空間。直到被從回收站中purged出去,才能從資料庫釋放相關的表空間的空間。
每個使用者可以擁有自己的回收站,當然除非使用者擁有SYSDBA許可權,否則預設都只可以訪問使用者所屬的回收站。
可以透過下列語句,檢視在回收站中自己的物件:
select * from recyclebin;
特別需要注意的是:在sys下drop的表是不記錄recyclebin的。


閃回刪除和回收站的關係

使用Flashback Table命令,可以在無需使用時間點恢復的情況下,還原drop table語句的結果。
由初始化引數REECYCLEBIN用於控制閃回刪除功能是開啟(on)還是關閉(off)。如果是off,則刪除的表不會進入回收站。如果是on,則刪除的表將進入回收站,並且可能可以恢復(取決於是否還被保留)。預設情況下,不管10g和11g中。RECYCLEBIN設定為ON。

如果不啟用回收站,則刪除表時,與該表及其從屬物件關聯的空間會立即變為可回收。
如果啟用了回收站,則刪除表時,與該表及其從屬物件管理的空間不會立即變為可回收。即使該空間確實顯示在dba_free_space中。相反,會在回收站中引用刪除的物件,這些物件仍屬於其各自的所有者。在空間不緊張時,絕不會把回收站物件使用的快樂自動回收。從而可以儘可能長的期限內恢復回收站的物件。

 

回收站中物件的命名
將刪除的表“移動”到回收站時,將使用系統生成的名稱對該表機器關聯物件和約束條件進行重新命名。
這樣做的好處是避免以下情況:
使用者刪除表後,又用相同的名重建,又再刪除。
兩個使用者使用相同的表名,但又都刪除這些表。
重新命名慣例如下:BIN$unique_id$version。
其中unique_id是該物件的全域性唯一識別符號,包含26個字元,用於在所有資料庫之間的唯一的標識回收站名稱。
而version是資料庫分配的版本號。

 

回收站:自動回收空間

只要回收站物件使用的空間沒有被回收,就可以使用閃回刪除功能恢復這些物件。
下面是回收站物件的回收策略:
顯式發出purge命令時執行手動清理
空間不足時執行自動清除:物件在回收站中時,DBA_FREE_SPACE也會報告其對應的空間,因為這些空間是可以自動回收的。然後按以下順序使用特定表空間中的空閒空間:
1.與回收站物件不對應的空閒空間
2.與回收站物件對應的空閒空間。在這種情況下,將使用先進先出(FIFO)演算法自動將回收站物件從回收站清理
3.自動分配的空閒空間。

 

回收站管理

啟停回收站
停用回收站
ALTER SESSION SET recyclebin = OFF;
ALTER SYSTEM SET recyclebin = OFF SCOPE = SPFILE;
啟用回收站
ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM SET recyclebin = ON SCOPE = SPFILE;
注意:上述操作都需要重啟資料庫生效。

 

檢視和查詢回收站中的物件
試圖 描述
USER_RECYCLEBIN 使用者檢視回收站中自身刪除的物件,也可用透過同義詞recyclebin檢視。
DBA_RECYCLEBIN 管理員檢視回收站中所有的刪除物件。

 

檢視回收站中中的物件
select original_name, object_name, ts_name, droptime from dba_recyclebin
SQL> show recyclebin  –不顯示索引
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
—————- —————————— ———— ——————-
PP               BIN$9dV9fqwIE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:30:15
PP               BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:16:25
PP               BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 TABLE        2014-03-30:23:21:34
查詢回收站中的物件,但是必須要用”"指定正確回收站中的物件名
SQL> select * from “BIN$9dV9fqwGE+TgQwEAAH/i4w==$0″;

 

回收站:手動回收空間
使用PURGE命令可從回收站中永久地刪除物件。從回收站中清除某個物件時,會從資料庫中永久地刪除該物件及其從屬物件。因此,將無法再使用閃回刪除功能恢復從回收站中清除的物件。
下面是可能使用的一些PURGE命令:
清除指定表和索引
PURGE {TABLE |INDEX }
示範:
purge table ”BIN$9dV9fqwGE+TgQwEAAH/i4w==$0″;
purge table table_name;
purge index index_name;
清除駐留在指定表空間中的所有物件(也可能清楚從屬、駐留在其它表空間中的物件)
PURGE TABLESPACE [USER ]
示範:
purge tablespace test;
purge tablespace test user z;
清除屬於當前使用者的所有物件或者清除所有物件(dba_recyclenbin,必須具有足夠的系統許可權或者sysdba許可權)
PURGE [USER_|DBA_]RECYCLEBIN

 

不使用回收站
drop table [purge];
表空間中的物件不會移到回收站中,且回收站中所屬該表空間的物件也會被清理。
drop tablespace [including contents]
從資料庫中永久地刪除該使用者及其擁有的所有物件。且回收站中所屬的已刪除使用者的所有物件都將被清理。
drop user [cascade]

 

從回收站回覆表
使用flashback table…to before drop語句從回收站恢復物件。你可以指點回收站中的物件名,也可以指定原始表名。
rename to子句選項可以使恢復的時候重新命名。
語法:
FLASHBACK TABLE TO BEFORE DROP
[RENAME TO ];
示範:
在恢復前,先查詢,所需要的資訊
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
—————- —————————— ———— ——————-
PP               BIN$9dV9fqwIE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:30:15
PP               BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 TABLE        2014-03-31:00:16:25
PP               BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 TABLE        2014-03-30:23:21:34
或者
SQL> select object_name, original_name, createtime from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    CREATETIME
—————————— ——————————– ——————-
BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 PP                               2014-03-31:00:16:19
BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 PP                               2014-03-30:23:21:28
BIN$9dV9fqwIE+TgQwEAAH/i4w==$0 PP                               2014-03-31:00:30:13
使用如下命令恢復表:
flashback table pp to before drop rename to zzz;
SQL> select object_name, original_name, createtime from recyclebin;OBJECT_NAME                    ORIGINAL_NAME                    CREATETIME
—————————— ——————————– ——————-
BIN$9dV9fqwHE+TgQwEAAH/i4w==$0 PP                               2014-03-31:00:16:19
BIN$9dV9fqwGE+TgQwEAAH/i4w==$0 PP                               2014-03-30:23:21:28
我們可以看出,恢復的表是最後被刪除的,但是這個表不是我們實際需要的,怎麼辦?
還可以使用回收站中的物件名:
flashback table “BIN$9dV9fqwGE+TgQwEAAH/i4w==$0″ to before drop;

 

恢復依賴物件
注意:恢復刪除的表時,恢復的索引、觸發器和約束條件將保留各自的回收站名稱。因此,建議在閃回刪除表前查詢回收站和DBA_CONSTRAINTS。
1、在閃回之前,必須要先查詢好表的相關資訊
SQL>  select object_name, original_name, createtime from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    CREATETIME
—————————— ——————————– ——————-
BIN$9daqMpoEFoLgQwEAAH/mBQ==$0 IDX_PPP_02                       2014-03-31:00:45:01
BIN$9daqMpoFFoLgQwEAAH/mBQ==$0 IDX_PPP_01                       2014-03-31:00:45:14
BIN$9daqMpoGFoLgQwEAAH/mBQ==$0 PP                               2014-03-31:00:44:32
2、恢復表
SQL> flashback table pp to before drop;
3、查詢在回收站中恢復表對應關聯物件
SQL> select index_name from user_indexes where table_name=’PP’;
INDEX_NAME
——————————
BIN$9daqMpoFFoLgQwEAAH/mBQ==$0
BIN$9daqMpoEFoLgQwEAAH/mBQ==$0
4、重新命名到正確的物件名
alter index “BIN$9daqMpoFFoLgQwEAAH/mBQ==$0″ rename to IDX_PPP_01;
alter index “BIN$9daqMpoEFoLgQwEAAH/mBQ==$0″ rename to IDX_PPP_02;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29960155/viewspace-1371315/,如需轉載,請註明出處,否則將追究法律責任。

相關文章