Truncate 表之恢復
1. 測試環(huán)境:
linux:172.28.145.21
DB:testdb01
2. 原理
Truncate 不會逐個清除用戶數據塊上的數據,而僅僅重置數據字典和元數據塊上的元數據(如存儲斷頭和擴展段圖)。
也就是說,此時,基本數據表并未破壞,而是被系統(tǒng)回收,等待被重新分配—因此,要恢復被truncate的數據,需要及時備份所在的數據文件。
3. 存儲過程包:
Fy_Recover_Data是利用Oracle表掃描機制、數據嫁接機制恢復TRUNCATE或者損壞數據的工具包。由純PLSQL編寫,從網上下載下來的:
4. 測試模擬:
創(chuàng)建表:
CREATETABLET_TRUNCATEASSELECT*FROM TAB;
Truncate 表數據:
truncatetableshiyu.T_TRUNCATE;
恢復:執(zhí)行FY_Recover_Data.SQL 存儲過程
開始恢復:執(zhí)行下面語句:
declare
tgtowner varchar2(30);
tgttable varchar2(30);
datapath varchar2(4000);
datadir varchar2(30);
rects varchar2(30);
recfile varchar2(30);
rstts varchar2(30);
rstfile varchar2(30);
blksz number;
rectab varchar2(30);
rsttab varchar2(30);
copyfile varchar2(30);
begin
tgtowner :='SHIYU';--table owner
tgttable :='T_TRUNCATE'; --table name
datapath :='/data/oradata/test01/'; --必須和T_TRUNCATE表所在的數據文件目錄相同
datadir :='DUMP_DIR'; -oracle中目錄的名字,可以修改
Fy_Recover_data.PRepare_files(tgtowner,tgttable, datapath,datadir, rects,recfile, rstts,rstfile, blksz);
Fy_Recover_data.fill_blocks(tgtowner,tgttable, datadir,rects, recfile,rstts,8,tgtowner, tgtowner,rectab, rsttab,copyfile);
Fy_Recover_data.recover_table(tgtowner,tgttable, tgtowner,rectab, tgtowner,rsttab, datadir,datadir, recfile,datadir,copyfile, blksz);
end;
/
注:執(zhí)行上面的SQL產生2個表空間(2個數據文件),還有1個copy文件。
如下截圖:
--把恢復的數據從shiyu. TRUNCATE$$ 中插入到shiyu. TRUNCATE表(shiyu. TRUNCATE$$ 中是shiyu. TRUNCATE表truncate之前的數據)
insertintoshiyu.T_TRUNCATEselect*from shiyu.T_TRUNCATE$$;
這時在查詢剛才truncate掉的表
5. 收尾:
數據恢復后,把恢復時產生的2個表空間刪除,再刪除對應數據文件
DROPTABLESPACEFY_REC_DATAINCLUDINGCONTENTSANDDATAFILES;
DROPTABLESPACEFY_RST_DATAINCLUDINGCONTENTSANDDATAFILES;
新聞熱點
疑難解答