恢復oracle中drop掉的表
今天在現場核查了一個昨天剛部署的過程,核查結束後,把測試過程時用的兩個臨時表給drop掉,完事了啊。不一會現場就有人打電話過來,說表沒了。連到現場檢視回收站,汗,自己把正式表給誤刪除了。趕緊把表從回收站給恢復過來,記錄下來警示自己:
1、刪除表操作:
drop table test_range_table;
2、查詢需要找的表是不是在回收站裡
Select object_name,original_name,partition_name,type,ts_name,createtime,
droptimefrom recyclebin WHERE ORIGINAL_NAME = 'TEST_RANGE_TABLE';
3、如果在回收站裡按下面辦法進行恢復
FLASHBACK TABLE TEST_RANGE_TABLE TO BEFORE DROP;或
Flashback table "BIN$D3fse6sPR96tme8hgbfJyQ==$0" to before drop;
4、看錶結構會發現什麼?
對,表的索引名字變了,修改成了一個和回收站對應的索引名字。
下面是在網上查詢資料,(http://blog.csdn.net/yangfengjob/archive/2009/10/20/4703806.aspx)。
使用 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,資料被恢復完畢。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24496749/viewspace-1037757/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- undrop-for-innodb恢復drop的表
- Oracle drop分割槽表單個分割槽無法透過閃回恢復Oracle
- oracle drop table purge無備份bbed恢復(3/3)Oracle
- oracle drop table purge無備份bbed恢復(1/3)Oracle
- oracle drop table purge無備份bbed恢復(2/3)Oracle
- Oracle RMAN 表空間恢復Oracle
- 【Oracle 恢復表空間】 實驗Oracle
- 【資料庫資料恢復】ASM磁碟組掉線的Oracle資料庫資料恢復案例資料庫資料恢復ASMOracle
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- 【資料庫資料恢復】Oracle資料庫ASM磁碟組掉線如何恢復資料?資料庫資料恢復OracleASM
- 【ASK_ORACLE】Oracle表決磁碟丟失後的恢復方法Oracle
- oracle資料庫災難挽救應急方案之DDL誤操作恢復(drop)Oracle資料庫
- Oracle 12C新特性-RMAN恢復表Oracle
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- NBU恢復oracleOracle
- Oracle案例12——NBU Oracle恢復Oracle
- oracle冷備恢復Oracle
- oracle 異機恢復Oracle
- StorNext伺服器資料恢復案例;硬碟掉線資料恢復伺服器資料恢復硬碟
- Oracle RMAN恢復測試Oracle
- Oracle 不完全恢復Oracle
- 使用Xtrabackup完整備份中恢復單表
- 伺服器重啟後掉線資料恢復伺服器資料恢復
- Oracle RushQL勒索病毒恢復方法Oracle
- Oracle 備份 與 恢復 概述Oracle
- Oracle 備份恢復之 FlashbackOracle
- Oracle恢復誤刪資料Oracle
- ORACLE備份&恢復案例(轉)Oracle
- oracle基於SCN增量恢復Oracle
- Oracle Redo丟失恢復方案Oracle
- 【ASK_ORACLE】Oracle如何恢復舊的統計資訊Oracle
- 伺服器資料恢復,raid5兩塊硬碟掉線資料恢復案例伺服器資料恢復AI硬碟
- 【伺服器資料恢復】掉線硬碟重新上線同步資料被中斷後資料丟失的資料恢復伺服器資料恢復硬碟
- 【RECO_ORACLE】Oracle 12c之CDB與PDB的備份與恢復(四)PDB的幾種恢復方式Oracle
- 備份與恢復oracle_homeOracle
- oracle 增量備份恢復驗證Oracle
- Oracle 備份和恢復介紹Oracle
- oracle使用小記、刪除恢復Oracle
- ORACLE備份&恢復案例三(轉)Oracle