敖胤

绳锯木断,水滴石穿;聚沙成塔,集腋成裘。

导航

Oracle闪回操作

一、引子

今天在公司测试环境的数据库服务器执行了一条update语句,由于失误没有执行到where限定条件,导致将整个表的数据更新成了一样的,而且当时没有发现,提交了事务。导致整个系统崩塌,测试组直接炸了。虽然只是测试环境,但是也要引以为戒。

问题发现之后,想到可以用Oracle的闪回来实现数据恢复;同时在网上也发现许多人也踩过这种坑,比如以下这两篇博客中记录的:

https://blog.csdn.net/weixin_43474476/article/details/107484706/

https://blog.csdn.net/qq2712193/article/details/86018578

闪回操作如下:

1.1、查询历史SQL及其执行时间

通过Oracle提供的视图“V$SQLAREA”可查询SQL语句执行的历史记录

SELECT R.FIRST_LOAD_TIME, R.*
  FROM V$SQLAREA R
 ORDER BY R.FIRST_LOAD_TIME DESC;

注:此时若提示V$SQLAREA视图不存在,表示当前用户权限不够,可以使用sysdba账户给用户添加权限

GRANT SELECT_CATALOG_ROLE TO 用户名;
1.1.1、查询emp表中的数据,可看到共有14行数据

1.1.2、此时,执行一条全表更新语句,并提交
--正常情况下是要加上逐渐限定的比如这样:
UPDATE emp SET job = 'abbc' WHERE empno = 7369;
--假设此时没有写限定条件:
UPDATE emp SET job = 'abbc' ;
COMMIT;

1.1.3、通过V$SQLAREA视图可以看到update执行的时间:

1.2、查询时间节点前某一个时间点表的数据

SELECT * FROM EMP/*表名*/ AS OF TIMESTAMP 
 TO_TIMESTAMP('2021 - 05 - 27 23 :28 :21', 'YYYY - MM - DD HH24 :MI :SS');
 
 --或者
SELECT * FROM EMP AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '2' MINUTE);

1.3、恢复表为目标表时间点状态

ALTER TABLE EMP/*表名*/ ENABLE ROW MOVEMENT;
FLASHBACK TABLE EMP/*表名*/ TO TIMESTAMP 
 TO_TIMESTAMP('2021 - 05 - 27 23 :28 :21', 'YYYY - MM - DD HH24 :MI :SS');
 
--或者
FLASHBACK TABLE emp TO TIMESTAMP SYSTIMESTAMP - INTERVAL '2' MINUTE;

posted on 2021-07-04 19:22  敖胤  阅读(753)  评论(0编辑  收藏  举报