Oracle误更新/删除 数据恢复

Oracle都带有回滚机制,在更新数据后历史数据会放在一个类似于独立的磁盘中的flashback返回区,这个返回区的容量一般是由dba设定,大多数公司都会设定在业务数据存储量的两天时间以上的容量,即可以还原两天内操作前的原数据。

昨天我处理业务数据的时候不小心误更新了300条数据,导致部分异常,所以本次我来检讨一下自己并写一下处理方案。

由于Oracle有flashback返回区存储更新前的数据,所以我们提交了脚本也可以在返回区存储时间范围内进行数据回滚;具体返回区原理这里不多做说明;

回滚操作:

首先我们先要判断回滚时间点。数据库是没有办法查看字段最后一次操作时间的,所以一般按照业务要求时间作为回滚回去的时间。如

我是昨天早上10点左右收到了邮件要求更新数据,今天早上9.30邮件告知数据更新异常并影响其他;所以此次回滚我回滚到昨天10点以前,我定在9.30.

语句:

select commodityid, provincecode
  from t_commodity_exchangescope as of timestamp sysdate - 1 
 where commodityid = '197289';
说明:查询昨天这个时间的数据情况,此次我更新了commodityid, provincecode这两个字段,所以我只查这个两个字段,查看历史时间数据关键词是 as of timestamp  查看时间范围是 sysdate- 1440/1440 这里1440是分钟,比如我要查看3分钟以前的数据 sysdate-3/1440,由于我要查看一天前的数据所以 sysdate-1;不加where条件会全表查看,为了提高处理效率我只选择查看我更新过的数据: where commodityid = '197289';

这里我们可以得出一个结论是:我们能够查询出操作时间前的数据,对于support来说能够快速判断修改的数据是否异常;

查询结果为昨天当前时间的数据状态,我们可以把他还原(更新)到当前表中:

update t_commodity_exchangescope set provincecode=(
select  provincecode
  from t_commodity_exchangescope as of timestamp sysdate - 1
 where commodityid = '197289'
)where commodityid = '197289'

同理我们如果是误删了,可以insert语句进行插入;

这里我要说明如果dba在操作的时候,有多个用户,我们要得到相关权限才能查询历史数据,如果不知道怎么授权最好用system账户进行还原。权限不够的情况下查询历史数据会报ORA-01031: insufficient privileges错误。

猜你喜欢

转载自blog.csdn.net/qq_21108311/article/details/81092500