Orcacle回滚update操作之前的数据(手残党的必须收藏!!!)

如果数据库不注意改错了数据提交了,还能不能回滚数据呢?

我们先来看个过程:现在有一个数据结构

create table ABCS
(
  UPDATE_DATE           DATE not null,
  EMPOLYEE_NAME     NVARCHAR2(80),
  SALARY                       NUMBER
)
 
INSERT INTO ABCS VALUES (2020/7/1,    张三,    12);
INSERT INTO ABCS VALUES (2020/7/2,    张三,    11);
INSERT INTO ABCS VALUES (2020/7/2,    李四,    20);
INSERT INTO ABCS VALUES (2020/7/1,    张三,    20);
INSERT INTO ABCS VALUES (2020/7/1,    张三,    20);
INSERT INTO ABCS VALUES (2020/6/1,    张三,    12);
INSERT INTO ABCS VALUES (2020/6/1,    李四,    10);
INSERT INTO ABCS VALUES (2020/6/2,    张三,    11);
INSERT INTO ABCS VALUES (2020/6/2,    李四,    20);
INSERT INTO ABCS VALUES (2020/6/1,    张三,    20);
 

1.有10条数据,现UPDATE所有数据的SALARY字段都加1。

update abcs sb set sb.salary=sb.salary+1 ;
查询结果:

2.使用as of timestamp to_timestamp查询更新之前的数据,下面可以查到14点50以前修改前的状态

select * from abcs as of timestamp to_timestamp('2020-07-17 14:50:00', 'yyyy-mm-dd hh24:mi:ss');
查询结果:

3.执行回滚,这两部执行完之后就能恢复到update之前的状态了

-- 开启移动数据命令
alter table abcs enable row movement;
--正式回滚 update 语句前的数据
flashback table abcs to timestamp to_timestamp('2020-07-17 14:00:00', 'yyyy-mm-dd hh24:mi:ss');
 

4.以上3部是基本的操作,当然也能只查询部分之前修改的状态,如下,我只查询修改前名字叫张三的数据。

select *
  from (select *
  from abcs sb
 where sb.empolyee_name = '张三' ) as of timestamp
 to_timestamp('2020-07-17 14:50:00', 'yyyy-mm-dd hh24:mi:ss');
运行结果:

注意:

1.因为是回滚到指定时间的状态,所以这种方式只适用于UPDATE后期间这张表的数据没有经过其他修改的情况使用哦。

2.在数据量特别大的情况下:添加过滤条件查询UPDATE之前的数据可能会会出现下面的错误

    ORA-01555说明: 快照过旧,是数据库中很常见的一个错误,比如当我们的事务需要使用undo来构建CR块的时候,而此时对应的undo 已经不存在了, 这个时候就会报ORA-01555的错误。

这里呢主要是由于时间过长update之前的数据已丢失,所以查询不到UPDATE之前的数据状态导致这个过程无法进行。
 

猜你喜欢

转载自blog.csdn.net/tzydzj/article/details/114263508
今日推荐