查看回收站中表數據庫
select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin;oracle
恢復表對象
SQL>flashback table test_drop to before drop;或
SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop;索引
注:必須9i或10g以上版本支持,flashback沒法恢復全文索引flash
如下爲參考資料it
使用 Oracle Database 10g 中的閃回表特性,能夠絕不費力地恢復被意外刪除的表io
如下是一個不應發生卻常常發生的狀況:用戶刪除了一個很是重要的表 ― 固然是意外地刪除 ― 並須要儘快地恢復。(在某些時候,這個不幸的用戶可能就是 DBA!)編譯
Oracle9i Database 推出了閃回查詢選項的概念,以便檢索過去某個時間點的數據,但它不能閃回 DDL 操做,如刪除表的操做。惟一的恢復方法是在另外一個數據庫中使用表空間的時間點恢復,而後使用導出/導入或其餘方法,在當前數據庫中從新建立表。這一過程須要 DBA 進行大量工做而且耗費寶貴的時間,更不用說還要使用另外一個數據庫進行克隆。table
請使用 Oracle Database 10g 中的閃回表特性,它使得被刪除表的恢復過程如同執行幾條語句同樣簡單。讓咱們來看該特性是如何工做的。test
刪除那個表!
首先,讓咱們查看當前模式中的表。
SQL> select * from tab;
TNAME
TABTYPE
CLUSTERID
--------------------- - -- -- --- ------
RECYCLETEST
TABLE
如今,咱們意外地刪除了該表:
SQL> drop table recycletest;
Table dropped.
如今讓咱們來查看該表的狀態。
SQL> select * from tab;
TNAME
TABTYPE
CLUSTERID
--------------------------- - -- -- --- ------
BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE
表 RECYCLETEST 已不存在,可是請注意出現新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發生的事情:被刪除的表 RECYCLETEST 並無徹底消失,而是重命名爲一個由系統定義的名稱。它存在於同一個表空間中,具備與原始表相同的結構。若是在該表上定義了索引或觸發器,則它們也被重命名,使用與表相同的命名規則。任何相關源(如過程)都失效;原始表的觸發器和索引被改成放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被刪除表的完整對象結構。
表及其相關對象被放置在一個稱爲"回收站"的邏輯容器中,它相似於您 PC 機中的回收站。可是,對象並無從它們原先所在的表空間中刪除;它們仍然佔用那裏的空間。回收站只是一個列出被刪除對象目錄的邏輯結構。在 SQL*Plus 提示符處使用如下命令來查看其內容(您須要使用 SQL*Plus 10.1 來進行此操做):
SQL> show recyclebin
ORIGINAL NAME
RECYCLEBIN NAME
OBJECT TYPE
DROP TIME
------------- - -- ----------------------- - -- ----- - -- --------------
RECYCLETEST
BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE
2004-02-16:21:13:31
結果顯示了表的原始名稱 RECYCLETEST,並顯示了回收站中的新名稱,該名稱與咱們看到的刪除後所建立的新表名稱相同。(注意:確切的名稱可能因平臺不一樣而不一樣。)爲恢復該表,您所須要作的就是使用 FLASHBACK TABLE 命令:
SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;
FLASHBACK COMPLETE.
SQL> SELECT * FROM TAB;
TNAME
TABTYPE
CLUSTERID
--------------------------- - -- -- --- ------
RECYCLETEST
TABLE
瞧!表絕不費力地恢復了。若是如今查看回收站,它將是空的。
記住,將表放在回收站裏並不在原始表空間中釋放空間。要釋放空間,您須要使用如下命令清空回收站:
PURGE RECYCLEBIN;
可是若是您但願徹底刪除該表而不須要使用閃回特性,該怎麼辦?在這種狀況下,可使用如下命令永久刪除該表:
DROP TABLE RECYCLETEST PURGE;
此命令不會將表重命名爲回收站中的名稱,而是永久刪除該表,就象 10g 以前的版本同樣。
管理回收站
若是在該過程當中沒有實際刪除表 ― 於是沒有釋放表空間 ― 那麼當被刪除的對象佔用了全部空間時,會發生什麼事?
答案很簡單:這種狀況根本不會出現。當表空間被回收站數據徹底佔滿,以致於必須擴展數據文件來容納更多數據時,能夠說表空間處於"空間壓力"狀況下。此時,對象以先進先出的方式從回收站中自動清除。在刪除表以前,相關對象(如索引)被刪除。
一樣,空間壓力可能由特定表空間定義的用戶限額而引發。表空間可能有足夠的空餘空間,但用戶可能將其在該表空間中所分配的部分用完了。在這種狀況下,Oracle 自動清除該表空間中屬於該用戶的對象。
此外,有幾種方法能夠手動控制回收站。若是在刪除名爲 TEST 的特定表以後須要從回收站中清除它,能夠執行
PURGE TABLE TEST;
或者使用其回收站中的名稱:
PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";
此命令將從回收站中刪除表 TEST 及全部相關對象,如索引、約束等,從而節省了空間。可是,若是要從回收站中永久刪除索引,則可使用如下命令來完成工做:
purge index in_test1_01;
此命令將僅僅刪除索引,而將表的拷貝留在回收站中。
有時在更高級別上進行清除可能會有用。例如,您可能但願清除表空間 USERS 的回收站中的全部對象。能夠執行:
PURGE TABLESPACE USERS;
您也許但願只爲該表空間中特定用戶清空回收站。在數據倉庫類型的環境中,用戶建立和刪除許多臨時表,此時這種方法可能會有用。您能夠更改上述命令,限定只清除特定的用戶:
PURGE TABLESPACE USERS USER SCOTT;
諸如 SCOTT 等用戶可使用如下命令來清空本身的回收站
PURGE RECYCLEBIN;
DBA 可使用如下命令清除任何表空間中的全部對象
PURGE DBA_RECYCLEBIN;
能夠看到,能夠經過多種不一樣方法來管理回收站,以知足特定的須要。
表版本和閃回功能
用戶可能會常常屢次建立和刪除同一個表,如:
CREATE TABLE TEST (COL1 NUMBER);
INSERT INTO TEST VALUES (1);
commit;
DROP TABLE TEST;
CREATE TABLE TEST (COL1 NUMBER);
INSERT INTO TEST VALUES (2);
commit;
DROP TABLE TEST;
CREATE TABLE TEST (COL1 NUMBER);
INSERT INTO TEST VALUES (3);
commit;
DROP TABLE TEST;
此時,若是您要對錶 TEST 執行閃回操做,那麼列 COL1 的值應該是什麼?常規想法可能認爲從回收站取回表的第一個版本,列 COL1 的值是 1。實際上,取回的是表的第三個版本,而不是第一個。所以列 COL1 的值爲 3,而不是 1。
此時您還能夠取回被刪除表的其餘版本。可是,表 TEST 的存在不容許出現這種狀況。您有兩種選擇:
使用重命名選項:
FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2;
FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1;
這些語句將表的第一個版本恢復到 TEST1,將第二個版本恢復到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值將分別是 1 和 2。或者,
使用表的特定回收站名稱進行恢復。爲此,首先要識別表的回收站名稱,而後執行:
FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST2;
FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST1;
這些語句將恢復被刪除表的兩個版本。
警告......
取消刪除特性使表恢復其原始名稱,可是索引和觸發器等相關對象並無恢復原始名稱,它們仍然使用回收站的名稱。在表上定義的源(如視圖和過程)沒有從新編譯,仍然保持無效狀態。必須手動獲得這些原有名稱並應用到閃回表。
信息保留在名爲 USER_RECYCLEBIN 的視圖中。在對錶進行閃回操做前,請使用如下查詢來檢索原有名稱。
SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE
FROM USER_RECYCLEBIN
WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBIN
WHERE ORIGINAL_NAME = 'RECYCLETEST')
AND ORIGINAL_NAME != 'RECYCLETEST';
OBJECT_NAME
ORIGINAL_N TYPE
--------------------------- - -- --- - -- ----
BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01
INDEX
BIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT
TRIGGER
在表進行閃回操做後,表 RECYCLETEST 上的索引和觸發器將按照 OBJECT_NAME 列中所示進行命名。根據以上查詢,可使用原始名稱從新命名對象,以下所示:
ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;
ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;
一個值得注意的例外狀況是位圖索引。當刪除位圖索引時,它們並不放置在回收站中 ― 所以沒法檢索它們。約束名稱也沒法從視圖中檢索。必須從其餘來源對它們進行重命名。
閃回表的其餘用途
閃回刪除表功能不只限於恢復表的刪除操做。與閃回查詢相似,您還可使用它將表恢復到不一樣的時間點,形如flashback table tmm2076 TO TIMESTAMP to_timestamp('2007-05-22
12:00:00','yyyy-mm-dd hh24:mi:ss')
彈出ORA-08189錯誤,須要執行如下命令先:
alter table tmm2076 enable row movement這個命令的做用是,容許oracle修改分配給行的rowid。
而後再flashback,數據被恢復完畢。