当表被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;
三、使用Oracle数据恢复工具-ODU恢复被Truncate的数据:
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导入数据即可。
原文:http://blog.itpub.net/26770925/viewspace-1373582/