Oracle数据回滚

最近在修复一个比较老的项目报表的bug的时候,因为对该项目不太熟悉,导致生产环境数据修改有误,于是求助导师帮忙回滚数据,现学习一下Oralce数据回滚以备不时之需。

查看某个时间点的表的数据 

select * from 表名  as of timestamp to_timestamp('2019-04-15 22:00:38', 'yyyy-mm-dd hh24:mi:ss');

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

alter table 表名 enable row movement;

关闭闪回,回滚数据之后需要进行关闭

alter table 表名 disable row movement;

闪回表数据到某个时间点

flashback table 表名 to timestamp TO_TIMESTAMP('2019-04-15 22:00:38', 'yyyy-mm-dd hh24:mi:ss');

drop表

drop table 表名;

查询数据库回收站记录

select object_name,original_name, type from user_recyclebin;

查询被删除的表对象

上面的object_name便是这里被删除的表在数据库回收站中的临时表名BIN$djh3J69WQfGWda1D76/9NA==$0

select * from "BIN$djh3J69WQfGWda1D76/9NA==$0"; 

闪回恢复被删除的表对象

FLASHBACK TABLE 表名 TO BEFORE DROP;

查看 DELETE 及 UPDATE 操作修改的数据

SELECT *
FROM 表名 AS OF TIMESTAMP  to_timestamp('2019-04-16 21:43:38', 'yyyy-mm-dd hh24:mi:ss')
MINUS
SELECT *
FROM 表名;

恢复 DELETE 及 UPDATE 操作修改的数据

将恢复 表至 2019-04-16 21:43:38 时点,恢复数据为因 DELETE 及 UPDATE 操作修改的数据。

注意:需要通过唯一条件id 定位数据。

MERGE INTO 表名 a
USING (SELECT *
         FROM 表名 AS OF TIMESTAMP to_timestamp('2019-04-16 21:43:38', 'yyyy-mm-dd hh24:mi:ss')
       MINUS
       SELECT *
         FROM 表名) b
ON (a.id = b.id)
WHEN MATCHED THEN
  UPDATE
     SET a.col = b.col,
WHEN NOT MATCHED THEN
  INSERT
  VALUES
    (b.id,
     b.col);

查看 INSERT 操作修改的数据

SELECT *
FROM 表名
MINUS
SELECT *
FROM 表名 AS OF TIMESTAMP  to_timestamp('2019-04-16 21:45:38', 'yyyy-mm-dd hh24:mi:ss');

恢复 INSERT 操作修改的数据

其中将恢复 表至 2019-04-16 21:45:38 时点,恢复数据为因 INSERT 操作修改的数据。

注意:需要通过唯一条件 unique_id 定位数据。

DELETE FROM 表名 a
WHERE EXISTS (SELECT 1
          FROM (SELECT *
                  FROM 表名
                MINUS
                SELECT *
                  FROM 表名 AS OF TIMESTAMP to_timestamp('2019-04-16 21:45:38', 'yyyy-mm-dd hh24:mi:ss')) b
         WHERE a.id = b.id);

如果相隔时间过长的话,数据就回滚不了了,所以一旦数据出现问题,就要立即进行处理。

参考博客

Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点 - autopenguin - 博客园

https://www.jb51.net/article/147509.htm

回滚操作是Oracle数据库中常见的操作之一,但是如果回滚数据量很大或者回滚的事务等待时间过长,就会导致Oracle响应变慢,甚至出现长时间无响应的情况。以下是一些可能的解决方法: 1. 提高回滚段的大小:可以通过增加回滚段的大小来提高回滚性能,从而加快回滚操作的速度。可以使用如下命令来增加回滚段的大小: ALTER ROLLBACK SEGMENT segment_name ADD DATAFILE 'datafile_name' SIZE size; 2. 使用更快的存储设备:可以将回滚段放置在更快的存储设备上,如固态硬盘,以提高回滚性能。 3. 优化SQL语句:如果发现回滚操作主要是由于某个SQL语句引起的,可以通过优化SQL语句来减少回滚数据量,从而提高回滚性能。 4. 调整Undo_retention参数:可以通过调整Undo_retention参数来减少回滚操作的时间。该参数控制了回滚段中事务的最长存活时间,如果该时间过长,回滚操作的速度就会变慢。 5. 增加回滚段的数量:可以通过增加回滚段的数量来提高回滚性能,从而减少回滚操作的时间。 6. 使用Flashback技术:如果Oracle数据库支持Flashback技术,可以使用该技术来快速回滚数据,从而加快回滚操作的速度。 以上是一些可能的解决方法,但具体应该根据实际情况进行选择。如果问题持续存在,建议联系Oracle技术支持或专业的数据库管理员进行进一步的诊断和解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值