ITPub博客

首页 > 数据库 > Oracle > 使用hellodba的工具恢复truncate表的数据

使用hellodba的工具恢复truncate表的数据

Oracle 作者:zuoluo2003 时间:2017-06-01 16:24:37 0 删除 编辑

本文根据http://blog.chinaunix.net/uid-23284114-id-3754559.html整理,并测试通过。


实现原理:
引用作者原文如下:
TRUNCATE不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储段头和扩展段图)。
也就是说,此时,其基本数据并未被破坏,而是被系统回收、等待被重新分配————因此,要恢复被TRUNCATE的数据,需要及时备份其所在的数据文件。
--参考:移花接木————利用Oracle表扫描机制恢复被Truncate的数据

 

一、模拟truncate操作:

SQL> conn scott/tiger

SQL> select count(*) from t;
  COUNT(*)
----------
        13

SQL> truncate table t;

 

二、恢复truncate表的数据

1.下载hellodba的恢复工具到数据库服务器
linux下使用终端,如下:
[oracle@rac1 ~]$ wget http://www.hellodba.com/download/FY_Recover_Data.zip

windows下使用IE输入以下网址:
http://www.hellodba.com/download/FY_Recover_Data.zip


2.解压下载下来的FY_Recover_Data.zip
[oracle@rac1 ~]$ unzip FY_Recover_Data.zip

解压后得到一个文件FY_Recover_Data.SQL

 

以下3-7步操作均用sys用户执行

3.使用sys用户执行解压后的脚本(我这里解压后的文件在/home/oracle/)
SQL> @/home/oracle/FY_Recover_Data.SQL
这个脚本实际是在sys用户下创建了一个名为FY_Recover_Data的package


4.使用sys用户找出存放truncate表的数据文件路径,下一步会用到这个文件路径
SQL> select file_name from dba_data_files f, dba_tables t where t.owner='SCOTT' and t.table_name='T' and t.tablespace_name = f.tablespace_name;
查得结果是/u01/oracle/oradata/orcl/users01.dbf


5.使用sys用户执行以下操作开始恢复:
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 := 'SCOTT'; --table owner
      tgttable := 'T';  --table name
      datapath := '/u01/oracle/oradata/orcl/';    --必须和被truncate表所在的数据文件的目录相同
      datadir := 'FY_DATA_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个表空间FY_REC_DATA、FY_RST_DATA,还有1个copy文件。

 

6.使用sys用户把恢复的数据从scott.t$$中插回scott.t表
注:scott.t$$中是scott.t表truncate之前的数据,此时已经把truncate表的数据恢复出来了,放到了scott.t$$中,让我们去判断一下恢复的是否正确,正确的话,自己插回原表。

SQL> insert into scott.t select * from scott.t$$;
13 rows created.

SQL> commit;
Commit complete.

SQL> select count(*) from t;
  COUNT(*)
----------
        13
可以看到被truncate的数据已经恢复。

 

7.使用sys用户删除恢复时产生的2个表空间及数据文件
SQL> drop tablespace fy_rec_data including contents and datafiles;
Tablespace dropped.

SQL> drop tablespace fy_rst_data including contents and datafiles;
Tablespace dropped.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/76103/viewspace-2140176/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-06-16

  • 博文量
    50
  • 访问量
    158135