本文主要是介绍Truncate 表之恢复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Truncate 表之恢复
1. 测试环境:
Linux:172.28.145.21
DB:testdb01
2. 原理
Truncate 不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储断头和扩展段图)。
也就是说,此时,基本数据表并未破坏,而是被系统回收,等待被重新分配—因此,要恢复被truncate的数据,需要及时备份所在的数据文件。
3. 存储过程包:
Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包。由纯PLSQL编写,从网上下载下来的:
4. 测试模拟:
创建表:
CREATETABLET_TRUNCATE ASSELECT* FROM TAB;
Truncate 表数据:
truncatetableshiyu.T_TRUNCATE;
恢复:执行FY_Recover_Data.SQL 存储过程
开始恢复:执行下面语句:
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;
/
注:执行上面的SQL产生2个表空间(2个数据文件),还有1个copy文件。
如下截图:
--把恢复的数据从shiyu. TRUNCATE$$ 中插入到shiyu. TRUNCATE表(shiyu. TRUNCATE$$ 中是shiyu. TRUNCATE表truncate之前的数据)
insertintoshiyu.T_TRUNCATE select* from shiyu.T_TRUNCATE$$;
这时在查询刚才truncate掉的表
5. 收尾:
数据恢复后,把恢复时产生的2个表空间删除,再删除对应数据文件
DROPTABLESPACEFY_REC_DATA INCLUDINGCONTENTSANDDATAFILES;
DROPTABLESPACEFY_RST_DATA INCLUDINGCONTENTSANDDATAFILES;
这篇关于Truncate 表之恢复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!