ORACLE回收站機制介紹

回收站概念 數據庫

從ORACLE 10g開始,引入了一個叫回收站(Recycle Bin)的概念。它的全稱叫Tablespace Recycle Bin。回收站實際是一個邏輯容器(邏輯區域),原理有點相似於WINDOW系統的回收站。它以表空間中現有已經分配的空間爲基礎,而不是從表空間上物理劃出一個固定區域用做回收站。這意味着回收站和表空間中的對象共用存儲區域、系統沒有給回收站預留空間。所以,當表被DROP後,若是可用空間充足,而且沒有對回收站進行清理,那麼被DROP掉的對象會一直存在回收站中,可是若是可用空間緊張的狀況下,數據庫會根據先進先出的順序覆蓋Recycle Bin中的對象。因此回收站機制也不是百分百的保險機制。另外從原理上來講它就是一個數據字典表,放置用戶Drop掉的數據庫對象信息。用戶進行Drop操做的對象並無真正被數據庫刪除,仍然會佔用空間。除非是因爲用戶手工進行Purge或者由於存儲空間不夠而被數據庫清掉。數據庫有了這樣的功能,可以減小不少沒必要要的麻煩。當用戶、開發人員、甚至DBA誤操做刪除了表,那麼咱們沒必要還原整個數據庫或表空間,直接使用ORACLE 10g的閃回(FLASHBACK,閃回)功能來還原被刪除的表。這樣咱們就能避免大量的人工誤操做。這是一個對DBA至關有用的功能。 app

 

回收站功能 spa

回收站這個特性主要的好處就是在誤刪除一個表時有一個恢復機制,沒必要經過數據庫還原來實現。避免大量的人工誤操做。以及數據庫還原等複雜的操做。讓數據庫的管理、維護更加簡單、方便。若是是SQL SERVER數據庫,就必須還原整個數據庫來找到被DROP掉的表。可見回收站功能確實是一個開創性的功能。 .net

 

管理回收站 3d

開啓、關閉回收站 code

首先你能夠經過命令查看數據庫是否開啓了回收站機制, 以下所示 VALUE= ON表示開啓了回收站機制。OFF則表示回收站機制關閉。對象

SQL> SHOW PARAMETER RECYCLEBIN;
 
NAME              TYPE        VALUE
--------     ----------- ----------
recyclebin      string         ON
 
 
SQL> SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='recyclebin';
 
NAME                      VALUE
----------------- --------------------
recyclebin                  on

能夠經過設置初始化參數recyclebin啓用或禁用回收站功能。固然也能夠用命令關閉回收站blog

SQL> ALTER SYSTEM SET RECYCLEBIN=OFF;
 
System altered.
 
SQL> ALTER SESSION SET RECYCLEBIN=OFF;
 
Session altered.
 
SQL> SHOW PARAMETER RECYCLEBIN;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      OFF

能夠用命令開啓回收站索引

SQL> ALTER SYSTEM SET RECYCLEBIN=ON;
 
System altered.
 
SQL> ALTER SESSION SET RECYCLEBIN =ON;
 
Session altered.
 
SQL> SHOW PARAMETER RECYCLEBIN;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      ON

 

查看回收站對象 ip

咱們先來看看一個例子,以下所示,假如不當心誤操做DROP了表test,那麼咱們如何在回收站查看被DROP的表對象呢?

SQL> show user
USER is "ODS"
 
SQL> create table test(name varchar2(16));
 
Table created.
 
SQL> insert into test select 'kerry' from dual;
 
1 row created.
 
SQL> insert into test select 'ken' from dual;
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
SQL> drop table test;
 
Table dropped.

SQL 1:

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vltN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:11:25:38

SQL 2: 其中RECYCLEBIN是USER_RECYCLEBIN 的同義詞。

COL OBJECT_NAME FOR A30
COL ORIGINAL_NAME FOR A8
COL OPERATION FOR A9
COL TYPE FOR A8
COL DROPTIME FOR A19
COL TS_NAME FOR A30
SELECT OBJECT_NAME 
          ,ORIGINAL_NAME
          ,OPERATION
          ,TYPE
          ,DROPTIME
          ,TS_NAME
FROM RECYCLEBIN;
 
 
--查看數據庫當前用戶的回收站對象
 
SQL> SELECT * FROM RECYCLEBIN

clip_image001

SQL 3:

--查看數據庫當前用戶的回收站對象

SQL> SELECT * FROM USER_RECYCLEBIN;

SQL 4: 須要相關權限才能查詢。

--查看數據庫回收站全部對象

SQL> SELECT * FROM DBA_RECYCLEBIN;

爲了不被刪除的表與同類對象名稱的重複,被刪除的表以及相依的對象放到回收站後,ORACLE數據庫會對被刪除的對象名稱進行重命名,例如表TEST表

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vltN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:11:25:38

咱們又建立了表TEST,而後刪除了該表TEST,以下所示,雖然ORIGINAL_NAME一致,可是RECYCLEBIN NAME則有所不一樣。

SQL> create table test(name varchar2(16));
 
Table created.
 
SQL> drop table test;
 
Table dropped.
 
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vluN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:14:40:52
TEST             BIN$BLmi9vltN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:11:25:38

clip_image002

