Oracle 数据误删或误改后恢复方法

当某个表的数据有误删或误改的操作,如果记录已经commit,此时要进行数据回滚的话有两种常用方式:闪回和查看数据快照。

查看数据快照

如果我们知道哪些数据误删或误修改了,那我们可以查看表的数据快照中的数据,通过对比,将变更的记录恢复回去。
查看的语句:

1
2
3
4
5
-- 查看100分钟之前的数据
select * from tablename as of timestamp  (SYSTIMESTAMP - INTERVAL '100' MINUTE);

-- 查看指定时间的数据
select * from tablename as of timestamp to_timestamp('2021-07-21 10:30:00','YYYY-MM-DD HH24:MI:SS');

我们可以将快照中的数据复制到一个临时表,将有变更的数据从临时表中更新回原表,这样就达到了恢复的效果。

1
2
-- 将3小时之前的数据复制到临时表
create table 临时表 as select * from tablename as of timestamp  (SYSTIMESTAMP - INTERVAL '3' HOURS);

闪回

闪回方式可以将一个表回退到某一个时间点,缺点是整个表数据都会回退,不能只回退误操作的部分。
在进行数据回滚前,可以先查看回滚时间点数据快照的数据情况,确认之后就可以开始进行数据回滚操作了。

  1. 开启闪回,如果不开启无法进行闪回

    1
    alter table 表名 enable row movement;
  2. 闪回表数据到某个时间点

    1
    flashback table 表名 to timestamp TO_TIMESTAMP('2012-09-20 10:00:00', 'yyyy-mm-dd hh24:mi:ss');
  3. 关闭闪回

    1
    alter table 表名 disable row movement;
------ 本文完 ------