Orcacle回滚update操作之前的数据
程序员文章站
2022-06-24 22:42:57
如果数据库不注意改错了数据提交了,还能不能回滚数据呢?我们先来看个过程:现在有一个数据结构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 VALU...
如果数据库不注意改错了数据提交了,还能不能回滚数据呢?
我们先来看个过程:现在有一个数据结构
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