ORACLE 如何找回被truncate的表?


当表被truncate后,需要马上恢复。首先要做的就是关闭数据库所有应用,或者OFFLINE那个表所在的表空间。目的只有一个,确保空间不会被重用数据不会被覆盖。只要原来的空间没有被重用(即数据被覆盖),则数据都是可以恢复的。办法大概有这么几种:
一、使用Flashback Database功能找回被TRUNCATE表:

使用该方式首先需要数据库处在归档模式下,并且开启Flashback和force_logging功能;
其局限性在于这种方式实际是恢复数据库到一定时间点,恢复数据库过程需要数据库重启。

1.查看是否开启Flashback和force_logging功能:


2.重启数据库到mount状态,开启Flashback和force_logging功能:



3.查看当前数据库可以闪回到的时间:

4.模拟误删除表:


5.开启数据库到mount exclusive状态,恢复数据库到truncate表T之前的时间:


6.以“resetlogs”的方式打开数据库,查看数据是否被恢复: 


二、利用Oracle表扫描机制恢复被Truncate的数据:

黄炜(fuyuncat:http://www.hellodba.com)提供了一个使用PLSQL编写的存储过程包来恢复被TRUNCATE的数据。
其原理基于TRUNCATE不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储段头和扩展段图)。也就是说,此时,其基本数据并未被破坏,而是被系统回收、等待被重新分配————因此,要恢复被TRUNCATE的数据,需要及时备份其所在的数据文件。

1.下载并部署存储过程包:

2.查询出表所在的数据文件:
select file_name from dba_data_files f, dba_tables t where t.owner=‘HH‘ and t.table_name=‘ARTHAS‘ and t.tablespace_name = f.tablespace_name;


3.拷贝出该数据文件到某处,比如D:\:

4.执行下列存储过程恢复表:
exec FY_RECOVER_DATA.recover_truncated_table(‘HH‘,‘ARTHAS‘,1,‘D:\‘,‘D:\USERS01.DBF‘);  

5.恢复的数据的放到了表ARTHAS$$当中,将数据插到原表ARTHAS。

6.恢复数据后,把恢复时产生的2个表空间删除,再删除对应数据文件:
alter tablespace FY_REC_DATA offline;
drop tablespace FY_REC_DATA INCLUDING CONTENTS;
drop tablespace FY_RST_DATA INCLUDING CONTENTS;

文章及存储过程包请参考http://www.hellodba.com/reader.php?ID=217&lang=CN(在此非常感谢这位大牛的共享!)

三、使用Oracle数据恢复工具-ODU恢复被Truncate的数据:
ODU是比较好用且功能强大的数据恢复工具,它也是通过直接扫描数据文件来获取误删的数据,遗憾的是现在已经商用了,正式版需要license,有需要的公司或个人可购买(http://www.laoxiong.net/odu)。

1.查询数据文件信息:
select d.TS#,d.FILE#,d.NAME,d.BLOCK_SIZE from v$datafile d order by d.TS#;

2.拷贝出system表空间和表所在的数据文件,放在比如D:\:

3.根据上一步的查询信息修改control.txt:


4.打开ODU界面如下:


5.载入并查看数据字典信息:


 可以看到,hh.arthas表所在的表空间号为4,数据段头部为4号文件的762号块。data object id为Obj#=77949

6.扫描表空间的extent并输出表数据:


执行完后,会在ODU软件的DATA目录生成ctl、txt、sql文件。

7.进入cmd使用SQLLDR导入数据即可。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。