相信有很多oracle數(shù)據(jù)庫(kù)用戶(hù)都遇到過(guò)在操作Oracle數(shù)據(jù)庫(kù)時(shí)誤刪除某些重要數(shù)據(jù)的情況,這個(gè)時(shí)候如果數(shù)據(jù)庫(kù)沒(méi)有備份且數(shù)據(jù)十分重要的,怎么才能恢復(fù)誤刪除的數(shù)據(jù)呢?北亞企安數(shù)據(jù)恢復(fù)工程師下面簡(jiǎn)單介紹幾個(gè)誤刪除Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)的恢復(fù)方法。
Oracle數(shù)據(jù)庫(kù)誤刪除數(shù)據(jù)的恢復(fù)方法一:
利用oracle提供的閃回方法恢復(fù)數(shù)據(jù),該方法適用于delete刪除(一條記錄)的情況:
首先需要知道是什么時(shí)間進(jìn)行的刪除操作,如果不能確定具體時(shí)間點(diǎn)則選擇盡量準(zhǔn)確的刪除數(shù)據(jù)前的時(shí)間。然后利用“select * from 表名 as of timestamp to_timestamp('刪除時(shí)間點(diǎn)','yyyy-mm-dd hh24:mi:ss')”語(yǔ)句可以找回刪除的數(shù)據(jù)。
利用“insert into 表名 (select * from 表名 as of timestamp to_timestamp('刪除時(shí)間點(diǎn)','yyyy-mm-dd hh24:mi:ss'))”語(yǔ)句就可以將恢復(fù)出來(lái)的數(shù)據(jù)插入原表中(注意要保證主鍵不重復(fù))。
另一種方法可以通過(guò)閃回整個(gè)表來(lái)恢復(fù)誤刪除的數(shù)據(jù),但僅適用于表結(jié)構(gòu)沒(méi)有發(fā)生改變且用戶(hù)有flash any table權(quán)限的情況下,語(yǔ)句如下:
alter table 表名 enable row movement
flashback table 表名 to timestamp to_timestamp('刪除時(shí)間點(diǎn)','yyyy-mm-dd hh24:mi:ss')
Oracle數(shù)據(jù)庫(kù)誤刪除數(shù)據(jù)的恢復(fù)方法二:
oracle數(shù)據(jù)庫(kù)在刪除表時(shí)會(huì)將刪除信息存放于某虛擬“回收站”中而非直接清空,再此種狀態(tài)下數(shù)據(jù)庫(kù)標(biāo)記該表的數(shù)據(jù)庫(kù)為“可以復(fù)寫(xiě)”,所以在該塊未被重新使用前依然可以恢復(fù)數(shù)據(jù)。該方法適用于drop刪除。
首先需要通過(guò)查詢(xún)user_table視圖找到被刪除的表:
select table_name,dropped from user_tables
select object_name,original_name,type,droptime from user_recyclebin
注意此時(shí)的表名稱(chēng)已經(jīng)被重新命名,table_name和object_name就是回收站中的存放表名。如果知道原表的名稱(chēng)可以通過(guò)“flashback table 原表名 to before drop”語(yǔ)句恢復(fù)數(shù)據(jù),如果不知道原表的名稱(chēng)可以直接按照回收站中的表名稱(chēng)將數(shù)據(jù)恢復(fù),然后通過(guò)
“flashback table "回收站中的表名(如:Bin$DSbdfd4rdfdfdfegdfsf==$0)" to before drop rename to 新表名”語(yǔ)句就可以重新命名。
Oracle數(shù)據(jù)庫(kù)誤刪除數(shù)據(jù)的恢復(fù)方法三:
利用oracle數(shù)據(jù)庫(kù)的閃回功能可以將數(shù)據(jù)庫(kù)恢復(fù)到過(guò)去某一狀態(tài),語(yǔ)句如下:
SQL>alter database flashback on;
SQL>flashback database to scn SCNNO;
SQL>flashback database to timestamp to_timestamp('刪除時(shí)間點(diǎn)','yyyy-mm-dd hh24:mi:ss');
Oracle數(shù)據(jù)庫(kù)雖然提供了恢復(fù)數(shù)據(jù)的保障機(jī)制,但是也占用了大量空間,使用drop刪除一個(gè)表或者delete刪除數(shù)據(jù)后空間并不能自動(dòng)回收。如果確實(shí)需要恢復(fù)刪除的數(shù)據(jù)又不想空間被浪費(fèi)又該如何操作呢?可以采用以下方法:
1、采用truncate方式進(jìn)行截?cái)唷?br />
2、在drop時(shí)加上purge選項(xiàng):drop table 表名 purge,該選項(xiàng)也可以通過(guò)刪除recyclebin區(qū)域來(lái)永久性刪除表。
刪除表:
SQL>drop table emp cascade constraints;
SQL>purge table emp;
刪除當(dāng)前用戶(hù)的回收站:
SQL>purge recyclebin;
刪除全體用戶(hù)在回收站的數(shù)據(jù):
SQL>purge dba_recyclebin
審核編輯 黃宇
-
數(shù)據(jù)恢復(fù)
+關(guān)注
關(guān)注
10文章
507瀏覽量
17211 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3712瀏覽量
64030
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論