誤刪oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù),在不考慮全庫(kù)備份和利用歸檔日志情況,怎樣快速恢復(fù)數(shù)據(jù)呢?
下面介紹3種方法。
1. 利用oracle提供的閃回方法進(jìn)行數(shù)據(jù)恢復(fù),適用于delete刪除方式
首先獲取刪除數(shù)據(jù)的時(shí)間點(diǎn):
select * from v$sql where sql_text like ‘%table_name%’ ;
根據(jù)結(jié)果中的sql_text內(nèi)容,找到delete執(zhí)行語(yǔ)句對(duì)應(yīng)的刪除時(shí)間點(diǎn),執(zhí)行下面語(yǔ)句查詢出刪除的數(shù)據(jù)。
select * from table_name as of timestamp to_timestamp(‘刪除時(shí)間點(diǎn)’,‘yyyy-mm-dd hh24:mi:ss’)where (刪除時(shí)的條件)
檢查數(shù)據(jù)無(wú)誤后,執(zhí)行下面操作,將數(shù)據(jù)插回原表中。注意主鍵不重復(fù)
insert into table_nameselect * from from table_name as of timestamp to_timestamp(‘刪除時(shí)間點(diǎn)’,‘yyyy-mm-dd hh24:mi:ss’)where (刪除時(shí)的條件)
原理是因?yàn)閛racle數(shù)據(jù)庫(kù)在刪除表時(shí)會(huì)將刪除信息存放于某虛擬回收站中而非直接清空,在此種狀態(tài)下數(shù)據(jù)庫(kù)標(biāo)記該表的數(shù)據(jù)庫(kù)為可以復(fù)寫(xiě),所以在該塊未被重新使用前依然可以恢復(fù)數(shù)據(jù)。該方法多用于drop刪除。
首先查詢user_table視圖,找到被刪除的表:
select table_name,dropped from user_tables;select object_name,original_name,type,droptime from user_recyclebin;
注意此時(shí)的,object_name和original_name就是回收站存放的表名和原來(lái)刪除的表名,如果表名沒(méi)有被重新命名,可以通過(guò)下面語(yǔ)句進(jìn)行恢復(fù):
flashback table original_name to before drop;
如果不知道源表名,或者需要重新命名新的表名存放數(shù)據(jù),則可以通過(guò)回收站中的object_name進(jìn)行恢復(fù),命令如下:
flashback table object_name to before drop new_table_name;
3. 用oracle數(shù)據(jù)庫(kù)的閃回功能可以將數(shù)據(jù)庫(kù)恢復(fù)到過(guò)去某一狀態(tài)
注意,此時(shí)是整庫(kù)恢復(fù),具體語(yǔ)法如下:
SQL>alter database flashback onSQL>flashback database to scn SCNNO;SQL>flashback database to timestamp to_timestamp(‘frombyte 2021-09-02 23:59:59’,‘yyyy-mm-dd hh24:mi:ss’);
4. 徹底刪除數(shù)據(jù)
如果確定需要?jiǎng)h除的數(shù)據(jù)又不想無(wú)謂的占用空間,我們可以使用以下3種方式:
采用truncate方式進(jìn)行截?cái)?。(不能進(jìn)行數(shù)據(jù)回恢復(fù))
在drop時(shí)加上purge選項(xiàng):drop table table_name purge
通過(guò)刪除recyclebin區(qū)域來(lái)永久性刪除表 ,drop table table_name cascade constraints purge table table_name;
5. 關(guān)于清空回收站
刪除當(dāng)前用戶回收站
purge recyclebin;
刪除全體用戶在回收站的數(shù)據(jù)
purge dba_recyclebin;