標籤:人工 外鍵 處理 禁用 alt 功能 資源回收筒 .net 個數
資源回收筒概念
從ORACLE 10g開始,引入了一個叫資源回收筒(Recycle Bin)的概念。它的全稱叫Tablespace Recycle Bin。資源回收筒實際是一個邏輯容器(邏輯地區),原理有點類似於WINDOW系統的資源回收筒。它以資料表空間中現有已經分配的空間為基礎,而不是從資料表空間上物理划出一個固定地區用作資源回收筒。這意味著資源回收筒和資料表空間中的對象共用儲存地區、系統沒有給資源回收筒預留空間。因此,當表被DROP後,如果可用空間充足,並且沒有對資源回收筒進行清理,那麼被DROP掉的對象會一直存在資源回收筒中,但是如果可用空間緊張的情況下,資料庫會根據先進先出的順序覆蓋Recycle Bin中的對象。所以資源回收筒機制也不是百分百的保險機制。另外從原理上來說它就是一個資料字典表,放置使用者Drop掉的資料庫物件資訊。使用者進行Drop操作的對象並沒有真正被資料庫刪除,仍然會佔用空間。除非是由於使用者手工進行Purge或者因為儲存空間不夠而被資料庫清掉。資料庫有了這樣的功能,能夠減少很多不必要的麻煩。當使用者、開發人員、甚至DBA誤操作刪除了表,那麼我們不必還原整個資料庫或資料表空間,直接使用ORACLE 10g的閃回(FLASHBACK,閃回)功能來還原被刪除的表。這樣我們就能避免大量的人工誤操作。這是一個對DBA相當有用的功能。
資源回收筒功能
資源回收筒這個特性主要的好處就是在誤刪除一個表時有一個恢複機制,不必通過資料庫還原來實現。避免大量的人工誤操作。以及資料庫還原等複雜的操作。讓資料庫的管理、維護更加簡單、方便。如果是SQL SERVER資料庫,就必須還原整個資料庫來找到被DROP掉的表。可見資源回收筒功能確實是一個開創性的功能。
管理資源回收筒
開啟、關閉資源回收筒
首先你可以通過命令查看資料庫是否開啟了資源回收筒機制, 如下所示 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啟用或禁用資源回收筒功能。當然也可以用命令關閉資源回收筒
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
查看資源回收筒對象
我們先來看看一個例子,如下所示,假如不小心誤操作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
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
RECYCLEBIN NAME的命名規則為BIN$GUID$Version 其中GUID為GlobalUID,是一個全域唯一、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;
2:對象的參考約束不會被恢複,指向該對象的外鍵約束需要重建。
3:對象能否恢複成功,取決於對象空間是否被覆蓋重用。
4:當刪除表時,依賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會放入recycle binzhong,因此當你執行flashback drop時,
並不能恢複依賴其的物化視圖。需要DBA手工重建。
5:對於資源回收筒(Recycle Bin)中的對象,只支援查詢。不支援任何其他DML、DDL等操作。
參考資料:
http://blog.csdn.net/tianlesoftware/article/details/4677378
ORACLE資源回收筒機制介紹