您好,登錄后才能下訂單哦!
Oracle中Drop,delete,truancate表恢復
oracle中,常常會由于一些失誤導致表的刪除,以下是我寫的一些表恢復的方法。
閃回模式得滿足條件(啟用閃回區和啟用歸檔):
1.檢查是否啟動了flash recovery area
show parameter db_recovery_file
2.檢查是否啟用了歸檔
archive log list;
(一)Drop表的恢復
如果按照平時刪除表的方法:(Drop table tablename;)的話。表不會立即被刪除,而是存放于回收站中(Oracle 10g以后才有)。我們可以通過閃回(Flashback)把表恢復。
查看被回收站中刪除的表:
Select * from dba_recyclebin (where type='TABLE'); --找出對應的表是否存在
閃回表:
Flashback tbale 表名 to before drop;
**回收站存放的不僅僅只有表,還有其他對象
(二)Delete表的恢復
同樣,Delete后可以通過閃回時間戳或者閃回SCN號進行恢復。
基于時間戳恢復
①確定刪除數據的時間(在刪除數據之前的時間就行,不過最好是刪除數據的時間點)
②用以下語句找出刪除的數據:
select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh34:mi:ss')
③開啟行移動功能
alter table 表名 enable row movement
④把刪除的數據重新插入原表:
insert into 表名 (select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh34:mi:ss'));注意要保證主鍵不重復。
⑤關閉行移動功能 ( 千萬別忘記 )
alter table 表名 disable row movement
基于SCN號恢復
①獲取當前的SCN號
select dbms_flashback.get_system_change_number from dual; --假設得到scn號為10672000
②如果知道刪除前的SCN號最好,如果不知道就通過閃回查詢嘗試.
select count(*) from 表名 as of scn 10671000; --如果數據量為0,則繼續提前scn號
select count(*) from 表名 as of scn 10670000; --查詢的數據量為原來的數據量,則ok
③通過查詢的SCN號進行閃回恢復
insert into 表名 select * from tablename as of scn 10670000;
(三)Truncate表的恢復
truncate表后不會產生日志記錄和回滾段空間的使用,不能用查詢閃回恢復。
①最簡單的方法:下載使用PRM (數據庫災難恢復工具)
②進行數據庫閃回(在生產庫不推薦):
select sysdate from dual; --查看時間戳,確認已經開啟閃回,如果沒開啟,只能用①方法了;
shutdown immediate; --關閉數據庫
startup mount; --啟動到mount狀態
flashback database to timestamp to_timestamp('2017-07-30 18:22:33','yyyy-mm-dd hh34:mi:ss'); --閃回刪除時間點的時間
alter database open; --打開數據庫
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。