RECYCLEBIN NAME的命名規則爲BIN$GUID$Version 其中GUID爲GlobalUID,是一個全局惟1、24個字符長的標識對象,它是ORACLE內部使用的標識。 其中$version是ORACLE數據庫分配的版本號。

 

還原回收站對象

還原回收站被刪除的表、索引等對象, 是經過Flashback Drop實現的。以下所示。

SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
 
Flashback complete.
 
 
SQL> SELECT * FROM TEST;
 
NAME
----------------
kerry
ken

可是若是出現上面兩個TEST表都被刪除時,此時的Flashback Drop就有點意思了

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vlxN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:25
TEST             BIN$BLmi9vlwN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:09
SQL> flashback table test to before drop;
 
Flashback complete.
 
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vlwN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:09
 
SQL> select * from test;
 
no rows selected

如上所示,若是兩個相同名字的表TEST被刪除了,此時閃回被DROP的表TEST,實質是閃回最後一個被刪除的表(後進先出原則),若是此時繼續閃回操做就會報ORA-38312錯誤

 
SQL> flashback table test to before drop;
flashback table test to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object

此時能夠在閃回過程當中對錶名進行重命名解決問題。。

SQL> flashback table test to before drop rename to test_2;
 
Flashback complete.
 
SQL> select * from test_2;
 
NAME
----------------
kerry
ken

另外,若是回收站有兩個被DROP掉的表TEST, 若是想閃回第一個被刪除的表,那該怎麼辦呢?

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vlxN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:25
TEST             BIN$BLmi9vlwN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:09

其實這個也很好處理,直接指定RECYCLEBIN NAME進行閃回便可。

SQL> flashback table "BIN$BLmi9vlwN3TgUKjAgYxoiA==$0" to before drop;

 

清空回收站

數據庫對象刪除後,數據庫會把它重命名爲BIN$開頭的對象,你能夠經過ORIGINAL_NAME查看它對應的原始對象名稱。記住,將表放在回收站裏並不在原始表空間中釋放空間。若是您但願徹底刪除該表,而不讓該表放入回收站,可使用如下命令永久刪除該表。固然這樣操做後,你也不能經過使用閃回特性閃回該表了。

DROP TABLE TABLE_NAME PURGE;

若是數據庫中刪除表時都放入回收站,於是沒有釋放所佔空間,那麼當空閒的空間不足時,已經刪除的表是否還會侵佔存儲空間呢?

答案很簡單:當表空間被回收站數據徹底佔滿,以致於必須擴展數據文件來容納更多數據時,能夠說表空間處於「空間壓力」狀況下。此時,對象以先進先出的方式從回收站中自動清除。在刪除表以前,相關對象(如索引)被刪除。

一樣,空間壓力可能由特定表空間定義的用戶限額而引發。表空間可能有足夠的空餘空間,但用戶可能將其在該表空間中所分配的部分用完了。在這種狀況下,Oracle 自動清除該表空間中屬於該用戶的對象。

此外,有幾種方法能夠手動控制回收站。若是在刪除名爲 TEST 的特定表以後須要從回收站中清除它,能夠執行

PURGE TABLE TABLE_NAME;

或者使用其回收站中的名稱:

PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";

此命令將從回收站中刪除表 TEST 及全部相關對象,如索引、約束等,從而節省了空間。可是,若是要從回收站中永久刪除索引,則可使用如下命令來完成工做:

PURGE INDEX IN_TEST1_O1;

此命令將僅僅刪除索引,而將表的拷貝留在回收站中。有時在更高級別上進行清除可能會有用。例如,您可能但願清除表空間 USERS 的回收站中的全部對象。能夠執行:

PURGE TABLESPACE USERS;

您也許但願只爲該表空間中特定用戶清空回收站。在數據倉庫類型的環境中,用戶建立和刪除許多臨時表,此時這種方法可能會有用。您能夠更改上述命令,限定只清除特定的用戶:

PURGE TABLESPACE USERS USER SCOTT;

要釋放整個回收站佔用的空間,您須要使用如下命令清空回收站:

PURGE RECYCLEBIN;

記住PURGE RECYCLEBIN只是清除當前用戶回收站中的對象,DBA_RECYCLEBIN下的的對象並無刪除,若是你要清除當前數據庫回收站的對象,必須使用下面命令(DBA權限)

PURGE DBA_RECYCLEBIN

 

Flashback Drop注意事項

1:只能用於非系統表空間和本地管理的表空間。

以下所示,在系統表空間中,表對象刪除後就真的從系統中刪除了,而不是存放在回收站中。

SQL> show user
USER is "SYS"
SQL> create table test(name varchar2(12));
 
Table created.
 
SQL> drop table test;
 
Table dropped.
 
SQL> show recyclebin;

clip_image003

2:對象的參考約束不會被恢復,指向該對象的外鍵約束須要重建。

3:對象可否恢復成功,取決於對象空間是否被覆蓋重用。

4:當刪除表時,依賴於該表的物化視圖也會同時刪除,可是因爲物化視圖並不會放入recycle binzhong,所以當你執行flashback drop時,

並不能恢復依賴其的物化視圖。須要DBA手工重建。

5:對於回收站(Recycle Bin)中的對象,只支持查詢。不支持任何其餘DML、DDL等操做。

 

參考資料:

http://blog.csdn.net/tianlesoftware/article/details/4677378

相關文章
相關標籤/搜索