oracle库flashback删除,在Oracle中如何使用Flashback Drop以及管理回收站

在Oracle11G中,當你刪除一張表的時候,Oracle並不會立馬就把這個表從數據庫中移除,而是將該表與其相關的對象,比如建立在該表上的索引等改一個名字然后一起放在回收站當中.這個特性叫做Flashback Drop.Oracle這樣做的目的是為了避免誤刪除,能夠讓數據在誤刪除之后,可以被找回來.這個是一個非常人性化的特性.至少,我和我的小伙伴們覺着這個特性是極好的.

什么是回收站

回收站其實就是一個數據字典,這個數據字典中保存了很多已經被刪除的表以及其他相關聯的各種對象,比如索引,約束,嵌套表等等.這些已經被刪除掉的對象仍舊在占用空間,它們仍舊會占用當前的磁盤配額.只有當我們使用了purge語句來進行清除或者是數據庫因為表空間的約束等原因主動來清空回收站.

每一個用戶都可以查詢自己的回收站信息,除非當前的用戶具備SYSDBA的權限,否則當前的用戶只能夠查詢自己的回收站信息.可以通過下面的語句來進行查詢回收站的信息:

SELECT * FROM RECYCLEBIN;

當你使用刪除表空間以及表空間中的內容的時候,這個表空間中的對象是不會保存在回收站當中的,回收站將會清理掉里面的所有對象.甚至僅僅是刪除表空間的時候,回收站也都是要被清空的.還有下面的情況:當刪除一個用戶的時候,該用戶下的所有的對象也不會保存在回收站,並且已經存在回收站的信息也會被清除.類似的情況還有刪除一個簇的時候,刪除一個類型的時候.

下面是一個例子:

Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL>CREATE TABLESPACE TEST2DATAFILE 'd:\TEST.DBF' size 30M autoextend on next 10M maxsize unlimited EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO3/Tablespace created.SQL>create user test identified by test default tablespace test temporary tablespace temp;User created.SQL>grant all privileges to test;Grant succeeded.SQL>connect test/testConnected.SQL>create table foo as select level as value from dual connect by level<=100;Table created.SQL>drop table foo;Table dropped.SQL>create table foo as select level as value from dual connect by level<=100;Table created.SQL>create index foo_index on foo(value);Index created.SQL>drop table foo;Table dropped.SQL>select object_name,original_name from recyclebin;OBJECT_NAME                    ORIGINAL_NAME------------------------------ --------------------------------BIN$986nsfRiR06Fih8zSV9S/g==$0 FOO_INDEXBIN$BXC+oYZPQ02UuTQl5mcpbw==$0 FOOBIN$zRgQq7WcSA6fosez88IG8w==$0 FOOSQL>connect / as sysdbaConnected.SQL>drop tablespace test;Tablespace dropped.SQL>connect test/testConnected.SQL>select object_name,original_name from recyclebin;no rows selectedSQL>

通過上面的演示,我們可以看到,當我們刪除一個表空間的時候,原來表空間中的對象也被回收站清空了.

當一個對象被刪除,然后被放在回收站的時候,這些被刪除的表以及與其一同刪除的對象,都會被給一個系統自動生成的名字.這個事情是非常必要的,因為這種方式是可以用於解決因為多次刪除同一個名字的表而導致的命名的沖突.比如:有一個用戶刪除了一個名字為 T1 的表,然后重新創建了這個表T1,然后又給刪掉了.或者是有兩個人刪除了同名的兩個表.系統給被刪除的對象的命名規則是這樣子的:

BIN$unique_id$version

上述:

1) unique_id是一個二十六個字母的GUID,這個字符串可以讓整個回收站的名字在整個數據庫中是唯一的.

2) version是一個由數據庫來指定的版本號.

你可以在啟動參數中利用recyclebin相關的參數來進行回收站的啟動和關閉,當回收站開啟的時候,刪除表的時候,表以及相關的對象就會放到回收站中.當回收站是關閉的時候,這些表就會被直接刪除掉了,這個時候你如果誤刪除了表的時候,就需要找到另外的恢復手段來進行數據的恢復,比如利用備份文件的方式.

回收站的設置默認是開啟的.

ALTER SESSION SET RECYCLEBIN=OFF;ALTER SESSION SET RECYCLEBIN=ON;

可以在找到initSID.ora在其中修改相關的recyclebin的值來修改回收站的開關信息.

查看回收站中的對象

Oracle數據庫提供了兩種視圖來查看在回收站中的對象.

1)user_recyclebin 這個視圖可以用來查看自己已經drop的對象,它有一個同義詞recyclebin,讓查詢變得更加簡單.下面的兩條語句是一樣的:

SELECT * FROM USER_RECYCLEBIN;SELECT * FROM RECYCLEBIN;

2)dba_recyclebin 這個視圖可以提供給具有管理員權限的用戶查看回收站中的數據.

SELECT * FROM DBA_RECYCLEBIN WHERE owner='SCOTT';

另外一種方式,你可以通過SQL*PLUS下面的命令來查看回收站中的信息:

SHOW RECYCLEBIN;

除此之外,Oracle還提供了一個非常不錯的方式來查詢已經在回收站中的數據:

