小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

oracle 10g的回收站

 xiao huan 2008-01-29
oracle 10g的回收站
2007-03-26 14:03

在Oracle 10g數(shù)據(jù)庫中,引入了一個回收站(Recycle Bin)的數(shù)據(jù)庫對象。

回收站,從原理上來說就是一個數(shù)據(jù)字典表,放置用戶Drop掉的數(shù)據(jù)庫對象信息。用戶進行Drop操作的對象并沒有被數(shù)據(jù)庫刪除,仍然會占用空間。除非是由于用戶手工進行Purge或者因為存儲空間不夠而被數(shù)據(jù)庫清掉。數(shù)據(jù)庫有了這樣的功能,能夠減少很多不必要的麻煩。常??吹介_發(fā)人員誤把表刪除,急急忙忙找DBA 來想辦法的情況。相信隨著10G的大范圍應用,這種情形應該比較少見了,我們可以充分利用10g的閃回(FLASHBACK,閃回,回閃?)功能來避免大量的人工誤操作。

DBA管理上的相關信息可以從USER_recyclebin(DBA_recyclebin)中獲取。

為了便于測試,我們創(chuàng)建了一個表空間Foo,大小為1M,創(chuàng)建了一個用戶Foo,默認的表空間為Foo.

SQL> CONNECT foo/foo;
Connected.
SQL> SELECT table_name FROM user_tables;
no rows selected
SQL>
SQL> DESC user_recyclebin
Name Null? Type
----------------------------------------- -------- -------------------
OBJECT_NAME NOT NULL VARCHAR2(30)
ORIGINAL_NAME VARCHAR2(32)
OPERATION VARCHAR2(9)
TYPE VARCHAR2(25)
TS_NAME VARCHAR2(30)
CREATETIME VARCHAR2(19)
DROPTIME VARCHAR2(19)
DROPSCN NUMBER
PARTITION_NAME VARCHAR2(32)
CAN_UNDROP VARCHAR2(3)
CAN_PURGE VARCHAR2(3)
RELATED NOT NULL NUMBER
BASE_OBJECT NOT NULL NUMBER
PURGE_OBJECT NOT NULL NUMBER
SPACE NUMBER
SQL>

user_recyclebin大多是自解釋的,相對比較容易理解.

SQL> SELECT object_name FROM user_recyclebin;
no rows selected
SQL>
SQL> SELECT object_name FROM user_recyclebin;
no rows selected
SQL> CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> SELECT table_name FROM user_tables;
TABLE_NAME
----------------------------------------------
FOO
SQL> DROP TABLE foo;
Table dropped.
SQL> SELECT table_name FROM user_tables;
no rows selected
SQL> SHOW recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE 2004-10-30:14:37:39
SQL>

SQL*Plus命令SHOW recyclebin等價于這條SQL:

SQL> SELECT original_name, object_name, TYPE, droptime FROM user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE DROPTIME
--------------- ------------------------------ ---------- --------------------
FOO BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE 2004-10-30:14:37:39
SQL>
SQL> DESC "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
Name Null? Type
----------------------------------------- -------- ----------------
DUMMY VARCHAR2(1)
SQL>

當一個表被刪除并移動到"回收站"中,它的名字要進行一些轉換。這樣的目的顯而易見是為了避免同類對象名稱的重復。(這一點和Windows操作系統(tǒng)的回收站不同,Windows中的回收站經(jīng)過了特殊的處理,操作系統(tǒng)文件可以重名。)

轉換后的名字格式如下:

BIN$unique_id$version

  • 其中BIN代表RecycleBin
  • unique_id是數(shù)據(jù)庫中該對象的唯一標志,26個字符長度
  • version表示該對象的版本號

注:在10g beta 版本中,名字格式如下:

RB$$objn$object_type$version

其中的RB,代表Recycle Bin. objn為表的目錄對象號. object_type表示對象類型. version表示版本號. 由數(shù)據(jù)庫指定。

下面我們驗證一下回收站里數(shù)據(jù)庫對象名字的唯一性:

SQL> CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> SELECT table_name FROM user_tables;
TABLE_NAME
------------------------------------------------------------
FOO
SQL> DROP TABLE foo;
Table dropped.
SQL> SHOW recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$VL+ZsqVlQF6R2nYnwAqtvw==$0 TABLE 2004-10-30:15:01:42
FOO BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE 2004-10-30:14:37:39
SQL>

能看出來,雖然源表名字相同,在回收站里的對象名字是不同的。

