暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一条delete语句,造成数据误删后的恢复

数据管理员 2021-11-03
845

事情是这样的,一天中午,突然接到客户的电话,前台业务订单功能模块查询不到最近一个月的数据,通过工具登录到数据库系统也查询不到,怀疑是数据被误删除,需要帮助紧急恢复数据。

遇到这种情况,首先要有以下解决问题的思路:

(1)数据库的平台和版本,数据库是企业版还是标准版

(2)数据库有无备份,备份策略是什么

(3)找到是否是什么人在什么时间点做了什么操作

(4)对当前业务系统的影响有多大,是否对其它业务系统有影响

(5)测试环境复盘整个故障

(6)制定数据恢复方案,在测试环境验证恢复方案

(7)确保对生产环境的影响最小,确定回退方案

经过和客户沟通之后,总结以下信息

1,IBM p750 aix7.1,Oracle 11.2.0.4 企业版单实例数据库

2,仅有每天晚10点逻辑(expdp)备份,昨晚10点到今天下午2点新增的数据无任何备份

3,开发人员承认在delete时加错where条件,时间大概在13:30左右(真是一个诚实勇敢的好孩子)

4,如果使用每晚10点的备份在测试环境恢复,会丢失昨晚10点到今天下午2点的数据

进行到这里,传统的备份恢复会丢失一部分数据,这种恢复客户无法接受;那么,是否可以使用闪回技术呢,这个需要根据客户的实际情况来验证。从数据库层面上说,Oracle在10g版本的时候,已经全面支持闪回技术。接下来就是在客户环境上验证,闪回查询依赖于undo,在undo没有被复写的情况下,是可以根据时间查询出来的。


实验准备:

(1)创建一张表,插入点数据

SQL>create table sal (sal_id,int);


(2)模拟删除数据


(3)使用闪回查询查询出来结果如下图

    select *
    from sal as of timestamp to_date('2021-11-3 15:50:00', 'yyyy-mm-dd hh24:mi:ss')
    where sal_id <= 11;



    (4)使用insert插入回原表

      insert into sal
      (select *
      from sal as of timestamp to_date('2021-11-3 15:50:00', 'yyyy-mm-dd hh24:mi:ss')
      where sal_id <= 11);

      至此,delete删除后操作恢复完成!


      以上操作均是在测试环境,在实际的生产中,执行delete误删除数据之后,数据库一直在运行,订单表时时有新数据产生,通过闪回查询查出来数据前,就已经通知客户关闭了应用,中间大概有一个小时的时间仍然有新数据产生,所以较为稳妥的方法是,新建一张和订单表表结构一样的表,将闪回查询出来的数,插入到新建的表里面,待业务和开发确认之后,在插回原来的订单表。

      文章转载自数据管理员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论