介绍
虽然我们在日常管理数据库的工作中会非常小心、谨慎,但有时候还是会因为某些压力,导致误执行了错误的命令,删除了不该删的数据。如果误执行了delete命令,那也还好,我们都知道能够通过UNDO来找回数据,但如果是TRUNCATE,那又该怎么办呢?
这个时候你可能想到使用之前的RMAN备份或逻辑备份文件来恢复数据,在有备份的情况下的确可以使用这类方法,但部分现场环境没有备份或还未来得及备份,那又该怎么办呢?
这时,你可能已经开始想走哪条路跑了。我告诉你,别急,TRUNCATE表中的数据后还是有很多种方法可以找回被TRUNCATE掉的数据,诸如:
- odu、Parnassus、AUL等收费软件
- FY_Recover_Data包
接下来我们就简单聊聊FY_Recover_Data包是怎么恢复TRUNCATE表数据,以及它的用法。
FY_Recover_Data
FY_Recover_Data包是Fuyuncat(Wei Huang)大佬开发出来的一个PL/SQL软件包,主要是通过构造一个结构相同并具有完整元数据信息
和已格式化的用户数据块的傀儡表对象,然后将被TRUNCATE的用户数据块找到,再将其数据内容部分嫁接到傀儡对象的用户数据块中,让Oracle以为这是傀儡对象的数据,就可以让Oracle扫描并读出数据内容。
虽然FY_Recover_Data包已经很厉害了,但在恢复TRUNCATE数据上还是有一定的局限性。诸如:
- 表被TRUNCATE,没有执行任何其他操作,数据可以正常恢复。
- 表被TRUNCATE,插入了新的数据,新插入的数据比TRUNCATE之前多,则数据无法恢复TRUNCATE之前的。
- 表被TRUNCATE,插入了新的数据,新插入的数据比TRUNCATE之前少,则数据无法恢复TRUNCATE之前的。
- 表被TRUNCATE,与之相同的数据文件被覆盖,则只能恢复部分TRUNCATE的数据。
因此,在误删数据之后,首先要做的就是先将其表空间修改为只读,避免数据块被覆盖,从而导致用户数据块无法被傀儡表嫁接,进而无法恢复数据。
方案
说明:
本方案使用VMware虚拟机搭建一台CentOS 7.9的服务器,并安装了Oracle 11.2.0.4版本的数据库。
测试数据使用dba_objects创建了一张表test1.truncate_table,目前表中记录数86262。
执行了truncate table语句,数据已被清空。
1、引入FY_Recover_Data包
将下载好的FY_Recover_Data包放入到数据库服务器中,并以sysdba权限进入到sqlplus中,导入FY_Recover_Data包。我这里已将zip包放在数据库服务器的/usr/local/src目录下,解压并授权给了oracle用户。
以sysdba权限进入sqlplus命令窗口
[oracle@localhost src]$ sqlplus / as sysdba
导入FY_Recover_Data包
SQL> @FY_Recover_Data.pck
2、恢复表
SQL> set time on
11:34:29 SQL> set serveroutput on
11:34:37 SQL> exec fy_recover_data.recover_truncated_table('TEST1','TRUNCATE_TABLE');
3、还原数据至原表
将临时表的数据插入到原表中。
insert into test1.truncate_table
select * from TEST1.TRUNCATE_TABLE$$;
commit;
4、删除表空间
删除恢复表时自动创建的FY_REC_DATA和FY_RST_DATA表空间。
drop tablespace FY_REC_DATA including contents and datafiles;
drop tablespace FY_RST_DATA including contents and datafiles;
错误
1、导入包时提示“Enter value for files:”
描述:
此错误是因为FY_Recover_Data.pck脚本中第30行的“&”符号删除掉,然后重新导入脚本。脚本的第30行有“&”符号,导致Oracle以为是有变量要输入,才会报错。
解决方法:
将FY_Recover_Data.pck脚本中第30行的“&”符号删除掉,然后重新导入脚本。
评论区