您的位置:首頁技術文章
文章詳情頁

Oracle使用fy_recover_data恢復truncate刪除的數據

瀏覽:189日期:2023-03-12 15:25:21
目錄
  • 前言
  • 1.創建測試表
  • 2.truncate table pak_tab
  • 3 編譯fy_recover_data包
  • 4.執行fy_recover_data包
  • 5.把數據插回原表
  • 6.校驗數據
  • 總結

前言

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刪除數據內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: Oracle
国产综合久久一区二区三区