事情是这样的,一天中午,突然接到客户的电话,前台业务订单功能模块查询不到最近一个月的数据,通过工具登录到数据库系统也查询不到,怀疑是数据被误删除,需要帮助紧急恢复数据。
遇到这种情况,首先要有以下解决问题的思路:
(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误删除数据之后,数据库一直在运行,订单表时时有新数据产生,通过闪回查询查出来数据前,就已经通知客户关闭了应用,中间大概有一个小时的时间仍然有新数据产生,所以较为稳妥的方法是,新建一张和订单表表结构一样的表,将闪回查询出来的数,插入到新建的表里面,待业务和开发确认之后,在插回原来的订单表。




