在删除 Oracle 数据的时候不小心, 把 delete 语句执行错了, 把别的表给 delete, 而且还执行了 commit! 那么如何进行恢复呢, 下面介绍几种恢复方法.
第一种:
1. 打开 Flash 存储的权限
ALTER TABLE tableName ENABLE row movement ;
2. 把表还原到指定时间点
flashback table tableName to timestamp to_timestamp(''2018-03-16 10:40:00'',''yyyy-mm-dd hh24:mi:ss'');
后面的参数为要还原的时间点
第二种: 利用 ORacle 的快照进行查找某个时间点的数据
select * from tableName AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '100' MINUTE)
或
select * from tableName as of timestamp to_timestamp('2018-03-16 11:40:00','YYYY-MM-DD HH24:MI:SS');
这样可以查询到指定的时间段的数据, 再把查询到的数据复制到原来的表中.
第三种: 其他
删除表后, 可以采用如下操作: 在 查询表 user_recyclebin 最近操作过的表名称, 然后用闪回 (只能用于 10G 及以上版本).
- select * from user_recyclebin;
- FLASHBACK TABLE TABLE_NAME TO BEFORE DROP;
如果是删了或修改里面的数据, 可以先建立一个快表将删除修改之前状态的数据找回到这个表中:
CREATE TABLE QUICK_TABLE AS SELECT * FROM TABLE_NAME AS OF TIMESTAMP SYSTEM-1/24 (一小时前的), 减去的时间可以自己定.
第四: 通过 SCN 实现
SCN(系统改变号), 它的英文全拼为: System Change Number , 它是数据库中非常重要的一个数据结构.
SCN 提供了 Oracle 的内部时钟机制, 可被看作逻辑时钟, 这对于恢复操作是至关重要的
注释: Oracle 仅根据 SCN 执行恢复.
它定义了数据库在某个确切时刻提交的版本. 在事物提交时, 它被赋予一个唯一的标示事物的 SCN . 一些人认为 SCN 是指, System Commit Number , 而通常 SCN 在提交时才变化, 所以很多情况下, 这两个名词经常被交替使用.
究竟是哪个词其实对我们来说并不是最重要的, 重要的是我们知道 SCN 是 Oracle 内部的时钟机制, Oracle 通过 SCN 来维护数据库的一致性, 并通过 SCN 实施 Oracle 至关重要的恢复机制.
1: 执行下面语句, 将删除时间转换为 scn
select timestamp_to_scn(to_timestamp('2018-03-16 10:00:00','YYYY-MM-DD HH:MI:SS')) from dual;
结果: 11837812: 在将 table 的 scn 点取出来.
select * from moAS OF SCN 11837813;
最后把查出来得结果 insert 到原表中
insert into mo select * from mo AS OF SCN 1183781
来源: http://www.linuxidc.com/Linux/2019-09/160608.htm