今天在公司测试环境的数据库服务器执行了一条update语句,由于失误没有执行到where限定条件,导致将整个表的数据更新成了一样的,而且当时没有发现,提交了事务。导致整个系统崩塌,测试组直接炸了。虽然只是测试环境,但是也要引以为戒。
问题发现之后,想到可以用Oracle的闪回来实现数据恢复;同时在网上也发现许多人也踩过这种坑,比如以下这两篇博客中记录的:
https://blog.csdn.net/weixin_43474476/article/details/107484706/
https://blog.csdn.net/qq2712193/article/details/86018578
闪回操作如下:
通过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 用户名;
--正常情况下是要加上逐渐限定的比如这样: UPDATE emp SET job = 'abbc' WHERE empno = 7369; --假设此时没有写限定条件: UPDATE emp SET job = 'abbc' ; COMMIT;
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);
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;