Oracle RedoLog-基本概念和组成

Oracle 数据库恢复操作最关键的依据就是 redo log,它记录了对数据库所有的更改操作。在研究如何提取 redolog 中 DML 操作的过程可谓一波三折,因为介绍 redolog 结构细节的资料实在太少了,不过好在最后大致理清了它的结构,并开发了一个基于日志的同步软件。

本系列文章就记录下研究过程中遇到的问题和使用的分析命令、工具。

1. 什么是 Redo Log

Redo Log 就是一组文件,它们记录了对数据库的所有操作,主要包括:

所有 DML 操作,INSERT\UPDATE\DELETE\SELECT FOR UPDATE

所有 DDL 操作,CREATE TABLE\ALTER TABLE 等

所有因 Recursive SQL 引起的变化,比如执行 DDL 语句时,Oracle 会隐式的执行其他 SQL 修改数据字典

在数据库事务 COMMIT 之前,Oracle 既会把变化信息写入 Rodo Log 文件,也会把原始数据-即 UNDO Segments 写入。因此,Redo Log 不仅用于恢复数据,还能保护数据回滚。

2. Oracle 如何写入 Redo Log

Oracle 数据库每个实例都有一个 redo thread 负责日志的写入,称为 LGWR,LoG WRiter 的简写。Redo Log 文件至少有两个,LGWR 采用循环覆盖的方式写入:当一个文件写满后,开始写入下一个,当最后一个文件写满后,返回第一个开始写入,如此循环。

Oracle RedoLog-基本概念和组成

这样写入会导致数据丢失吗?默认情况下

数据库日志有两种模式:归档 和 非归档,非归档模式就会有覆盖写入的问题。在归档模式下,当一组 ReodLog 文件写满,发生切换时,Oracle 会保证归档完成前此组文件不被覆盖。

Oracle RedoLog-基本概念和组成

可以使用以下命令手动触发日志切换:

SQL> alter system switch logfile 3. Redo Log 基本结构

Redo Log 是由一系列的 redo record 组成,每个 redo record 又是由一组 change vector 组成,每个 change vector 都记录了对单个数据块的更改操作。

Redo Log 文件在存储结构上,是按存储的,默认情况下块大小是磁盘扇区的大小,通常是 512 字节,它的格式取决于操作系统和数据库版本,这里的分析都是在 Windows Server 2008 R2 和 Oracle 11g 的基础上进行的。

Redo Log 是按顺序写入的,基本格式如下:

Oracle RedoLog-基本概念和组成

前两个块记录的是元信息,分别是:

第1个块记录文件本身的信息,比如文件类型,块大小和块数,这部分称为 File Header - 文件头

第2个块记录数据库实例相关信息,比如数据库SID,数据库版本,这部分称为 Redo Log Header - 重做日志头

结合日志写入方式,从整体上看,读取这一组 Redo Log 文件,在内存中可以把它们看成按块为存储单元的环形缓冲区来处理,解析的过程就是读取一个个 Record。

3.1 Redo Record

一个 Redo Record 可能占用一个 block,也可能占用多个 block,也可能只占用 block 的一部分,这取决于它的长度,长度字段就存储在 Record Header 头部,结构如下:

Oracle RedoLog-基本概念和组成

值得注意的是,Record 的长度是动态的,计算方法以及二进制文件字节分析后续文章会详细介绍,这里简单看下使用 system dump 命令导出的头信息:

REDO RECORD - Thread:1 RBA: 0x000009.0000029e.0010 LEN: 0x02ac VLD: 0x0d SCN: 0x0000.0010c5e6 SUBSCN: 1 01/02/2021 21:09:41

其中主要字段的含义:

RBA: Redo Byte Address, 由三部分组成:日志序号(0x9),块编号(0x29e),块中字节偏移量(0x10)

LEN: Record 长度,包含头部长度

VLD: 头部长度标识,按照一定的逻辑计算头的长度,0x0d 就表示头部长度为 68 字节

SCN: System Change Number,也可称为 System Commit Number。当一个事务提交时,LOWR 将缓冲区内容写入文件,并为每个已提交的事务,分配一个标识,就是 SCN。也就是说,可以通过 SCN 跟踪数据库变化,也可以根据它决定从哪开始恢复数据。

此外,借助 SCN 还可以有针对的 dump 运行的 DML 语句,本文最后有相关的命令。

3.2 Change Vector

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspwfx.html