当某个表的数据有误删或误改的操作,如果记录已经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
alter table 表名 enable row movement;
闪回表数据到某个时间点
1
flashback table 表名 to timestamp TO_TIMESTAMP('2012-09-20 10:00:00', 'yyyy-mm-dd hh24:mi:ss');
关闭闪回
1
alter table 表名 disable row movement;