oracle如何恢復(fù)誤刪的表記錄數(shù)據(jù),解決辦法:
成都創(chuàng)新互聯(lián)公司自2013年起,我們提供高端網(wǎng)站建設(shè)、小程序開發(fā)、電商視覺設(shè)計、重慶APP開發(fā)公司及網(wǎng)絡(luò)營銷搜索優(yōu)化服務(wù),在傳統(tǒng)互聯(lián)網(wǎng)與移動互聯(lián)網(wǎng)發(fā)展的背景下,我們堅守著用標(biāo)準(zhǔn)的設(shè)計方案與技術(shù)開發(fā)實力作基礎(chǔ),以企業(yè)及品牌的互聯(lián)網(wǎng)商業(yè)目標(biāo)為核心,為客戶打造具商業(yè)價值與用戶體驗的互聯(lián)網(wǎng)+產(chǎn)品。
從flash back里查詢被刪除的表select * from recyclebin
執(zhí)行表的恢復(fù)flashback table ?tbName ?to before drop;這里的tbName代表你要恢復(fù)的表的名稱。
先從flashback_transaction_query視圖里查詢,視圖提供了供查詢用的表名稱、事務(wù)提交時間、UNDO_SQL等字段。
一般先根據(jù)時間進(jìn)行查詢,查詢語句模式為select * from tb as of timestamp to_timestamp(time,'yyyy-mm-dd hh24:mi:ss'); tb指表名稱,time指某個時間點。
這個命令的作用是,允許Oracle 修改分配給行的rowid。
在Oracle 中,插入一行時就會為它分配一個rowid,而且這一行永遠(yuǎn)擁有這個rowid。
閃回表處理會對EMP 完成DELETE,并且重新插入行,這樣就會為這些行分配一個新的rowid。
要支持閃回就必須允許Oracle 執(zhí)行這個操作。
Oracle i Database 推出了閃回查詢選項的概念 以便檢索過去某個時間點的數(shù)據(jù) 但它不能閃回 DDL 操作 如刪除表的操作 唯一的恢復(fù)方法是在另一個數(shù)據(jù)庫中使用表空間的時間點恢復(fù) 然后使用導(dǎo)出/導(dǎo)入或其他方法 在當(dāng)前數(shù)據(jù)庫中重新創(chuàng)建表 這一過程需要 DBA 進(jìn)行大量工作并且耗費寶貴的時間 更不用說還要使用另一個數(shù)據(jù)庫進(jìn)行克隆 使用 Oracle Database g 中的閃回表特性 它使得被刪除表的恢復(fù)過程如同執(zhí)行幾條語句一樣簡單 讓我們來看該特性是如何工作的
刪除那個表!
首先 讓我們查看當(dāng)前模式中的表
SQL select * from tab;TNAMETABTYPE CLUSTERID
RECYCLETEST TABLE
現(xiàn)在 我們意外地刪除了該表
SQL drop table recycletest;Table dropped
現(xiàn)在讓我們來查看該表的狀態(tài)
SQL select * from tab;TNAME TABTYPE CLUSTERID BIN$ LhcpndanfgMAAAAAANPw==$ TABLE
表RECYCLETEST 已不存在 但是請注意出現(xiàn)新表BIN$ LhcpndanfgMAAAAAANPw==$ 這就是所發(fā)生的事情 被刪除的表 RECYCLETEST 并沒有完全消失 而是重命名為一個由系統(tǒng)定義的名稱 它存在于同一個表空間中 具有與原始表相同的結(jié)構(gòu) 如果在該表上定義了索引或觸發(fā)器 則它們也被重命名 使用與表相同的命名規(guī)則 任何相關(guān)源(如過程)都失效 原始表的觸發(fā)器和索引被改為放置在重命名的表 BIN$ LhcpndanfgMAAAAAANPw==$ 上 保持被刪除表的完整對象結(jié)構(gòu)
表及其相關(guān)對象被放置在一個稱為 回收站 的邏輯容器中 它類似于您 PC 機(jī)中的回收站 但是 對象并沒有從它們原先所在的表空間中刪除 它們?nèi)匀徽加媚抢锏目臻g 回收站只是一個列出被刪除對象目錄的邏輯結(jié)構(gòu) 在 SQL*Plus 提示符處使用以下命令來查看其內(nèi)容(您需要使用 SQL*Plus 來進(jìn)行此操作)
SQL show recyclebinORIGINAL NAME RECYCLEBIN NAMEOBJECT TYPE DROP TIME RECYCLETESTBIN$ LhcpndanfgMAAAAAANPw==$ TABLE : : :
結(jié)果顯示了表的原始名稱 RECYCLETEST 并顯示了回收站中的新名稱 該名稱與我們看到的刪除后所創(chuàng)建的新表名稱相同 (注意 確切的名稱可能因平臺不同而不同 )為恢復(fù)該表 您所需要做的就是使用 FLASHBACK TABLE 命令
SQL FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;FLASHBACK PLETE SQL SELECT * FROM TAB;TNAME TABTYPE CLUSTERID RECYCLETESTTABLE
瞧!表毫不費力地恢復(fù)了 如果現(xiàn)在查看回收站 它將是空的 記住 將表放在回收站里并不在原始表空間中釋放空間 要釋放空間 您需要使用以下命令清空回收站
PURGE RECYCLEBIN;
但是如果您希望完全刪除該表而不需要使用閃回特性 該怎么辦?在這種情況下 可以使用以下命令永久刪除該表
DROP TABLE RECYCLETEST PURGE;
此命令不會將表重命名為回收站中的名稱 而是永久刪除該表 就象 g 之前的版本一樣
管理回收站
如果在該過程中沒有實際刪除表 — 因而沒有釋放表空間 — 那么當(dāng)被刪除的對象占用了所有空間時 會發(fā)生什么事?
答案很簡單 這種情況根本不會出現(xiàn) 當(dāng)表空間被回收站數(shù)據(jù)完全占滿 以至于必須擴(kuò)展數(shù)據(jù)文件來容納更多數(shù)據(jù)時 可以說表空間處于 空間壓力 情況下 此時 對象以先進(jìn)先出的方式從回收站中自動清除 在刪除表之前 相關(guān)對象(如索引)被刪除
同樣 空間壓力可能由特定表空間定義的用戶限額而引起 表空間可能有足夠的空余空間 但用戶可能將其在該表空間中所分配的部分用完了 在這種情況下 Oracle 自動清除該表空間中屬于該用戶的對象
此外 有幾種方法可以手動控制回收站 如果在刪除名為 TEST 的特定表之后需要從回收站中清除它 可以執(zhí)行
PURGE TABLE TEST;
或者使用其回收站中的名稱
PURGE TABLE BIN$ LhcpndanfgMAAAAAANPw==$ ;
此命令將從回收站中刪除表 TEST 及所有相關(guān)對象 如索引 約束等 從而節(jié)省了空間 但是 如果要從回收站中永久刪除索引 則可以使用以下命令來完成工作
purge index in_test _ ;
此命令將僅僅刪除索引 而將表的拷貝留在回收站中 有時在更高級別上進(jìn)行清除可能會有用 例如 您可能希望清除表空間 USERS 的回收站中的所有對象 可以執(zhí)行
PURGE TABLESPACE USERS;
您也許希望只為該表空間中特定用戶清空回收站 在數(shù)據(jù)倉庫類型的環(huán)境中 用戶創(chuàng)建和刪除許多臨時表 此時這種方法可能會有用 您可以更改上述命令 限定只清除特定的用戶
PURGE TABLESPACE USERS USER SCOTT;
諸如 SCOTT 等用戶可以使用以下命令來清空自己的回收站
PURGE RECYCLEBIN;
DBA 可以使用以下命令清除任何表空間中的所有對象
PURGE DBA_RECYCLEBIN;
可以看到 可以通過多種不同方法來管理回收站 以滿足特定的需要
表版本和閃回功能
用戶可能會經(jīng)常多次創(chuàng)建和刪除同一個表 如
CREATE TABLE TEST (COL NUMBER);INSERT INTO TEST VALUES ( );mit;DROP TABLE TEST;CREATE TABLE TEST (COL NUMBER);INSERT INTO TEST VALUES ( );mit;DROP TABLE TEST;CREATE TABLE TEST (COL NUMBER);INSERT INTO TEST VALUES ( );mit;DROP TABLE TEST;
此時 如果您要對表 TEST 執(zhí)行閃回操作 那么列 COL 的值應(yīng)該是什么?常規(guī)想法可能認(rèn)為從回收站取回表的第一個版本 列 COL 的值是 實際上 取回的是表的第三個版本 而不是第一個 因此列 COL 的值為 而不是
此時您還可以取回被刪除表的其他版本 但是 表 TEST 的存在不允許出現(xiàn)這種情況 您有兩種選擇
使用重命名選項
FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST ;FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST ;
這些語句將表的第一個版本恢復(fù)到 TEST 將第二個版本恢復(fù)到 TEST TEST 和 TEST 中的列 COL 的值將分別是 和 或者 使用表的特定回收站名稱進(jìn)行恢復(fù) 為此 首先要識別表的回收站名稱 然后執(zhí)行
FLASHBACK TABLE BIN$ LhcpnoanfgMAAAAAANPw==$ TO BEFORE DROP RENAME TO TEST ;FLASHBACK TABLE BIN$ LhcpnqanfgMAAAAAANPw==$ TO BEFORE DROP RENAME TO TEST ;
這些語句將恢復(fù)被刪除表的兩個版本
警告
取消刪除特性使表恢復(fù)其原始名稱 但是索引和觸發(fā)器等相關(guān)對象并沒有恢復(fù)原始名稱 它們?nèi)匀皇褂没厥照镜拿Q 在表上定義的源(如視圖和過程)沒有重新編譯 仍然保持無效狀態(tài) 必須手動得到這些原有名稱并應(yīng)用到閃回表
信息保留在名為 USER_RECYCLEBIN 的視圖中 在對表進(jìn)行閃回操作前 請使用以下查詢來檢索原有名稱
SELECT OBJECT_NAME ORIGINAL_NAME TYPEFROM USER_RECYCLEBINWHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBINWHERE ORIGINAL_NAME = RECYCLETEST )AND ORIGINAL_NAME != RECYCLETEST ;
OBJECT_NAMEORIGINAL_N TYPE BIN$ LhcpnianfgMAAAAAANPw==$ IN_RT_ INDEXBIN$ LhcpnganfgMAAAAAANPw==$ TR_RT TRIGGER
在表進(jìn)行閃回操作后 表 RECYCLETEST 上的索引和觸發(fā)器將按照 OBJECT_NAME 列中所示進(jìn)行命名 根據(jù)以上查詢 可以使用原始名稱重新命名對象 如下所示
ALTER INDEX BIN$ LhcpnianfgMAAAAAANPw==$ RENAME TO IN_RT_ ;ALTER TRIGGER BIN$ LhcpnganfgMAAAAAANPw==$ RENAME TO TR_RT;
lishixinzhi/Article/program/Oracle/201311/17794
1,只需要執(zhí)行以下個腳本即可。
2,查看utl_file_dir設(shè)置
3, 可以通過命令行修改此參數(shù),也可以通過修改pfile文件設(shè)置此參數(shù)。
4,該參數(shù)為靜態(tài)參數(shù),需重啟數(shù)據(jù)庫后生效,創(chuàng)建LOGMNR數(shù)據(jù)字典。
5,添加需要分析的歸檔日志。
6,開始日志挖掘,分析日志。
7,查看日志信息,就可以了。
查看回收站中表
select?object_name,original_name,partition_name,type,ts_name,createtime,droptime?from?recyclebin;
恢復(fù)表
SQLflashback?table?test_drop?to?before?drop;或
SQLflashback?table?"BIN$b+XkkO1RS5K10uKo9BfmuA==$0"?to?before?drop;
注:必須9i或10g以上版本支持,flashback無法恢復(fù)全文索引
以下為參考資料
使用 Oracle Database 10g 中的閃回表特性,可以毫不費力地恢復(fù)被意外刪除的表
以下是一個不該發(fā)生卻經(jīng)常發(fā)生的情況:用戶刪除了一個非常重要的表 ― 當(dāng)然是意外地刪除 ― 并需要盡快地恢復(fù)。(在某些時候,這個不幸的用戶可能就是 DBA!)
Oracle9i Database 推出了閃回查詢選項的概念,以便檢索過去某個時間點的數(shù)據(jù),但它不能閃回 DDL 操作,如刪除表的操作。唯一的恢復(fù)方法是在另一個數(shù)據(jù)庫中使用表空間的時間點恢復(fù),然后使用導(dǎo)出/導(dǎo)入或其他方法,在當(dāng)前數(shù)據(jù)庫中重新創(chuàng)建表。這一過程需要 DBA 進(jìn)行大量工作并且耗費寶貴的時間,更不用說還要使用另一個數(shù)據(jù)庫進(jìn)行克隆。
請使用 Oracle Database 10g 中的閃回表特性,它使得被刪除表的恢復(fù)過程如同執(zhí)行幾條語句一樣簡單。讓我們來看該特性是如何工作的。
刪除那個表!
首先,讓我們查看當(dāng)前模式中的表。
SQL?select?*?from?tab;
TNAME
TABTYPE
CLUSTERID
---------------------?-?--?--?---?------
RECYCLETEST
TABLE
現(xiàn)在,我們意外地刪除了該表:
SQL?drop?table?recycletest;
Table?dropped.
現(xiàn)在讓我們來查看該表的狀態(tài)。
SQL?select?*?from?tab;
TNAME
TABTYPE
CLUSTERID
---------------------------?-?--?--?---?------
BIN$04LhcpndanfgMAAAAAANPw==$0?TABLE
表 RECYCLETEST 已不存在,但是請注意出現(xiàn)新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發(fā)生的事情:被刪除的表 RECYCLETEST 并沒有完全消失,而是重命名為一個由系統(tǒng)定義的名稱。它存在于同一個表空間中,具有與原始表相同的結(jié)構(gòu)。如果在該表上定義了索引或觸發(fā)器,則它們也被重命名,使用與表相同的命名規(guī)則。任何相關(guān)源(如過程)都失效;原始表的觸發(fā)器和索引被改為放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被刪除表的完整對象結(jié)構(gòu)。
表及其相關(guān)對象被放置在一個稱為"回收站"的邏輯容器中,它類似于您 PC 機(jī)中的回收站。但是,對象并沒有從它們原先所在的表空間中刪除;它們?nèi)匀徽加媚抢锏目臻g?;厥照局皇且粋€列出被刪除對象目錄的邏輯結(jié)構(gòu)。在 SQL*Plus 提示符處使用以下命令來查看其內(nèi)容(您需要使用 SQL*Plus 10.1 來進(jìn)行此操作):
SQL?show?recyclebin
ORIGINAL?NAME
RECYCLEBIN?NAME
OBJECT?TYPE
DROP?TIME
-------------?-?--?-----------------------?-?--?-----?-?--?--------------
RECYCLETEST
BIN$04LhcpndanfgMAAAAAANPw==$0?TABLE
2004-02-16:21:13:31
結(jié)果顯示了表的原始名稱 RECYCLETEST,并顯示了回收站中的新名稱,該名稱與我們看到的刪除后所創(chuàng)建的新表名稱相同。(注意:確切的名稱可能因平臺不同而不同。)為恢復(fù)該表,您所需要做的就是使用 FLASHBACK TABLE 命令:
SQL?FLASHBACK?TABLE?RECYCLETEST?TO?BEFORE?DROP;
FLASHBACK?COMPLETE.
SQL?SELECT?*?FROM?TAB;
TNAME
TABTYPE
CLUSTERID
---------------------------?-?--?--?---?------
RECYCLETEST
TABLE
瞧!表毫不費力地恢復(fù)了。如果現(xiàn)在查看回收站,它將是空的。
記住,將表放在回收站里并不在原始表空間中釋放空間。要釋放空間,您需要使用以下命令清空回收站:
PURGE?RECYCLEBIN;
但是如果您希望完全刪除該表而不需要使用閃回特性,該怎么辦?在這種情況下,可以使用以下命令永久刪除該表:
DROP?TABLE?RECYCLETEST?PURGE;
此命令不會將表重命名為回收站中的名稱,而是永久刪除該表,就象 10g 之前的版本一樣。
管理回收站
如果在該過程中沒有實際刪除表 ― 因而沒有釋放表空間 ― 那么當(dāng)被刪除的對象占用了所有空間時,會發(fā)生什么事?
答案很簡單:這種情況根本不會出現(xiàn)。當(dāng)表空間被回收站數(shù)據(jù)完全占滿,以至于必須擴(kuò)展數(shù)據(jù)文件來容納更多數(shù)據(jù)時,可以說表空間處于"空間壓力"情況下。此時,對象以先進(jìn)先出的方式從回收站中自動清除。在刪除表之前,相關(guān)對象(如索引)被刪除。
同樣,空間壓力可能由特定表空間定義的用戶限額而引起。表空間可能有足夠的空余空間,但用戶可能將其在該表空間中所分配的部分用完了。在這種情況下,Oracle 自動清除該表空間中屬于該用戶的對象。
此外,有幾種方法可以手動控制回收站。如果在刪除名為 TEST 的特定表之后需要從回收站中清除它,可以執(zhí)行
PURGE?TABLE?TEST;
或者使用其回收站中的名稱:
PURGE?TABLE?"BIN$04LhcpndanfgMAAAAAANPw==$0";
此命令將從回收站中刪除表 TEST 及所有相關(guān)對象,如索引、約束等,從而節(jié)省了空間。但是,如果要從回收站中永久刪除索引,則可以使用以下命令來完成工作:
purge?index?in_test1_01;
此命令將僅僅刪除索引,而將表的拷貝留在回收站中。
有時在更高級別上進(jìn)行清除可能會有用。例如,您可能希望清除表空間 USERS 的回收站中的所有對象??梢詧?zhí)行:
PURGE?TABLESPACE?USERS;
您也許希望只為該表空間中特定用戶清空回收站。在數(shù)據(jù)倉庫類型的環(huán)境中,用戶創(chuàng)建和刪除許多臨時表,此時這種方法可能會有用。您可以更改上述命令,限定只清除特定的用戶:
PURGE?TABLESPACE?USERS?USER?SCOTT;
諸如 SCOTT 等用戶可以使用以下命令來清空自己的回收站
PURGE?RECYCLEBIN;
DBA 可以使用以下命令清除任何表空間中的所有對象
PURGE?DBA_RECYCLEBIN;
可以看到,可以通過多種不同方法來管理回收站,以滿足特定的需要。
表版本和閃回功能
用戶可能會經(jīng)常多次創(chuàng)建和刪除同一個表,如:
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 執(zhí)行閃回操作,那么列 COL1 的值應(yīng)該是什么?常規(guī)想法可能認(rèn)為從回收站取回表的第一個版本,列 COL1 的值是 1。實際上,取回的是表的第三個版本,而不是第一個。因此列 COL1 的值為 3,而不是 1。
此時您還可以取回被刪除表的其他版本。但是,表 TEST 的存在不允許出現(xiàn)這種情況。您有兩種選擇:
使用重命名選項:
FLASHBACK?TABLE?TEST?TO?BEFORE?DROP?RENAME?TO?TEST2;
FLASHBACK?TABLE?TEST?TO?BEFORE?DROP?RENAME?TO?TEST1;
這些語句將表的第一個版本恢復(fù)到 TEST1,將第二個版本恢復(fù)到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值將分別是 1 和 2?;蛘?,
使用表的特定回收站名稱進(jìn)行恢復(fù)。為此,首先要識別表的回收站名稱,然后執(zhí)行:
FLASHBACK?TABLE?"BIN$04LhcpnoanfgMAAAAAANPw==$0"?TO?BEFORE?DROP?RENAME?TO?TEST2;
FLASHBACK?TABLE?"BIN$04LhcpnqanfgMAAAAAANPw==$0"?TO?BEFORE?DROP?RENAME?TO?TEST1;
這些語句將恢復(fù)被刪除表的兩個版本。
警告......
取消刪除特性使表恢復(fù)其原始名稱,但是索引和觸發(fā)器等相關(guān)對象并沒有恢復(fù)原始名稱,它們?nèi)匀皇褂没厥照镜拿Q。在表上定義的源(如視圖和過程)沒有重新編譯,仍然保持無效狀態(tài)。必須手動得到這些原有名稱并應(yīng)用到閃回表。
信息保留在名為 USER_RECYCLEBIN 的視圖中。在對表進(jìn)行閃回操作前,請使用以下查詢來檢索原有名稱。
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
在表進(jìn)行閃回操作后,表 RECYCLETEST 上的索引和觸發(fā)器將按照 OBJECT_NAME 列中所示進(jìn)行命名。根據(jù)以上查詢,可以使用原始名稱重新命名對象,如下所示:
ALTER?INDEX?"BIN$04LhcpnianfgMAAAAAANPw==$0"?RENAME?TO?IN_RT_01;
ALTER?TRIGGER?"BIN$04LhcpnganfgMAAAAAANPw==$0"?RENAME?TO?TR_RT;
一個值得注意的例外情況是位圖索引。當(dāng)刪除位圖索引時,它們并不放置在回收站中 ― 因此無法檢索它們。約束名稱也無法從視圖中檢索。必須從其他來源對它們進(jìn)行重命名。
閃回表的其他用途
閃回刪除表功能不僅限于恢復(fù)表的刪除操作。與閃回查詢類似,您還可以使用它將表恢復(fù)到不同的時間點,形如flashback table tmm2076 TO TIMESTAMP to_timestamp('2007-05-22
12:00:00','yyyy-mm-dd hh24:mi:ss')
彈出ORA-08189錯誤,需要執(zhí)行以下命令先:
alter table tmm2076 enable row movement這個命令的作用是,允許oracle修改分配給行的rowid。
然后再flashback,數(shù)據(jù)被恢復(fù)完畢。