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;