Oracle闪回技术恢复误删除的表数据

8 篇文章 0 订阅

工作过程中在通过SQL处理表数据的时候可能一不小心就误删除、或者全表更新数据(事务已提交)后要怎么立即恢复原先的数据。不考虑利用备份文件和归档日志进行数据恢复,本文利用Oracle数据库闪回技术(flashback)进行数据恢复。

当失误操作并提交了事务之后,发现执行了错误的SQL误删了数据或全表更新了数据,应在最短的时间进行数据恢复,这期间时间越短恢复的数据是越精确。

查询数据库当前时间

得到最精确地SQL操作时间,防止数据库时间与电脑时间不一致,避免时间误差将数据恢复到错误时间节点。

select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') sys_date from dual;

查询执行了错误SQL时间点之前的数据

table_name 为需要回复数据的表。

select * from table_name as of timestamp 
to_timestamp('2019-11-21 20:09:52','yyyy-mm-dd hh24:mi:ss');

闪回(flashback)恢复数据

flashback table table_name to timestamp 
to_timestamp('2019-11-21 20:09:52','yyyy-mm-dd hh24:mi:ss');

上面SQL执行时可能会报出 ORA-08189:因为未启用行移动功能,不能闪回表 错误,如下图所示:
ORA-08189
需要执行以下命令,然后再次执行上面闪回SQL即可。

alter table table_name enable row movement;

注意事项

  1. 如果时间距离当前时间太早可能会报出 ORA-08180: 根据指定的时间没有发现快照 的错误,如下图所示:
    ORA-08180
  2. 如果时间在当前时间之后会报出 ORA-08186: 指定的时间戳无效 的错误,如下图所示:
    ORA-08186
  3. 实际生产环境中,一张数据表的操作不只是一个人在操作,系统可能也在不断的写表或者更新表数据,使用闪回技术可能会存在数据的问题。如果删除的数据量比较小发现的时候又有延迟(过了好一会才发现删除错误),可以采用查询到删除前的数据后重新插入数据表中。
--误删除数据的SQL
delete from table_name where id = '12345';

--恢复数据SQL(首先查出这个时间点包含之前删除的数据)
insert into table_name(
select * from table_name as of timestamp  
to_timestamp('2019-11-21 20:09:52','yyyy-mm-dd hh24:mi:ss') where id='12345');

  1. 查询某个表在某个时间点操作的SQL
    例如:在2019年11月21日对表T_SYS_USER进行的DELETE操作的执行的SQL。
select t.SQL_TEXT, t.FIRST_LOAD_TIME
from v$sqlarea t
 where t.FIRST_LOAD_TIME like '2019-11-21%'
 and t.SQL_TEXT like '%T_SYS_USER%'
 AND t.SQL_TEXT like 'DELETE%'
 order by t.FIRST_LOAD_TIME desc;
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值