Oracle RedoLog-二进制格式分析,文件头,DML,DDL
上篇文章,简单介绍了 RedoLog 是什么,以及怎么从 Oracle Dump 二进制日志。接下来,分析下 Redo Log 二进制文件的格式,主要包括:文件头,重做日志头,DML-INSERT 操作,DDL-CREATE 操作。
Redo Log 二进制文件中,采用的是小端序字节序。
原文链接:https://www.chuonye.com/archives/oracle-redolog-format.html
1. File Header
文件头,占用第一个块。Oracle 中许多二进制的数据和日志文件都有相似的格式,在线日志 Redo Log 文件也是如此。下图是 RedoLog 文件开始的前 80 字节。

File Type
前 2字节 表示文件类型,区分不同的 Oracle 文件,比如,在 10g 版本中:
0xA2表示数据文件,Data File0xC2表示控制文件,Control File0x22表示重做日志文件,Redo Log File
Oracle 数据库其实就是由一堆文件组成的。
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:更新多行数据
- 10.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:表示的内容为 数字 10xC105:表示的内容为 数字 40xC20931:表示的内容为 数字 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 怎么计算等等。
Oracle RedoLog-二进制格式分析,文件头,DML,DDL的更多相关文章
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- 第二讲,NT头文件格式,以及文件头格式
今天详解NT 头格式,以及文件头格式,以及作用, 关于DOS头文件格式,以及DOSStub昨天的博客已经写过了.主要是分散讲解.便于理解. 一丶最小PE的生成,以及标准PE的生成 ps: (如果直接学 ...
- 【.net 深呼吸】使用二进制格式来压缩XML文档
在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...
- myeclipse中java文件头注释格式设置
转载:http://www.blogjava.net/yxhxj2006/archive/2014/01/14/408940.html myeclipse中java文件头注释格式设置 windows ...
- .net下二进制序列化的格式分析[转]
.net下二进制序列化的格式分析[转] -- 综合应用 (http://www.Host01.Com/article/Net/00020003/) --- .net下二进制序列化的格式分析 (http ...
- XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)
XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...
- PE文件头格式解析
前言: 昨天写了一题de1ctf的题,发现要脱壳,手脱之后发现要iat修复,我就发现自己在这块知识缺失了,win逆向,好像一直都是打ctf,然后用逆向方法论去肝的 其他方面倒是没有很深入学习,但实际上 ...
- 【CTF杂项】常见文件文件头文件尾格式总结及各类文件头
文件头文件尾总结 JPEG (jpg), 文件头:FFD8FF 文件尾:FF D9PNG (png), 文件头:89504E47 文件尾:AE 42 60 82GIF (gif), 文件头:47494 ...
- go 读取BMP文件头二进制读取
BMP文件头定义: WORD 两个字节 16bit DWORD 四个字节 32bit package main import ( "encoding/binary" "f ...
随机推荐
- PyQt(Python+Qt)学习随笔:Designer中ItemViews类部件frameShape属性
老猿Python博文目录 老猿Python博客地址 frameShape属性是从QFrame继承的属性,对应类型为QFrame.Shape,该属性表示框架样式中的框架形状,有如下取值: 老猿Pytho ...
- 手把手教你爬取B站弹幕!
效果 输入要爬取的视频的BV号即可爬取该视频的弹幕. 过程 基本思路 基本的思路很简单,还是老步骤: 1.构造爬取的url 2.解析返回的数据 3.使用json或Xpath或正则表达式提取数据 4.保 ...
- Nessus破解没有Scan选项的解决办法
如图,安装之后无Scan选项,流程按照吾爱破解上的文章:https://www.52pojie.cn/thread-1140341-1-1.html 解决办法为: 首先nessus.license在安 ...
- js 彻底搞懂事件循环机制 Event Loop
我们都知道javascript是单线程语言,就是因为单线程的特性,就不得不提js中的同步和异步 一.同步和异步 所谓单线程,无非就是同步队列和异步队列,js代码是自上向下执行的,在主线程中立即执行的就 ...
- AcWing 362. 区间
听书上说有贪心 + 数据结构的做法,研究了一下. 朴素贪心 考虑把所有线段按照右端点 \(b\) 从小到大排序,依次考虑每一条线段的要求: 如果已经满足要求则跳过 否则尽量选择靠后的数(因为之后的线段 ...
- Jmeter(2)基础知识
一.Jmeter测试计划 1.测试计划用来描述一个性能/接口测试的脚本和场景设计 独立运行每个线程组:用于控制测试计划中的多个线程组的执行顺序.不勾选时,默认各线程组并行.随机执行. 主线程结束后运行 ...
- MySQL事务提交流程
有binlog的CR方式(重点核心!!): 有binlog情况下,commit动作开始时,会有一个Redo XID 的动作记录写到redo,然后写data到binlog,binlog写成功后,会将bi ...
- 接口测试工具 Jmeter使用笔记(一:编写一个http请求)
记录学习过程 一.安装Jmeter 1.JAVA环境 JDK下载地址http://java.sun.com/javase/downloads/index.jsp 配置系统变量: (1)JAVA_HOM ...
- 01-docker基本使用
docker 常用命令 指令 说明 docker images 查看已经下载的镜像 docker rmi 镜像名称:标签名 删除已经下载的镜像 docker search 镜像 从官方仓库中查看镜像 ...
- css 11-CSS3属性详解(一)
11-CSS3属性详解(一) #前言 我们在上一篇文章中学习了CSS3的选择器,本文来学一下CSS3的一些属性. 本文主要内容: 文本 盒模型中的 box-sizing 属性 处理兼容性问题:私有前缀 ...