oracle truncate可以恢复吗,ORACLE 如何找回被truncate的表?

当表被truncate后,需要马上恢复。首先要做的就是关闭数据库所有应用,或者OFFLINE那个表所在的表空间。目的只有一个,确保空间不会被重用数据不会被覆盖。只要原来的空间

当表被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)提供了一个使用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/26770925/viewspace-1373582/

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754890877a5213128.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信