当前位置: 移动技术网 > IT编程>数据库>其他数据库 > Orcacle回滚update操作之前的数据

Orcacle回滚update操作之前的数据

2020年07月18日  | 移动技术网IT编程  | 我要评论

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

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

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之前的数据状态导致这个过程无法进行。

具体原因可以查看解说非常详细:https://blog.csdn.net/lxpbs8851/article/details/7108705/

 

 

本文地址:https://blog.csdn.net/baidu_39186435/article/details/107408215

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网