一、安装FY_Recover_Data
下载地址:https://hellodba.com/reader.php?ID=191&lang=CN
[root@myoracle ~]# unzip FY_Recover_Data.zip
[root@myoracle ~]# mv FY_Recover_Data.pck /home/oracle/
[root@myoracle oracle]# chown -R oracle.oinstall FY_Recover_Data.pck
SQL> @/home/oracle/FY_Recover_Data.pck
二、原理
如果我们已有一套元数据及数据块,尝试用被 TRUNCATE 的用户数据块内容取代另一处的用户数据块内容,是否能够 “蒙骗” Oracle 使其读出这些数据呢?回顾表扫描的过程,此方法似乎可行。只需设法构造一个结构相同且具备完整元数据信息以及格式化了的用户数据块的傀儡表对象。接着找出被 TRUNCATE 的用户数据块,再将其数据内容部分嫁接到傀儡对象的用户数据块上,让 Oracle 误以为这是傀儡对象的数据,如此便能促使 Oracle 进行扫描并读出数据内容。
+-------------------------+
| Copy Of Dummy Data File |
| (With Formmated Blocks)|
+-------------------------+
||
\/
(Blcok Header, Block Tail)
||
\/
+-------------------+ +----------------+ Table Scan +---------------+
| Source Data File | => (Data Block Content) => | Dummy Table | ============> | Restore Table |
|(Without Meta Data)| |(With Meta Data)| +---------------+
+-------------------+ +----------------+
三、测试
(一)模拟新增数据
SQL> create table test as select * from dba_objects;
SQL> select count(*) from test;
(二)模拟truncate误删除
SQL> truncate table test;
SQL> select count(*) from test;
(三)用工具进行恢复
SQL> exec fy_recover_data.recover_truncated_table('SYS','TEST');
根据恢复日志,会创建临时中转表test
和
t
e
s
t
和test
和test
,恢复的数据保存在
t
e
s
t
,恢复的数据保存在test
,恢复的数据保存在test$中
SQL> select count(*) from test$$;
SQL> insert into test select * from test$$;
SQL> select count(*) from test;
四、总结
对于使用工具fy_recover_data进行数据恢复,需要确保:
①truncate之后,需要保证没有新的数据进入表中,否则无法还原;
②存放该表的数据文件块不能被覆盖,否则无法完整还原数据。
在发生故障后,可以迅速使用:
SQL> alter tablespace users read only;
SQL> alter tablespace users read write;
来关闭/开启表空间的写功能,这样可以保证数据文件不会被覆写。这个也比较鸡肋了,适用的场景有限,大家可以根据场景不同来进行数据的恢复。
参考链接:https://www.cnblogs.com/lijiaman/p/12747658.html
https://hellodba.com/reader.php?ID=191&lang=CN
欢迎关注公众号《小周的数据库进阶之路》,更多精彩知识和干货尽在其中。