首頁 > 軟體

Oracle使用fy_recover_data恢復truncate刪除的資料

2022-07-20 18:03:38

前言

TRUNCATE不會逐個清除使用者資料塊上的資料,而僅僅重置資料字典和後設資料塊上的後設資料(如儲存段頭和擴充套件段圖)。也就是說,此時,其基本資料並未被破壞,而是被系統回收、等待被重新分配。

如果我們已經有一套後設資料及資料塊,然後將被TRUNCATE的使用者資料塊的內容取代其使用者資料塊的內容,是否可以“騙”過Oracle,讓它讀出這些資料呢? 回顧一下表掃描的過程,這個方法應該是可行的。我們只要想辦法構造出一個結構相同、且具有完整後設資料資訊和格式化了的使用者資料塊的傀儡表物件,然後將被TRUNCATE的使用者資料塊找出,再將其資料內容部分嫁接到傀儡物件的使用者資料塊,使Oracle以外這是傀儡物件的資料,就能讓Oracle掃描並讀出資料內容。

1.建立測試表

SQL> create table pak_tab as select * from dba_objects;
Table created.
SQL> select count(*) from pak_tab;
COUNT(*)
----------
86262

2.truncate table pak_tab

SQL> truncate table pak_tab;
Table truncated.
SQL> select count(*) from pak_tab;
COUNT(*)
----------
0
SQL> select owner from sys.pak_tab where rownum<=1;
OWNER
------------------------------
SYS

3 編譯fy_recover_data包

SQL> @fy_recover_data.pck
Package created.
Package body created.

4.執行fy_recover_data包

SQL> exec fy_recover_data.recover_truncated_table('sys','pak_tab');
PL/SQL procedure successfully completed.
SQL> SELECT COUNT(*) FROM pak_tab;
COUNT(*)
----------
0
SQL> SELECT COUNT(*) FROM pak_tab$$;

COUNT(*)
----------
86262

5.把資料插回原表

SQL> alter table pak_tab nologging;
Table altered.
SQL> insert /*+append*/ into pak_tab select * from pak_tab$$;
86262 rows created.
SQL> commit;
Commit complete.
SQL> alter table pak_tab logging;
Table altered.

6.校驗資料

SQL> select count(*) from pak_tab;

COUNT(*)
----------
86262

總結

1,刪除因為恢復表自動建立的兩個表空間

  • drop tablespace fy_rec_data including contents and datafiles;
  • drop tablespace fy_rst_data including contents and datafiles;

2,truncate以後,要保證沒有新資料灌入

3,儲存該表的資料檔案不能覆蓋。否則無法完成恢復。

4,緊急時刻可以將表空間設為唯讀

5,備份的關鍵性,合理的備份策略是DBA最後的救命稻草,請重視備份!對資料懷有敬畏之心!!

到此這篇關於Oracle使用fy_recover_data恢復truncate刪除的資料的文章就介紹到這了,更多相關Oracle 恢復truncate刪除資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com