Delete误删除数据恢复策略
将表数据恢复到指定scn(system change number)
-
查看数据库当前scn
select current_scn from v$database
-
逐步缩小scn号查询误删前的表数据
select * from ${schema_name.object_name} as of scn 1139437
-
设置允许表行移动
alter table ${schema_name.object_name} enable row movement
-
将表数据恢复到指定scn
flashback table ${schema_name.object_name} to scn 1139437
将数据恢复到某一时间点
-
根据时间戳查看表数据情况
select * from ${schema_name.object_name} as of timestamp to_timestamp('2018-09-17 09:50:11','yyyy-mm-dd hh24:mi:ss')
-
设置允许表行移动
alter table ${schema_name.object_name} enable row movement
-
将表数据恢复到某一时间点
flashback Table ${schema_name.object_name} to timestamp to_timestamp('2018-09-17 09:50:11','yyyy-mm-dd hh24:mi:ss')
Drop误删除数据恢复策略
通过查看Oracle的回收站,可以查到被删除的表、索引等,通过下列语句可以实现表数据恢复。
-
查询回收站是否存在误删的表记录
select count(*) from recyclebin where original_name=${table_name}
-
还原指定表
flashback table ${schema_name.object_name} to before drop
-
清空回收站
purge table ${schema_name.object_name}
Truncate误删除数据恢复策略
原理
通过元数据及数据块,然后将被TRUNCATE的用户数据块的内容取代其用户数据块的内容,以“骗”过Oracle,让它读出这些数据,实现数据恢复。
局限
- 经过测试,如果表被truncate后,未执行其它操作,数据可以使用fy_recover_data恢复回来。
- 如果表被truncate后新数据进入表,使用fy_recover_data包执行truncate恢复,发现返回的数据是truncate之后插入的数据。
- 如果表被truncate后,其所在表空间被覆盖,使用fy_recover_data包执行truncate恢复,发现返回的数据只有一部分。
操作过程如下
-
导入FY_Recover_Data.pck包
@/home/oracle/FY_Recover_Data.pck
-
开始执行恢复,只需要两个参数:schema和table_name
exec fy_recover_data.recover_truncated_table(schema_name,object_name)
-
根据恢复日志,会创建临时中转表object_name 和 o b j e c t n a m e 和object_name 和objectname ,恢复的数据保存在 o b j e c t n a m e ,恢复的数据保存在object_name ,恢复的数据保存在objectname$中,将数据还原到object_name表中
insert into object_name select * from object_name$$
-
确认数据已经还原回来
select count(*) from object_name
小结
对于使用工具fy_recover_data进行数据恢复,需要确保:
- truncate之后,需要保证没有新的数据进入表中,否则无法还原;
- 存放该表的数据文件块不能被覆盖,否则无法完整还原数据。
- 在发生故障后,可以迅速使用下面语句来关闭/开启表空间的写功能,这样可以保证数据文件不会被覆写。
例如:
SQL> alter tablespace users read only;
SQL> alter tablespace users read write;