您好,登錄后才能下訂單哦!
做個小試驗:
SQL> conn ning/ning
已連接。
SQL> drop table test;
表已刪除。
SQL> drop table test.test;
表已刪除。
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$xJlIkIFVR/yau1Qb8ocxxQ==$0 TEST
SQL> con test/test
已連接。
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$1PKEiRExRN2g3tqEEWLfyw==$0 TEST
以下幾種drop不會將相關對象放進RecycleBin:
以下幾種drop不會將相關對象放進RecycleBin:
drop tablespace:會將RecycleBin中所有屬于該tablespace的對象清除
drop user:會將RecycleBin中所有屬于該用戶的對象清除
drop cluster:會將RecycleBin中所有屬于該cluster的成員對象清除
drop type:會將RecycleBin中所有依賴該type的對象清除
RecycleBin中的對象會被系統自動按照規則重命名,這是為了防止命名沖突。命名格式為:BIN$unique_id$version
其中unique_id是26個字符的對象唯一標識,version則是對象在數據庫中的版本號。
SQL> create table t(id int);
表已創建。
SQL> drop table t;
表已刪除。
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T
SQL> create table t(id int);
表已創建。
SQL> drop table t;
表已刪除。
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T
BIN$pc+kkUM7QjuQeCDGtwlzgQ==$0 T
可以看到,刪除table t后,重建一個名為t的table,再次刪除,其unique_id是不一樣的。
這時,做一個還原看看:
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T
這里,Oracle選擇了最后一次刪除的T表還原。
再次刪除:
SQL> drop table t;
表已刪除。
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$4bNgZiMGTA63iwA5xflh6A==$0 T
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T
可以看到unique_id又變了。所以,通過這種命名方式,避免了對于刪除table后又重建了同名table的情況可能造成的命名沖突。
2.如何啟用/禁用RecycleBin
通過設置初始化參數recyclebin,可以控制是否啟用回收站功能,默認是開啟的。
SQL> alter system set recyclebin=off;
系統已更改。
SQL> alter system set recyclebin=on;
系統已更改。
SQL> alter session set recyclebin=off;
會話已更改。
SQL> alter session set recyclebin=on;
會話已更改。
3.如何查看RecycleBin中的信息
前面已經提到,用戶可以通過查詢recyclebin來查看屬于自己的被drop的對象。
SQL> select object_name,object_type from dba_objects where object_name='RECYCLEB
IN';
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
RECYCLEBIN SYNONYM
SQL> select owner,synonym_name,table_owner,table_name from dba_synonyms where sy
nonym_name='RECYCLEBIN';
OWNER SYNONYM_NAME TAB TABLE_NAME
---------- -------------------- --- --------------------
PUBLIC RECYCLEBIN SYS USER_RECYCLEBIN
可以發現,實際上recyclebin是user_recyclebin的一個公共同義詞。還可以通過dba_recyclebin查看系統中所有被drop的對象,但這里沒有all_recyclebin視圖。
另外,Sqlplus也提供了一個專門的命令:
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST BIN$xJlIkIFVR/yau1Qb8ocxxQ==$0 TABLE 2006-12-13:22:00:33
但該命令只能看到被drop的table,該table對應的index等只能通過查詢獲取。
SQL> create table t(id int);
表已創建。
SQL> create index ix_t on t(id);
索引已創建。
SQL> alter table t add constraint con_t_pk primary key(id) using index ix_t;
表已更改。
SQL> drop table t;
表已刪除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$w0Os4BFTSE+N81RO1pUHaw==$0 TABLE 2006-12-13:22:45:58
SQL> select object_name,original_name,type from recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ -------------------------------- ----------
BIN$dw0vOefrQPC5AAaFn7rkPg==$0 IX_T INDEX
BIN$w0Os4BFTSE+N81RO1pUHaw==$0 T TABLE
4.如何清除RecycleBin中的對象
回收站中的東西多了,自然要清除。Oracle10g增加了一個新的關鍵字purge來執行清除recyclebin的功能。
purge table table_name可以清除指定的table,這里的table_name既可以是table原來的名字,也可以是回收站中按規則自動命名的名字。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$+7J5MgT2RbCX+tka+zjpgA==$0 TABLE 2006-12-13:22:11:49
TEST BIN$RwhOW+KvTSmOznDipO+BOw==$0 TABLE 2006-12-13:22:30:38
SQL> purge table test;
表已清除。
SQL> purge table BIN$+7J5MgT2RbCX+tka+zjpgA==$0;
purge table BIN$+7J5MgT2RbCX+tka+zjpgA==$0
*
第 1 行出現錯誤:
ORA-00933: SQL 命令未正確結束
SQL> purge table "BIN$+7J5MgT2RbCX+tka+zjpgA==$0";
表已清除。
Purge tablespace tablespace_name可以清除RecycleBin屬于指定tablespace的所有對象。
SQL> purge tablespace users;
表空間已清除。
Purge tablespace tablespace_name user user_name則可以清除Recycle中屬于指定tablespace和指定user的所有對象。
SQL> purge tablespace users user ning;
表空間已清除。
Purge recyclebin可以清除執行該命令的用戶所能看到的所有recyclebin對象。也就是普通用戶能清除屬于自己的對象,而sysdba用戶則能清除所有recyclebin中的對象。
SQL> purge recyclebin;
回收站已清空。
另外,purge index可以清除index對象。
SQL> select object_name,original_name,type from recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ -------------------------------- ----------
BIN$dw0vOefrQPC5AAaFn7rkPg==$0 IX_T INDEX
BIN$w0Os4BFTSE+N81RO1pUHaw==$0 T TABLE
SQL> purge index ix_t;
purge index ix_t
*
第 1 行出現錯誤:
ORA-00604: 遞歸 SQL 級別 1 出現錯誤
ORA-02429: 無法刪除用于強制唯一/主鍵的索引
這里由于ix_t是table主鍵的索引,所以無法單獨清除。
SQL> purge recyclebin;
回收站已清空。
SQL> create table t1(id int);
表已創建。
SQL> create index ix_t1 on t1(id);
索引已創建。
SQL> drop table t1;
表已刪除。
SQL> select object_name,original_name,type from recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ -------------------------------- ----------
BIN$s6zn2IT+Ree2+slP2dpa0A==$0 IX_T1 INDEX
BIN$j2O8O52CT3aoakF4LlAGfg==$0 T1 TABLE
SQL> purge index ix_t1;
索引已清除。
5.如何還原RecycleBin中的對象
前面的試驗中已經使用Flashback table來還原過被刪除的table。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST BIN$xJlIkIFVR/yau1Qb8ocxxQ==$0 TABLE 2006-12-13:22:00:33
SQL> flashback table test to before drop rename to test;
閃回完成。
SQL> desc test
名稱 是否為空? 類型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
如果多次刪除同名的table,則使用上面的語句還原的是最后一個被刪除的test表,這里也可以使用RecycleBin給table的名字來做還原。
SQL> flashback table "BIN$GoZUqZ6GS222JZdcCtFlHQ==$0" to before drop rename to test;
閃回完成。
================================================================================
閃回丟棄(Flashback Drop)
閃回丟棄是將被丟棄的數據庫對象及其相依對象的復制保存在回收站中,以便在必要時能夠及時恢復這些對象。在回收站被清空以前,被丟棄的對象并沒有從數據庫中刪除。這就使數據庫能夠恢復被意外或者誤操作而刪除的表。
為了更好地理解閃回丟棄,需要理解回收站的工作細節,以及丟棄對象在回收站中的存儲、查詢與清除等,將在以下的小節中介紹。
17.5.1 回收站概念
回收站(Recycle Bin)是所有丟棄表及其相依對象的邏輯存儲容器。當一個表被丟棄時(DROP),回收站會將該表及其相依對象存儲在回收站中。存儲在回收站中的表的相依對象包括索引、約束、觸發器、嵌套表、大的二進制對象(LOB)段和LOB索引段。
Oracle回收站將用戶所進行的DROP語句的操作記錄在一個系統表里,即將被刪除的對象寫到一個數據字典表中,確定是不再需要的被刪除對象時,可以使用PURGE命令對回收站空間進行清除。
為了避免被刪除表與同類對象名稱的重復,被刪除表(及相依對象)放到回收站中后,Oracle系統對被刪除的對象名進行了轉換。被刪除對象(如表)的名字轉換格式如下:
BIN$globalUID$version
l globalUID是一個全局唯一的、24個字符長的標識對象,它是Oracle內部使用的標識,對于用戶來說沒有任何實際意義,因為這個標識與對象未刪除前的名稱沒有關系。
l $version 是Oracle數據庫分配的版本號。
17.5.2 使用回收站
如果要對DROP過的表進行恢復操作,可以使用以下語句:
SQL>FLASHBACK TABLE table_name TO BEFORE DROP
為了幫助讀者理解回收站在使用中的操作過程,下面給出較詳細的回收站操作步驟。
示例:本例給出數據準備、刪除表、查詢回收站信息、恢復及查詢恢復后的情況。
(1)連接Oracle
[oracle@localhost ~]$ sqlplus scott/tiger
SQL*Plus: Release 11.1.0.6.0 - Production on Sat Oct 20 16:32:00 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> set line 120;
SQL> set pagesize 50;
SQL> show user;
USER is "SCOTT"
SQL>
(2)準備數據
SQL> create table my_emp as select * from emp;
Table created.
SQL> select count(*) from my_emp;
COUNT(*)
----------
14
SQL>
(3)刪除表結構
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
EMP2 TABLE
MY_EMP TABLE
SALGRADE TABLE
SYS_TEMP_FBT TABLE
7 rows selected.
SQL> drop table my_emp;
Table dropped.
SQL>
(4)刪除(DROP)表后的數據字典
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$POiMOEfPgU3gQAB/AQASlg==$0 TABLE
BONUS TABLE
DEPT TABLE
EMP TABLE
EMP2 TABLE
SALGRADE TABLE
SYS_TEMP_FBT TABLE
7 rows selected.
需要說明的是,當MY_EMP表被刪除以后,在數據庫回收站里變成了BIN$POiMOEfPgU3gQAB/ AQASlg==$0,version是0。
(5)查看user_recyclebin回收站,可以看到刪除的表對應的記錄:
SQL> col object_name for a30;
SQL> col original_name for a20;
SQL> select object_name,original_name from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------
BIN$POiMOEfPgU3gQAB/AQASlg==$0 MY_EMP
SQL>
(6)利用user_recyclebin中的記錄,使用FLASHBACK從回收站恢復表MY_EMP:
SQL> flashback table my_emp to before drop;
Flashback complete.
SQL> select count(*) from my_emp;
COUNT(*)
----------
14
SQL>
以上是恢復完成后的查詢結果。
17.5.3 回收站與空間利用
回收站是丟棄對象的邏輯存儲容器,它以表空間中現有的已經分配的空間為基礎,這意味著系統并沒有給回收站預留空間。這使回收站空間依賴于現有表空間中的可用空間(也就是說丟棄表占據的空間仍然需要計入表空間配額)。因此并不能總是保證丟棄對象在回收站中的最小時間。
如果不對回收站進行清除操作,丟棄對象會一直保存在回收站內,一直到丟棄對象所屬的表空間無法再分配新的存儲區域,這種狀態稱之為空間壓力。有時,用戶的表空間限額也會導致空間壓力狀態的出現,即使表空間中仍然存在自由空間。
當空間壓力出現時,Oracle會覆蓋些回收站對象從而自動回收表空間。Oracle根據先 進先出的原則來選擇丟棄對象進行刪除,所以最先被丟棄的對象也最先被清除。而對象的清除僅僅是為了解決產生的空間壓力問題,所以會盡可能清除少的對象來滿 足空間壓力的要求。這樣處理,既最大限度地保證了對象在回收站中的可用時間,又減少了Oracle在事物處理時的性能影響。
DBA需要關注回收站的空間利用情況,掌握清除回收站對象從而釋放空間的辦法,這可用PURGE命令來完成。PURGE命令可從回收站中刪除表或索引,并釋放有關表和索引所占用的空間;用PURGE命令也可清除整個回收站或清除被刪除的表空間的所有部分。
值得一提的是,當用PURGE命令清除掉被刪除的對象后,該對象確實是被完全清除掉而不能再重建了。
要清除回收站中的對象,釋放空間,有以下幾種方式。
(1)使用PURGE TABLE original_table_name。
這里的original_table_name表示表在drop以前的名稱(源名稱),使用該操作可以從回收站中永久地刪除對象并釋放空間。
(2)使用PURGE TABLE recyclebin_object_name。
這里的recyclebin_object_name表示回收站中的對象名稱,使用該操作可以從回收站中永久地刪除對象并釋放空間。
(3)使用PURGE TABLESPACE tablespace_name從回收站清除一個特定表空間的所有對象。
該命令從指定的表空間中清除所有的丟棄對象及相依對象。因為相依對象(比如LOB、嵌套表、索引和分區等)未必與基表存儲在同一個表空間,該命令會將相依對象從其所在的表空間中進行清除。
(4)使用PURGE TABLESPACE tablespace_name USER user_name,會從回收站中清除屬于某個特定用戶的所有丟棄對象(當然也包括基表的相依對象)。
(5)使用命令DROP USER user_name CASCADE直接刪除指定用戶及其所屬的全部對象。
也就是說DROP USER命令會繞過回收站直接進行刪除。同時,如果回收站中也有該用戶的所屬對象,則也會從回收站中清除掉。
(6)使用PURGE RECYCLEBIN 命令可以清除用戶自己的回收站。
該命令從用戶回收站中清除所有的對象并釋放與這些對象關聯的空間。
(7)PURGE DBA_RECYCLEBIN從所有用戶的回收站清除所有對象。
該命令能高效地完全清空回收站,當然執行該命令必須具有SYSDBA系統管理權限才可以。
示例:查詢當前用戶回收站中的內容,再用PURGE清除。
SQL> show user;
USER is "SCOTT"
SQL> create table orcltest as select * from emp;
Table created.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
EMP2 TABLE
MY_EMP TABLE
ORCLTEST TABLE
SALGRADE TABLE
SYS_TEMP_FBT TABLE
8 rows selected.
SQL> drop table orcltest;
Table dropped.
SQL> select object_name,original_name from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------
BIN$POiMOEfQgU3gQAB/AQASlg==$0 ORCLTEST
SQL>
SQL> show user;
USER is "SCOTT"
SQL> select object_name,original_name from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------
BIN$POiMOEfQgU3gQAB/AQASlg==$0 ORCLTEST
SQL> purge table orcltest;
Table purged.
SQL> select object_name,original_name from user_recyclebin;
no rows selected
FLASHBACK閃回表
今天誤刪除表里面的數據,通過FLASHBACK閃回,
flashback table mmdb.column_class_def_t to timestamp to_timestamp('2009-03-24 14:40:00','yyyy-mm-dd hh34:mi:ss');
出現因為未啟用行移動功能,不能閃回表。
運行alter table mmdb.column_class_def_t enable row movement;然后再運行FLASHBACK,OK
轉自:http://hi.baidu.com/randie/blog/item/dc6c7118b999ab4943a9adc1.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。