做個(gè)小試驗(yàn):
SQL> conn ning/ning
已連接。
SQL> drop table test;
東明ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
表已刪除。
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不會(huì)將相關(guān)對(duì)象放進(jìn)RecycleBin:
以下幾種drop不會(huì)將相關(guān)對(duì)象放進(jìn)RecycleBin:
drop tablespace:會(huì)將RecycleBin中所有屬于該tablespace的對(duì)象清除
drop user:會(huì)將RecycleBin中所有屬于該用戶的對(duì)象清除
drop cluster:會(huì)將RecycleBin中所有屬于該cluster的成員對(duì)象清除
drop type:會(huì)將RecycleBin中所有依賴該type的對(duì)象清除
RecycleBin中的對(duì)象會(huì)被系統(tǒng)自動(dòng)按照規(guī)則重命名,這是為了防止命名沖突。命名格式為:BIN$unique_id$version
其中unique_id是26個(gè)字符的對(duì)象唯一標(biāo)識(shí),version則是對(duì)象在數(shù)據(jù)庫中的版本號(hào)。
SQL> create table t(id int);
表已創(chuàng)建。
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);
表已創(chuàng)建。
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后,重建一個(gè)名為t的table,再次刪除,其unique_id是不一樣的。
這時(shí),做一個(gè)還原看看:
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又變了。所以,通過這種命名方式,避免了對(duì)于刪除table后又重建了同名table的情況可能造成的命名沖突。
2.如何啟用/禁用RecycleBin
通過設(shè)置初始化參數(shù)recyclebin,可以控制是否啟用回收站功能,默認(rèn)是開啟的。
SQL> alter system set recyclebin=off;
系統(tǒng)已更改。
SQL> alter system set recyclebin=on;
系統(tǒng)已更改。
SQL> alter session set recyclebin=off;
會(huì)話已更改。
SQL> alter session set recyclebin=on;
會(huì)話已更改。
3.如何查看RecycleBin中的信息
前面已經(jīng)提到,用戶可以通過查詢r(jià)ecyclebin來查看屬于自己的被drop的對(duì)象。
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
可以發(fā)現(xiàn),實(shí)際上recyclebin是user_recyclebin的一個(gè)公共同義詞。還可以通過dba_recyclebin查看系統(tǒng)中所有被drop的對(duì)象,但這里沒有all_recyclebin視圖。
另外,Sqlplus也提供了一個(gè)專門的命令:
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對(duì)應(yīng)的index等只能通過查詢獲取。
SQL> create table t(id int);
表已創(chuàng)建。
SQL> create index ix_t on t(id);
索引已創(chuàng)建。
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中的對(duì)象
回收站中的東西多了,自然要清除。Oracle10g增加了一個(gè)新的關(guān)鍵字purge來執(zhí)行清除recyclebin的功能。
purge table table_name可以清除指定的table,這里的table_name既可以是table原來的名字,也可以是回收站中按規(guī)則自動(dòng)命名的名字。
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 行出現(xiàn)錯(cuò)誤:
ORA-00933: SQL 命令未正確結(jié)束
SQL> purge table "BIN$+7J5MgT2RbCX+tka+zjpgA==$0";
表已清除。
Purge tablespace tablespace_name可以清除RecycleBin屬于指定tablespace的所有對(duì)象。
SQL> purge tablespace users;
表空間已清除。
Purge tablespace tablespace_name user user_name則可以清除Recycle中屬于指定tablespace和指定user的所有對(duì)象。
SQL> purge tablespace users user ning;
表空間已清除。
Purge recyclebin可以清除執(zhí)行該命令的用戶所能看到的所有recyclebin對(duì)象。也就是普通用戶能清除屬于自己的對(duì)象,而sysdba用戶則能清除所有recyclebin中的對(duì)象。
SQL> purge recyclebin;
回收站已清空。
另外,purge index可以清除index對(duì)象。
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 行出現(xiàn)錯(cuò)誤:
ORA-00604: 遞歸 SQL 級(jí)別 1 出現(xiàn)錯(cuò)誤
ORA-02429: 無法刪除用于強(qiáng)制唯一/主鍵的索引
這里由于ix_t是table主鍵的索引,所以無法單獨(dú)清除。
SQL> purge recyclebin;
回收站已清空。
SQL> create table t1(id int);
表已創(chuàng)建。
SQL> create index ix_t1 on t1(id);
索引已創(chuàng)建。
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中的對(duì)象
前面的試驗(yàn)中已經(jīng)使用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,則使用上面的語句還原的是最后一個(gè)被刪除的test表,這里也可以使用RecycleBin給table的名字來做還原。
SQL> flashback table "BIN$GoZUqZ6GS222JZdcCtFlHQ==$0" to before drop rename to test;
閃回完成。
================================================================================
閃回丟棄(Flashback Drop)
閃回丟棄是將被丟棄的數(shù)據(jù)庫對(duì)象及其相依對(duì)象的復(fù)制保存在回收站中,以便在必要時(shí)能夠及時(shí)恢復(fù)這些對(duì)象。在回收站被清空以前,被丟棄的對(duì)象并沒有從數(shù)據(jù)庫中刪除。這就使數(shù)據(jù)庫能夠恢復(fù)被意外或者誤操作而刪除的表。
為了更好地理解閃回丟棄,需要理解回收站的工作細(xì)節(jié),以及丟棄對(duì)象在回收站中的存儲(chǔ)、查詢與清除等,將在以下的小節(jié)中介紹。
17.5.1 回收站概念
回收站(Recycle Bin)是所有丟棄表及其相依對(duì)象的邏輯存儲(chǔ)容器。當(dāng)一個(gè)表被丟棄時(shí)(DROP),回收站會(huì)將該表及其相依對(duì)象存儲(chǔ)在回收站中。存儲(chǔ)在回收站中的表的相依對(duì)象包括索引、約束、觸發(fā)器、嵌套表、大的二進(jìn)制對(duì)象(LOB)段和LOB索引段。
Oracle回收站將用戶所進(jìn)行的DROP語句的操作記錄在一個(gè)系統(tǒng)表里,即將被刪除的對(duì)象寫到一個(gè)數(shù)據(jù)字典表中,確定是不再需要的被刪除對(duì)象時(shí),可以使用PURGE命令對(duì)回收站空間進(jìn)行清除。
為了避免被刪除表與同類對(duì)象名稱的重復(fù),被刪除表(及相依對(duì)象)放到回收站中后,Oracle系統(tǒng)對(duì)被刪除的對(duì)象名進(jìn)行了轉(zhuǎn)換。被刪除對(duì)象(如表)的名字轉(zhuǎn)換格式如下:
BIN$globalUID$version
l globalUID是一個(gè)全局唯一的、24個(gè)字符長(zhǎng)的標(biāo)識(shí)對(duì)象,它是Oracle內(nèi)部使用的標(biāo)識(shí),對(duì)于用戶來說沒有任何實(shí)際意義,因?yàn)檫@個(gè)標(biāo)識(shí)與對(duì)象未刪除前的名稱沒有關(guān)系。
l $version 是Oracle數(shù)據(jù)庫分配的版本號(hào)。
17.5.2 使用回收站
如果要對(duì)DROP過的表進(jìn)行恢復(fù)操作,可以使用以下語句:
SQL>FLASHBACK TABLE table_name TO BEFORE DROP
為了幫助讀者理解回收站在使用中的操作過程,下面給出較詳細(xì)的回收站操作步驟。
示例:本例給出數(shù)據(jù)準(zhǔn)備、刪除表、查詢回收站信息、恢復(fù)及查詢恢復(fù)后的情況。
(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)準(zhǔn)備數(shù)據(jù)
SQL> create table my_emp as select * from emp;
Table created.
SQL> select count(*) from my_emp;
COUNT(*)
----------
14
SQL>
(3)刪除表結(jié)構(gòu)
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)表后的數(shù)據(jù)字典
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.
需要說明的是,當(dāng)MY_EMP表被刪除以后,在數(shù)據(jù)庫回收站里變成了BIN$POiMOEfPgU3gQAB/ AQASlg==$0,version是0。
(5)查看user_recyclebin回收站,可以看到刪除的表對(duì)應(yīng)的記錄:
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從回收站恢復(fù)表MY_EMP:
SQL> flashback table my_emp to before drop;
Flashback complete.
SQL> select count(*) from my_emp;
COUNT(*)
----------
14
SQL>
以上是恢復(fù)完成后的查詢結(jié)果。
17.5.3 回收站與空間利用
回收站是丟棄對(duì)象的邏輯存儲(chǔ)容器,它以表空間中現(xiàn)有的已經(jīng)分配的空間為基礎(chǔ),這意味著系統(tǒng)并沒有給回收站預(yù)留空間。這使回收站空間依賴于現(xiàn)有表空間中的可用空間(也就是說丟棄表占據(jù)的空間仍然需要計(jì)入表空間配額)。因此并不能總是保證丟棄對(duì)象在回收站中的最小時(shí)間。
如果不對(duì)回收站進(jìn)行清除操作,丟棄對(duì)象會(huì)一直保存在回收站內(nèi),一直到丟棄對(duì)象所屬的表空間無法再分配新的存儲(chǔ)區(qū)域,這種狀態(tài)稱之為空間壓力。有時(shí),用戶的表空間限額也會(huì)導(dǎo)致空間壓力狀態(tài)的出現(xiàn),即使表空間中仍然存在自由空間。
當(dāng)空間壓力出現(xiàn)時(shí),Oracle會(huì)覆蓋些回收站對(duì)象從而自動(dòng)回收表空間。Oracle根據(jù)先 進(jìn)先出的原則來選擇丟棄對(duì)象進(jìn)行刪除,所以最先被丟棄的對(duì)象也最先被清除。而對(duì)象的清除僅僅是為了解決產(chǎn)生的空間壓力問題,所以會(huì)盡可能清除少的對(duì)象來滿 足空間壓力的要求。這樣處理,既最大限度地保證了對(duì)象在回收站中的可用時(shí)間,又減少了Oracle在事物處理時(shí)的性能影響。
DBA需要關(guān)注回收站的空間利用情況,掌握清除回收站對(duì)象從而釋放空間的辦法,這可用PURGE命令來完成。PURGE命令可從回收站中刪除表或索引,并釋放有關(guān)表和索引所占用的空間;用PURGE命令也可清除整個(gè)回收站或清除被刪除的表空間的所有部分。
值得一提的是,當(dāng)用PURGE命令清除掉被刪除的對(duì)象后,該對(duì)象確實(shí)是被完全清除掉而不能再重建了。
要清除回收站中的對(duì)象,釋放空間,有以下幾種方式。
(1)使用PURGE TABLE original_table_name。
這里的original_table_name表示表在drop以前的名稱(源名稱),使用該操作可以從回收站中永久地刪除對(duì)象并釋放空間。
(2)使用PURGE TABLE recyclebin_object_name。
這里的recyclebin_object_name表示回收站中的對(duì)象名稱,使用該操作可以從回收站中永久地刪除對(duì)象并釋放空間。
(3)使用PURGE TABLESPACE tablespace_name從回收站清除一個(gè)特定表空間的所有對(duì)象。
該命令從指定的表空間中清除所有的丟棄對(duì)象及相依對(duì)象。因?yàn)橄嘁缹?duì)象(比如LOB、嵌套表、索引和分區(qū)等)未必與基表存儲(chǔ)在同一個(gè)表空間,該命令會(huì)將相依對(duì)象從其所在的表空間中進(jìn)行清除。
(4)使用PURGE TABLESPACE tablespace_name USER user_name,會(huì)從回收站中清除屬于某個(gè)特定用戶的所有丟棄對(duì)象(當(dāng)然也包括基表的相依對(duì)象)。
(5)使用命令DROP USER user_name CASCADE直接刪除指定用戶及其所屬的全部對(duì)象。
也就是說DROP USER命令會(huì)繞過回收站直接進(jìn)行刪除。同時(shí),如果回收站中也有該用戶的所屬對(duì)象,則也會(huì)從回收站中清除掉。
(6)使用PURGE RECYCLEBIN 命令可以清除用戶自己的回收站。
該命令從用戶回收站中清除所有的對(duì)象并釋放與這些對(duì)象關(guān)聯(lián)的空間。
(7)PURGE DBA_RECYCLEBIN從所有用戶的回收站清除所有對(duì)象。
該命令能高效地完全清空回收站,當(dāng)然執(zhí)行該命令必須具有SYSDBA系統(tǒng)管理權(quán)限才可以。
示例:查詢當(dāng)前用戶回收站中的內(nèi)容,再用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閃回表
今天誤刪除表里面的數(shù)據(jù),通過FLASHBACK閃回,
flashback table mmdb.column_class_def_t to timestamp to_timestamp('2009-03-24 14:40:00','yyyy-mm-dd hh34:mi:ss');
出現(xiàn)因?yàn)槲磫⒂眯幸苿?dòng)功能,不能閃回表。
運(yùn)行alter table mmdb.column_class_def_t enable row movement;然后再運(yùn)行FLASHBACK,OK
轉(zhuǎn)自:http://hi.baidu.com/randie/blog/item/dc6c7118b999ab4943a9adc1.html