共计 1228 个字符,预计需要花费 4 分钟才能阅读完成。
从 9i 开始,Oracle 提供了闪回(FLASHBACK)功能。使用 FLASHBACK TABLE 语句从撤消段中(undo segment)读取该表的过去映像,并利用 Oracle9i 中引入的回闪查询重建表行。UNDO_RETENTION 给出了闪回支持的最小时间。也就是说,FLASHBACK 最少可以支持 UNDO_RETENTION 给出的时间,如果系统比较闲,则可以闪回更长的时间。(当然,如果回滚表空间的空间分配不足,当系统处于忙时,有可能重用还没有达到 UNDO_RETENTION 时间限制的数据的空间)。使用闪回的一个前提是表不能进行 DDL 操作。不但不能对 DDL 操作进行回闪,而且,也无法闪回到 DDL 操作以前的数据了。
一.delete 误删
方法 1:如果表结构没有改变,直接闪回整个表,具体步骤:
– 首先需要表闪回权限,开启行移动功能
alter table 表名 enable row movement;
– 执行闪回恢复表数据到某个时间点
flashback table 表名 to timestamp to_timestamp(‘恢复的时间点 ’,’yyyy-mm-dd hh24:mi:ss’);
– 关闭行移动功能
alter table 表名 disable row movement;
方法 2:查询被删除数据,再执行 insert
insert into 表名 (select * from 表名 as of timestamp to_timestamp(‘ 恢复的时间点 ’,’yyyy-mm-dd hh24:mi:ss’));
二.drop 误删
原理:由于 oracle 在删除表时,没有直接清空表所占的块,oracle 把这些已删除的表的信息放到了一个虚拟容器“回收站”中,而只是对该表的数据块做了可以被覆写的标志,所以在块未被重新使用前还可以恢复。
1. 如果记得被删的表名,直接闪回
flashback table 原表名 to before drop;
2. 不记的表明,先从“回收站”找到呗删除的表,再执行恢复:
— 查询被删除的表,table_name 或者 object_name 就是删除后在回收站中被重新命名的表名
select table_name,dropped from user_tables;
select object_name,original_name,type,droptime from user_recyclebin;
— 执行恢复
flashback table “ 回收站中的表名 ” to before drop rename to 新表名;
三. 闪回整个数据库
alter database flashback on;
flashback database to scn SCNNO;
flashback database to timestamp to_timestamp(‘ 恢复的时间点 ’,’yyyy-mm-dd hh24:mi:ss’);
更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12