Truncate 表之恢复

来源:互联网 发布:java排序算法 编辑:程序博客网 时间:2024/05/22 16:20

Truncate 表之恢复

1.     测试环境:

Linux:172.28.145.21

DB:testdb01

2.     原理

Truncate 不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储断头和扩展段图)。

也就是说,此时,基本数据表并未破坏,而是被系统回收,等待被重新分配—因此,要恢复被truncate的数据,需要及时备份所在的数据文件。

3.     存储过程包:

Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包。由纯PLSQL编写,从网上下载下来的:

 

4.     测试模拟:

创建表:

CREATETABLET_TRUNCATEASSELECT*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个数据文件),还有1copy文件。

 

如下截图:

--把恢复的数据从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;

0 0