本文首发公众号「小创编程」
原文链接「https://www.chuonye.com/archives/oracle-redolog.html」
Oracle 数据库恢复操作最关键的依据就是 redo log
,它记录了对数据库所有的更改操作。在研究如何提取 redolog 中 DML 操作的过程可谓一波三折,因为介绍 redolog 结构细节的资料实在太少了,不过好在最后大致理清了它的结构,并开发了一个基于日志的同步软件。
本系列文章就记录下研究过程中遇到的问题和使用的分析命令、工具。
原文链接:https://www.chuonye.com/archives/oracle-redolog.html
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 采用循环覆盖的方式写入:当一个文件写满后,开始写入下一个,当最后一个文件写满后,返回第一个开始写入,如此循环。
这样写入会导致数据丢失吗?默认情况下会。
数据库日志有两种模式:归档
和 非归档
,非归档模式就会有覆盖写入的问题。在归档模式下,当一组 ReodLog 文件写满,发生切换时,Oracle 会保证归档完成前此组文件不被覆盖。
可以使用以下命令手动触发日志切换:
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 是按顺序写入的,基本格式如下:
前两个块记录的是元信息,分别是:</