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错误。
还没有评论,来说两句吧...