1. 程式人生 > >Oracle數據庫誤刪除數據3種恢復語句

Oracle數據庫誤刪除數據3種恢復語句

數據庫 數據恢復 oracle數據庫 誤刪除

有很多朋友都遇到過在操作數據庫時誤刪除某些重要數據的情況,如果數據庫沒有備份而且數據有十分重要的情況下怎麽做才能找回誤刪除的數據呢?我在這裏為大家介紹幾種誤刪除數據庫中重要數據的恢復方法(不考慮全庫備份和利用歸檔日誌)

第一種
數據恢復方法是利用oracle提供的閃回方法進行數據恢復,適用於delete刪除(一條記錄)方式:
首先需要知道是什麽時間進行的刪除操作,如果不能確定具體時間點則選擇盡量準確的刪除數據前的時間。然後利用
select from 表名 as of timestamp to_timestamp(‘刪除時間點‘,‘yyyy-mm-dd hh24:mi:ss‘)
語句可以找回刪除的數據。利用
insert into 表名 (select
from 表名 as of timestamp to_timestamp(‘刪除時間點‘,‘yyyy-mm-dd hh24:mi:ss‘));
語句就可以將恢復出來的數據插入原表中(註意要保證主鍵不重復)。
另一種方法可以通過閃回整個表來恢復誤刪除的數據,但僅適用於表結構沒有發生改變且用戶有flash any table權限的情況下,語句如下:
·alter table 表名 enable row movement
·flashback table 表名 to timestamp to_timestamp(刪除時間點‘,‘ frombyte yyyy-mm-dd hh24:mi:ss‘)

第二種
數據恢復方法的原理是因為oracle數據庫在刪除表時會將刪除信息存放於某虛擬“回收站”中而非直接清空,再此種狀態下數據庫標記該表的數據庫為“可以復寫”,所以在該塊未被重新使用前依然可以恢復數據。該方法多用於drop刪除。
首先需要查詢user_table視圖找到被刪除的表:
· select table_name,dropped from user_tables
· select object_name,original_name,type,droptime from user_recyclebin
註意此時的表名稱已經被重新命名,table_name和object_name就是回收站中的存放表名,如果管理員此時可以明確原表的名稱可以通過
flashback table 原表名 to before drop
語句進行數據恢復,如果不知道原表名稱可以直接按照回收站中的表名稱將數據恢復回復來,然後通過
flashback table "回收站中的表名(如:Bin$DSbdfd4rdfdfdfegdfsf==$0)" to before drop rename to 新表名
語句就可以重新命名。

第三種
方法同樣利用oracle數據庫的閃回功能可以將數據庫恢復到過去某一狀態,語法如下:
SQL>alter database flashback on
SQL>flashback database to scn SCNNO;
SQL>flashback database to timestamp to_timestamp(‘frombyte 2007-2-12 12:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘);

介紹到這裏
有朋友發現問題了,oracle數據庫提供了可以恢復數據的保障機制,但也不可避免的占用了大量空間,使用drop一個表或者delete數據後空間並不能自動進行回收,如果確定需要刪除的數據又不想無謂的占用空間該如何操作呢?我們可以使用以下兩種方式:
1、采用truncate方式進行截斷。(但不能進行數據回恢復了)
2、在drop時加上purge選項:drop table 表名 purge
該選項也可以通過刪除recyclebin區域來永久性刪除表 ,原始刪除表drop table emp cascade constraints
purge table emp;
刪除當前用戶的回收站:
purge recyclebin;
刪除全體用戶在回收站的數據:
purge dba_recyclebin

Oracle數據庫誤刪除數據3種恢復語句