SELECT * FROM "BIN$wFuUFpdPTHmj1LCCWIAJMA==$0";

1)上面應該是雙引號,不能是單引號

2)上面應該是表名,type為table才能被查詢出數據.

從回收站中清除對象

如果你確定你已經刪除的對象已經確實不需要,並且需要釋放其占用的空間的時候,你可以使用PURGE關鍵字來刪除回收站中的信息,當然,前提是你的角色需要具備刪除對象的權限.

你可以通過下面的查詢語句從回收站中查看所有對象,並且可以查詢該已經被刪除的表中的數據,然后找到確定的表進行刪除操作:

ChenZw>select object_name,original_name,type from recyclebin;OBJECT_NAME                    ORIGINAL_NAME                    TYPE------------------------------ -------------------------------- -------------------------BIN$mCyic562TjebGEtVSB7JwA==$0 FOO                              TABLEBIN$GKo5uAbmRSqZlMofs4Wx+A==$0 FOO                              TABLE已選擇2行。ChenZw>select * from "BIN$GKo5uAbmRSqZlMofs4Wx+A==$0" where rownum<=2;VALUE----------3331687980已選擇2行。ChenZw>purge table "BIN$GKo5uAbmRSqZlMofs4Wx+A==$0";表已清除。ChenZw> select object_name,original_name,type from recyclebin;OBJECT_NAME                    ORIGINAL_NAME                    TYPE------------------------------ -------------------------------- -------------------------BIN$mCyic562TjebGEtVSB7JwA==$0 FOO                              TABLE已選擇 1 行。

ChenZw>purge table foo;表已清除。

除了上面的兩種方式之外,還可以使用其他方式來清空當前的回收站中的對象,比如:

PURGE TABLESPACE example;PURGE TABLESPACE example USER oe;

用戶也可以通過使用PURGE RECYCLEBIN命令來刪除當前用戶下的所有的回收站中的對象。

從回收站中恢復對象

使用FLASHBACK TABLE ... TO BEFORE BEFORE DROP [RENAME TO ...]語句從回收站中恢復數據.后面的rename to是可選的,使用這個可選項可以將恢復的表進行重命名.

下面是一個例子:

SQL>drop table foo;Table dropped.SQL>select object_name,original_name,type from recyclebin;OBJECT_NAME                    ORIGINAL_NAME        TYPE------------------------------ -------------------- -------------------------BIN$Cn9JxNU8TzKp2HViGiUF+A==$4 BIN$YDga921kR2eloMbv INDEXBO/FTA==$3BIN$IOUy08o7QkmhQRUXp98VWg==$0 FOO                  TABLESQL>flashback table foo to before drop;Flashback complete.SQL>select count(1) from foo;COUNT(1)----------100SQL>select object_name,original_name,type from recyclebin;no rows selectedSQL> drop table foo;Table dropped.SQL>select object_name,original_name,type from recyclebin;OBJECT_NAME                    ORIGINAL_NAME        TYPE------------------------------ -------------------- -------------------------BIN$SEokzU4/TTGzrqYAI1U8CA==$5 BIN$Cn9JxNU8TzKp2HVi INDEXGiUF+A==$4BIN$lHpRFqtkSYmth5kPQUHxtw==$0 FOO                  TABLESQL>flashback table foo to before drop rename to foobak;Flashback complete.SQL>select count(1) from foo;select count(1) from foo*ERROR at line 1:ORA-00942: table or view does not existSQL>select count(1) from foobak;COUNT(1)----------100SQL>

系統提供的自動生成的GUID是一個避免刪除表重名的一種非常好的方式,例如下面的例子,我們連續刪除了三個名字為foo的表,我們可以使用其中的object_name進行指定的恢復.

SQL>select object_name,original_name,type from recyclebin;OBJECT_NAME                    ORIGINAL_NAME        TYPE------------------------------ -------------------- -------------------------BIN$BSZ/y+VqSZunPgWVSzjXmQ==$0 FOO                  TABLEBIN$vVUFoa2nSYmNFgdJoce95g==$7 BIN$yYC/5QdqRFu5MY90 INDEX4yVI+w==$6BIN$v+IfzkDyQNa4MbUP+zFPQw==$0 FOO                  TABLEBIN$lg5YQjdJQGmz57Dj5NQWIw==$0 FOO                  TABLESQL>flashback table "BIN$v+IfzkDyQNa4MbUP+zFPQw==$0" to before drop rename to fooback;Flashback complete.SQL>select count(1) from fooback;COUNT(1)----------100SQL>

作者 陳字文(熱衷於PM\ORACLE\JAVA等,歡迎同行交流)EMAIL:ziwen@163.com  QQ:409020100

我們恢復了里面的表之后,這個表相關聯的數據也就會被恢復,但是恢復之后的INDEX等數據仍舊是ORACLE生成的索引的名字.所以我們需要自己來修改里面的索引的名字

SQL>select index_name from user_indexes where table_name = upper('fooback');INDEX_NAME------------------------------BIN$vVUFoa2nSYmNFgdJoce95g==$7SQL>alter index "BIN$vVUFoa2nSYmNFgdJoce95g==$7" rename to fooback_index;Index altered.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值