侧边栏壁纸
博主头像
与晚风述往事博主等级

万般皆下品,唯有读书高。

  • 累计撰写 149 篇文章
  • 累计创建 29 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

Oracle 误执行truncate语句后恢复数据方法

与晚风述往事
2022-07-13 / 0 评论 / 0 点赞 / 746 阅读 / 1,075 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-07-13,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

虽然我们在日常管理数据库的工作中会非常小心、谨慎,但有时候还是会因为某些压力,导致误执行了错误的命令,删除了不该删的数据。如果误执行了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。
image-1655955066276
执行了truncate table语句,数据已被清空。
image-1655955089905

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

image-1655954311150

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');

image-1655955390615

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:”

image-1655954098038

描述:
此错误是因为FY_Recover_Data.pck脚本中第30行的“&”符号删除掉,然后重新导入脚本。脚本的第30行有“&”符号,导致Oracle以为是有变量要输入,才会报错。

解决方法:
将FY_Recover_Data.pck脚本中第30行的“&”符号删除掉,然后重新导入脚本。

0

评论区