1. 程式人生 > 實用技巧 >資料庫誤刪記錄如何恢復

資料庫誤刪記錄如何恢復

--原文

oracle

1、第一種情況適用於delete刪除(一條記錄)的方式,利用oralce提供的閃回方法進行資料恢復。

  前提:需要知道刪除時間,就算不可以也必須確定準確的刪除資料前的時間

 然後利用以下語句可以找回刪除的資料,再利用第二條語句將語句恢復到原表(前提原表主鍵唯一)

1 SELECT * FROM 表名 AS OF timestamp to_timestamp('刪除時間點''yyyy-mm-dd hh24:mi:ss');
2 insert into 表名 (select * from 表名 as of timestamp to_timestamp('刪除時間點
','yyyy-mm-dd hh24:mi:ss'));

第二種方法可以通過閃回整個表來恢復誤刪除的資料,但僅適用於表結構沒有發生改變且使用者有flash any table許可權的情況下

  前提:表結構沒有發生改變 和 使用者具有 flash  any table 許可權的情況

alter table 表名 enable row movement
flashback table 表名 to timestamp to_timestamp('刪除時間點','frombyte yyyy-mm-dd hh24:mi:ss')

2、該方法適用於 drop(整個表被刪除)的方式

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 新表名

語句就可以重新命名。

3、第三種方法同樣利用oracle資料庫的閃回功能可以將資料庫恢復到過去某一狀態,語法如下:

1 alter database flashback on
2 flashback database to scn SCNNO;
3 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_frombyte.com;

--原文