針對Recycle Bin對象的操作

已經(jīng)放到回收站里的表是不能用drop 命令刪除的(注意對象名字上的雙引號):

SQL> DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
2 /
DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
*
ERROR at line 1:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin
SQL>

如果要清掉該對象,使用purge命令:

SQL> PURGE table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
2 /
Table purged.
SQL> SELECT object_name, original_name FROM user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ ---------------
BIN$VL+ZsqVlQF6R2nYnwAqtvw==$0 FOO
SQL>

對象已經(jīng)清掉。如果直接清空所有的Recycle Bin中的對象:

SQL> PURGE RECYCLEBIN;
Recyclebin purged.
SQL> SELECT object_name, original_name FROM user_recyclebin;
no rows selected
SQL>

恢復表,用回閃表的功能:

SQL> FLASHBACK TABLE foo TO BEFORE DROP;
Flashback complete.
SQL>SELECT table_name FROM user_tables;
TABLE_NAME
------------------------------------------------------------
FOO
SQL>

注:在10g Beta版本中,使用Undrop命令來做到這一點.

有的時候,可能同一個名字的表被刪除到回收站中:

SQL> DROP TABLE FOO;
Table dropped.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE 2004-10-30:15:18:03
SQL> CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> DROP TABLE foo;
Table dropped.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$J63QaUaKTmC1glat+imjeg==$0 TABLE 2004-10-30:15:18:50
FOO BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE 2004-10-30:15:18:03
SQL> FLASHBACK TABLE FOO TO BEFORE DROP;
Flashback complete.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE 2004-10-30:15:18:03
SQL>

默認的恢復是第一個被刪除的FOO表。如果要恢復指定的表,可以在FLASHBACK TABLE 后面加上指定的RECYCLEBIN 參數(shù)指定其他的名字:

SQL> FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP;
FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
SQL> FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP
2 RENAME TO foo2;
Flashback complete.
SQL>

以下幾種drop不會將相關對象放進RecycleBin:

  • drop tablespace:會將RecycleBin中所有屬于該tablespace的對象清除
  • drop user:會將RecycleBin中所有屬于該用戶的對象清除
  • drop cluster:會將RecycleBin中所有屬于該cluster的成員對象清除
  • drop type:會將RecycleBin中所有依賴該type的對象清除

RecycleBin中的對象會被系統(tǒng)自動按照規(guī)則重命名,這是為了防止命名沖突。命名格式為:BIN$unique_id$version

其中unique_id是26個字符的對象唯一標識符,version則是對象在數(shù)據(jù)庫中的版本號。

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后,重建一個名為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$4bNgZiMGTA63iwA5xflh5A==$0 T
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T

可以看到unique_id又變了。所以,通過這種命名方式,避免了對于刪除table后又重建了同名table的情況可能造成的命名沖突。

2.如何啟用/禁用RecycleBin

通過設置初始化參數(shù)recyclebin,可以控制是否啟用回收站功能,默認是開啟的。
SQL> alter system set recyclebin=off;

系統(tǒng)已更改。

SQL> alter system set recyclebin=on;

系統(tǒng)已更改。

SQL> alter session set recyclebin=off;

會話已更改。

SQL> alter session set recyclebin=on;

會話已更改。

3.如何查看RecycleBin中的信息

前面已經(jīng)提到,用戶可以通過查詢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

可以發(fā)現(xiàn),實際上recyclebin是user_recyclebin的一個公共同義詞。還可以通過dba_recyclebin查看系統(tǒng)中所有被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);

表已創(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中的對象

回收站中的東西多了,自然要清除。Oracle10g增加了一個新的關鍵字purge來執(zhí)行清除recyclebin的功能。

purge table table_name可以清除指定的table,這里的table_name既可以是table原來的名字,也可以是回收站中按規(guī)則自動命名的名字。
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)錯誤:
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可以清除執(zhí)行該命令的用戶所能看到的所有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 行出現(xiàn)錯誤:
ORA-00604: 遞歸 SQL 級別 1 出現(xiàn)錯誤
ORA-02429: 無法刪除用于強制唯一/主鍵的索引

這里由于ix_t是table主鍵的索引,所以無法單獨清除。

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中的對象

前面的試驗中已經(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,則使用上面的語句還原的是最后一個被刪除的test表,這里也可以使用RecycleBin給table的名字來做還原。
SQL> flashback table "BIN$GoZUqZ6GS222JZdcCtFlHQ==$0" to before drop rename to t
est;

閃回完成。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多