解析oracle二进制文件格式,OracleRedoLog-二进制格式分析,文件头,DML,DDL

解析oracle⼆进制⽂件格式,OracleRedoLog-⼆进制格式分
析,⽂件头,DML,DDL
上篇⽂章,简单介绍了 RedoLog 是什么,以及怎么从 Oracle Dump ⼆进制⽇志。接下来,分析下 Redo Log ⼆进制⽂件的格式,主要包括:⽂件头,重做⽇志头,DML-INSERT 操作,DDL-CREATE 操作。
Redo Log ⼆进制⽂件中,采⽤的是⼩端序字节序。
1. File Header
⽂件头,占⽤第⼀个块。Oracle 中许多⼆进制的数据和⽇志⽂件都有相似的格式,在线⽇志 Redo Log ⽂件也是如此。下图是 RedoLog ⽂件开始的前 80 字节。
File Type
前 2字节 表⽰⽂件类型,区分不同的 Oracle ⽂件,⽐如,在 10g 版本中:
0xA2 表⽰数据⽂件,Data File
环氧大豆油0xC2 表⽰控制⽂件,Control File
0x22 表⽰重做⽇志⽂件,Redo Log File
Oracle 数据库其实就是由⼀堆⽂件组成的。
混凝土结构设计规范2010
Block Size
偏移量 20,长度 2字节,存储的是块⼤⼩,它的值是固定的,只会因操作系统⽽不同。在 Windows, Linux 和 Solaris 上,块⼤⼩为512字节–0x0200,⽽ HP-UX 的块⼤⼩为 1024。
平望实验小学另外,每个块都有⼀个 16字节 的块头,稍后会介绍它。
Number of Blocks
偏移量 24,长度 4字节,存储的是⽂件中的块数,不包括⽂件头本⾝使⽤的块,可以这样计算出整个⽂件的⼤⼩:
(0x00019000 + 1) * 512 = 52429312 (50MB)
复制代码
Magic
魔数只是⽂件标识,⽤来检查是否是 Oracle ⽂件。
Block Header共享雨伞现身杭州
每个块都有⼀个 16字节 的头部,即使⼀个 Redo Record 横跨多个块,解析时这⼀点尤为重要。
上图黄⾊指⽰的是⼀个头部⽰例,每个块头都是以签名 0x0122 开头,其中:
偏移量 4,长度 4字节,存储的是块在⽂件中的编号
偏移量 8,长度 4字节,存储的是⽇志序号
偏移量 12,长度 1字节,存储的是 Record 在该块内的字节偏移量
这三个值正好是 Record 的 RBA 内容。
最后偏移量 14,长度 2字节,存储的是校验和,⽤于验证数据是否完整,验证的逻辑这⾥就不记录了,感兴趣的可以在上篇描述的 PDF
⽂件内到。
2. Redo Log Header
重做⽇志头,占⽤第⼆个块。这⾥包含的信息就多了,如数据库SID,数据库版本和开始记录的时间等。
3. Redo Record
Redo Record 包含⼀个 SCN 中的所有操作,由⼀个头和⼀个或多个 change vector 组成。⽐如往⼀个有索引的表中插⼊⼀条数据,会创建以下内容:
为 INSERT 操作,分别创建 redo change 和 undo change
为索引改动,分别创建 redo change 和 undo change
⼀个事务开始 change,⼀个事务提交 change
其中的每个 Change 都有⼀个操作码,⽤于区分,常见的操作码:
5.1:撤销修改 - Undo Record
5.2:事务开始
5.4:事务提交 - Commit
11.2:插⼊⼀⾏数据
11.3:删除⼀⾏数据
11.11:插⼊多⾏数据
11.19:更新多⾏数据
axara10.2:插⼊⼀个索引 - INSERT LEAF ROW
10.4:删除⼀个索引 - DELETE LEAF ROW
13.1:申请空间 - CREATE TABLE 后
24.1:DDL 操作
4. DML-INSERT
增删改是数据库基本操作,下图显⽰的是⼀个插⼊操作 Record 转成⼗六进制的信息。
Block 头的第 12 个字节 0x10,表⽰ Record 开始字节在偏移量 16字节 处;
Record 开始的前 2字节 表⽰长度,最⼤为 65536字节,因此它可能需要多个 block 存储。这⾥长度是 0x01A8=424 ⼀个 block ⾜以存储。之后的第4个字节是 Record 头长度标识 VLD,具体数值取决于 Record 类型,这⾥的 0x0D 表⽰头长度为 0x44=68;
跳过 0x44字节 就能到第⼀个 Change Vector,操作码是 0x0B02 - 11.2,即 INSERT 操作。在操作码后的第22字节,可以到插⼊对象的ID,这⾥是 0x0057 - 87,在字典表 dba_objects 查询 data_object_id=87 的记录可知插⼊的表为 SYS.SYSAUTH$;
跳过 0x44+0x18字节,开始的2字节 0x000C=12 表⽰第⼀个 Change 的元素长度列表的长度,元素长度占⽤ 2字节,12字节表⽰除头2字节外,总共有 (12-2)/2=5 个 长度元素,这意味着插⼊了 3个 字段内容。
0x0014和0x0031:这两个值是半固定的,表⽰ KTB 和 KDO 的长度
0x0002:表⽰插⼊第⼀列的数据字节数为 2字节
0x0002:表⽰插⼊第⼆列的数据字节数也为 2字节
0x0003:表⽰插⼊第三列的数据字节数为 3字节
上⾯的长度计算的是实际长度,但在计算偏移量是都需要 4字节对齐。跳过指定的字节后,可以得到三个字段的值为:
0xC102:表⽰的内容为 数字 1
0xC105:表⽰的内容为 数字 4
0xC20931:表⽰的内容为 数字 848
结合 SYSAUTH$ 的字段就能还原 SQL:
SQL> INSERT INTO SYS.SYSAUTH$ (GRANTEE#,PRIVILEGE#, SEQUENCE#) VALUES (1,4,848);
复制代码
再往后有两个 Change,0x0502 和 0x0501。0x0502 可以解析出此次事务的 XID;0x0501 是撤销操作,INSERT 对应的就是DELETE。
5. DDL-CREATE
虽然 DDL 语句已写⼊ Redo Log ⽂件中,但是在使⽤ ALTER SYSTEM DUMP LOGFILE 命令后,结果中没有语句,内容如下:
REDO RECORD - Thread:1 RBA: 0x000082.0000febf.002c LEN: 0x00f4 VLD: 0x01
SCN: 0x0000.003a061f SUBSCN: 1 03/13/2007 13:55:41
CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ: 0 OP:24.1
复制代码
操作码 24.1 表明是 DDL 操作。从 RBA 中,可以看到块编号为 0x0000febf (65215),块⼤⼩为 512,所以该操作在⼆进制⽂件的偏移量为 512*65215=33390080 ,⼗六进制为 0x01FD7E00:
轻芳烃可以清楚的看到 DDL 语句:
create user wiggywiggywiggy identified by VALUES '2FA1749D698AD874'
复制代码
对应⼆进制格式映射信息是:
6. 总结
本⽂简单描述了⼆进制格式具体是什么,实际分析的时候也是这样,把⼆进制⽂件打开转成 16进制显⽰,⼀个字节⼀个字节的分析。如果做过⽹络编程,特别是 TCP 私有协议设计和解析,应该很容易理解。
下⼀篇会介绍解析的⼀些问题,⽐如 Record 头长度怎么计算,Rowid 怎么计算等等。

本文发布于:2024-09-21 03:24:45,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/325841.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字节   长度   进制   解析   格式   数据   数据库
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议