恢複oracle中誤刪除drop掉的表

來源:互聯網
上載者:User

查看資源回收筒中表

select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin;

恢複表

SQL>flashback table test_drop to before drop;或
SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop;

註:必須9i或10g以上版本支援,flashback無法恢複全文索引

以下為參考資料

 使用 Oracle Database 10g 中的閃回表特性,可以毫不費力地恢複被意外刪除的表

  以下是一個不該發生卻經常發生的情況:使用者刪除了一個非常重要的表 ― 當然是意外地刪除 ― 並需要儘快地恢複。(在某些時候,這個不幸的使用者可能就是 DBA!)

  Oracle9i Database 推出了閃回查詢選項的概念,以便檢索過去某個時間點的資料,但它不能閃回 DDL 操作,如刪除表的操作。唯一的恢複方法是在另一個資料庫中使用資料表空間的時間點恢複,然後使用匯出/匯入或其他方法,在當前資料庫中重新建立表。這一過程需要 DBA 進行大量工作並且耗費寶貴的時間,更不用說還要使用另一個資料庫進行複製。

  請使用 Oracle Database 10g 中的閃回表特性,它使得被刪除表的恢複過程如同執行幾條語句一樣簡單。讓我們來看該特性是如何工作的。

  刪除那個表!

  首先,讓我們查看當前模式中的表。

  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,資料被恢複完畢。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.