当表被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:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981803VvR7.jpg)
4.打开ODU界面如下:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981493kA14.jpg)
5.载入并查看数据字典信息:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981387XXRW.jpg)
![](http://blog.itpub.net/attachment/201412/19/26770925_14189820138S2w.jpg)
可以看到,hh.arthas表所在的表空间号为4,数据段头部为4号文件的762号块。data object id为Obj#=77949。
6.扫描表空间的extent并输出表数据:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981608Om4Y.jpg)
![](http://blog.itpub.net/attachment/201412/19/26770925_141898171489G9.jpg)
执行完后,会在ODU软件的DATA目录生成ctl、txt、sql文件。
7.进入cmd使用SQLLDR导入数据即可。
一、使用Flashback Database功能找回被TRUNCATE表:
使用该方式首先需要数据库处在归档模式下,并且开启Flashback和force_logging功能;
其局限性在于这种方式实际是恢复数据库到一定时间点,恢复数据库过程需要数据库重启。
1.查看是否开启Flashback和force_logging功能:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418968443k93x.jpg)
2.重启数据库到mount状态,开启Flashback和force_logging功能:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418968458Itpw.jpg)
![](http://blog.itpub.net/attachment/201412/19/26770925_1418968481118n.jpg)
3.查看当前数据库可以闪回到的时间:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418968541M8cM.jpg)
4.模拟误删除表:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418968523OSxv.jpg)
5.开启数据库到mount exclusive状态,恢复数据库到truncate表T之前的时间:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418968576chp2.jpg)
6.以“resetlogs”的方式打开数据库,查看数据是否被恢复:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418968597n3or.jpg)
二、利用Oracle表扫描机制恢复被Truncate的数据:
黄炜(fuyuncat:http://www.hellodba.com)提供了一个使用PLSQL编写的存储过程包来恢复被TRUNCATE的数据。
其原理基于TRUNCATE不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储段头和扩展段图)。也就是说,此时,其基本数据并未被破坏,而是被系统回收、等待被重新分配————因此,要恢复被TRUNCATE的数据,需要及时备份其所在的数据文件。
1.下载并部署存储过程包:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418977538PXpq.jpg)
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;
![](http://blog.itpub.net/attachment/201412/19/26770925_1418977566RYZ4.jpg)
3.拷贝出该数据文件到某处,比如D:\:
4.执行下列存储过程恢复表:
exec FY_RECOVER_DATA.recover_truncated_table('HH','ARTHAS',1,'D:\','D:\USERS01.DBF');
![](http://blog.itpub.net/attachment/201412/19/26770925_14189777476hbJ.jpg)
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:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981803VvR7.jpg)
4.打开ODU界面如下:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981493kA14.jpg)
5.载入并查看数据字典信息:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981387XXRW.jpg)
![](http://blog.itpub.net/attachment/201412/19/26770925_14189820138S2w.jpg)
可以看到,hh.arthas表所在的表空间号为4,数据段头部为4号文件的762号块。data object id为Obj#=77949。
6.扫描表空间的extent并输出表数据:
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981608Om4Y.jpg)
![](http://blog.itpub.net/attachment/201412/19/26770925_141898171489G9.jpg)
执行完后,会在ODU软件的DATA目录生成ctl、txt、sql文件。
7.进入cmd使用SQLLDR导入数据即可。
![](http://blog.itpub.net/attachment/201412/19/26770925_1418981336sB9k.jpg)