暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
FY_Recover_Data.pdf
1146
9页
2次
2022-08-18
10墨值下载
FY_Recover_Data介绍
FY_Recover_Data是国内OracleACE大佬黄玮(个人网站:http://www.hellodba.com
开发的一个package,该脚本专门用于对truncate的表进行恢复。
Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据
的工具包。由纯PLSQL编写。
FY_Recover_Data原理:
首先,我们分析一下TRUNCATE的过程。TRUNCATE不会逐个清除用户数据块上的数
据,而仅仅重置数据字典和元数据块上的元数据(如存储段头和扩展段图)。也就是说,此
时,其基本数据并未被破坏,而是被系统回收、等待被重新分配————因此,要恢复被
TRUNCATE的数据,需要及时备份其所在的数据文件。
然后,再分析一下表扫描的过程Oracle会读取段头的元数据,获得高水位线等信息,
然后读取高水位线以下被格式化的数据块。因此,理论上讲,如果能够将被重置的元数据和
元数据块重新构造出来,就能使数据能被重新读取。然而,要完成这个任务,难度相当大
————要找出原有的所有元数据块被保证其每个字节与被TRUANCATE之前完全相同
————看起来似乎是一个不可能完成的任务。
不过,我们可以换一角度来找方法————如果我们已经有一套元数据及数据块,然
后将被TRUNCATE的用户数据块的内容取代其用户数据块的内容,是否可以“骗”过
Oracle,让它读出这些数据呢?
回顾一下表扫描的过程,这个方法应该是可行的。我们只要想办法构造出一个结构相
同、且具有完整元数据信息和格式化了的用户数据块的傀儡表对象,然后将被TRUNCATE
的用户数据块找出,再将其数据内容部分嫁接到傀儡对象的用户数据块,使Oracle以外这
是傀儡对象的数据,就能让Oracle扫描并读出数据内容。其原理用图示描述如下:
1 +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
2 |CopyOfDummyDataFile|
3 |(WithFormmatedBlocks)|
4 +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
5 ||
6 \/
7 (BlcokHeader,BlockTail)
8 ||
9 \/
10 +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐++‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+TableScan+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
11 |SourceDataFile|=>(DataBlockContent)=>|DummyTable|========
====>|RestoreTable|
12 |(WithoutMetaData)||(WithMetaData)|+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
13 +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐++‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
原理取自作者:移花接木————利用Oracle表扫描机制恢复被Truncate的数据[HelloDBA.COM]
FY_Recover_Data对于表恢复的支持性如下:
压缩表 支持
索引组织表 支持
分区表 支持
行链接/行迁移 不支持
标准SQL类型 支持
BLOB/CLOB 支持StoreinRow
离线恢复 支持
操作系统平台 全部
数据库版本 9i以上
开始测试:
1、数据准备:
1 ‐‐创建测试用户:
2 createtablespacetwo_datdatafile'/u01/oracle/oradata/two_dat.dbf'size
1024m;
3 createusertwoidentifiedbytwodefaulttablespacetwo_datquotaunlimi
tedontwo_dat;
4 grantconnect,resourcetotwo;
5 SQL>conntwo/two
6 Connected.
7 ‐‐创建测试表
8 SQL>DROPTABLEt1PURGE;
9 Tabledropped
10 SQL>createtablet1
11 (
12 idnumber,
13 name_idnumber,
14 create_datedate,
15 sexvarchar2(1),
16 remarkvarchar2(100)
17 );
18 Tablecreated
19 SQL>‐‐创建自增序列
20 SQL>DROPSEQUENCEt1_seq;
21 Sequencedropped
22 SQL>CREATESEQUENCEt1_seq
23 STARTWITH1
24 MAXVALUE99999999
25 MINVALUE0
26 CYCLE
27 CACHE10
28 ORDER;
29 Sequencecreated
30 SQL>‐‐创建随机数据插入存储过程,其中col1列单调递增
31 SQL>createorreplaceprocedurep_insert_t1(insert_numNUMBERDEFAULT1
000)as
32 v_col1NUMBER;
33 BEGIN
34 FORiIN1..insert_numLOOP
35 selectt1_seq.nextvalINTOv_col1fromdual;
36 insertintot1(id,name_id,create_date,sex,remark)
37 values
38 (v_col1,
39 (selectround(dbms_random.value(10000,100000000))fromdual),
40 sysdate,
41 (selectround(dbms_random.value(0,1))fromdual),
42 (selectdbms_random.string('a',100)fromdual));
43 ENDLOOP;
44 commit;
45 endp_insert_t1;
46 /
47 Procedurecreated
2、包导入:
包下载:FY_Recover_Data.rar-墨天轮资源(modb.pro)
1 SQL>@/home/oracle/FY_Recover_Data.pck
2 Packagecreated.
3 Packagebodycreated.
3、离线文件测试恢复:
当你不小心truncate了一张表数据后,可以立即将其所在表空间的数据文件拷贝出来。然后利用
Fy_Recover_Data的离线数据文件恢复功能恢复数据。这样可以使数据损失降到最低(记住,当表
被truncate后,其数据块立即被系统收回,并可能随时被分配给其他对象)。
1 SQL>execp_insert_t1(10000);
2 PL/SQLproceduresuccessfullycompleted.
3 SQL>selectcount(*)fromt1;
4 COUNT(*)
5 ‐‐‐‐‐‐‐‐‐‐
6 10000
of 9
10墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文档被以下合辑收录

评论