Oracle 深入学习 Part 7: Maintaining Online Redo Log Files(维护联机重做日志文件)
联机日志文件又叫重做日志文件,记录了对数据库的任何改变。Oracle 遵循 WAL(Write-Ahead Logging) 原则,即在提交事务前,先写到 Redo Buffer(日志缓冲区),再由 LGWR(日志写入进程) 写入到物理的联机重做日志文件中。
1.1 组的概念
-
每个日志组包含多个 成员文件(Member),用来保证日志的冗余性和可靠性。
-
如果一个组中有多个成员,只要其中一个成员有效,日志写入仍可继续。
1.2 LSN(Log Sequence Number, 日志序列号)
-
是 Oracle 数据库中用来标识 重做日志记录顺序 的一个重要概念。
-
每次日志切换(Log Switch)时,日志序列号会递增。
1.3 Thread 的概念
-
在 RAC(Real Application Cluster) 环境中,每个实例都有自己独立的重做日志组。
-
每个实例的日志组对应一个线程(Thread)。
1.4 LGWR(Log Writer,日志写入进程)
-
负责将 Redo Log Buffer 中的日志数据写入到 联机重做日志文件 中。
-
日志写入时,LGWR 会将相同的数据同时写入组内的所有成员文件。
1.5 日志切换与检查点
日志切换(Log Switch):
日志切换是指 Oracle 数据库从当前的联机重做日志文件(Online Redo Log File)切换到下一个日志文件 的过程。
触发条件
-
当前日志文件写满
-
LGWR 写入日志组时,发现当前日志文件已经写满,会触发日志切换。
-
-
手动切换
-
数据库管理员可以通过
ALTER SYSTEM SWITCH LOGFILE;
命令手动触发日志切换。
-
-
参数控制切换
-
可以通过调整参数(例如设置
ARCHIVE_LAG_TARGET
),让日志定期切换,即使日志未写满。
-
检查点(Checkpoint):
检查点是数据库内部的一个事件,用于 将内存中的脏数据(Dirty Buffer)同步到数据文件,并更新控制文件和数据文件头部的检查点信息。
触发条件
-
日志切换
-
每次日志切换都会触发检查点。
-
-
时间间隔
-
Oracle 会根据参数(如
FAST_START_MTTR_TARGET
)定期触发检查点。
-
-
手动触发
-
数据库管理员可以使用
ALTER SYSTEM CHECKPOINT;
命令手动触发。
-
-
正常关闭数据库
-
当数据库正常关闭时,会触发检查点,确保所有脏数据写入磁盘。
-
概念 | 日志切换(Log Switch) | 检查点(Checkpoint) |
---|---|---|
触发时机 | 日志写满、手动切换或参数控制 | 日志切换、时间间隔、手动触发、正常关闭 |
执行内容 | 停止当前日志组写入,切换到下一个日志组 | 将脏数据写入磁盘,更新控制文件和数据文件头 |
目的 | 管理日志文件顺序、触发归档、确保事务日志的持久性 | 保证数据一致性、减少崩溃恢复时间 |
关系 | 日志切换一定触发检查点 | 检查点不一定触发日志切换 |
2. LGWR 触发写入的条件
2.1 提交事务(Commit)
-
当用户执行
COMMIT
时,LGWR 会立即将 Redo Log Buffer 中与该事务相关的日志条目写入到 Redo Log 文件 中,确保事务的持久性。 -
提交时触发写入是为了保证事务的 "一致性和可恢复性"。
2.2 每 3 秒(定时刷新机制)
-
即使没有提交或特殊事件,LGWR 会定期将 Redo Log Buffer 中的数据刷到 Redo Log 文件,默认时间为 3秒。
-
这种机制是为了减少缓冲区的数据积压,确保日志写入及时。
2.3 Redo Log Buffer 使用量达到 1/3**
-
当 Redo Log Buffer 的使用量达到其总大小的 1/3 时,LGWR 会触发写入。
-
此机制保证内存的高效利用,避免缓冲区溢出。
2.4 Redo Log Buffer 达到 1MB**
-
如果 Redo Log Buffer 中的日志条目达到 1MB 的大小(即便没有达到 1/3 的阈值),LGWR 也会触发写入。
-
这种大小限制可以平衡性能和写入频率。
2.5 DBWn 回写前
-
DBWn(数据库写进程) 将内存中的脏数据块写入数据文件之前,LGWR 必须确保与这些块相关的日志条目已经被写入到 Redo Log 文件 中。
-
这样做是为了在崩溃恢复时能够用日志文件还原内存中尚未写入的数据文件的事务。
触发条件 | 触发场景说明 |
---|---|
事务提交(Commit) | 确保事务日志持久化,提供提交后的恢复能力 |
每 3 秒(定时机制) | 减少日志积压,保证日志数据及时写入 |
Redo Log Buffer 使用 1/3 | 避免缓冲区溢出,保证内存利用效率 |
Redo Log Buffer 达 1MB | 通过大小阈值平衡性能与写入频率 |
DBWn 写脏块前 | 保证数据块写入前相关日志条目已写入,防止数据不一致 |
3.归档日志 archive redo log files
在 Oracle 数据库中,归档日志(Archive Redo Log Files) 是指将 联机重做日志(Online Redo Log Files) 复制到归档位置,以便长期保存,支持数据库恢复和备份。它在数据库开启 归档模式(ARCHIVELOG) 后生效。