redo log日志格式是啥样的?

1 个回答

  • 明月
    天道忌满,人道忌全。 水满则溢, 物极必反。
    在 MySQL 的 InnoDB 存储引擎中,**redo log**(重做日志)是用于保证数据库崩溃恢复能力的关键组件,确保已经提交的事务不会因为系统故障或宕机而丢失。这种能力称为 **crash-safe**。 ![image.png](https://images.codewd.com/4e7584e25c9d41606a2939fa0371ae26.jpg "image.png") ### Redo Log 的工作机制 - **redo log buffer** 是内存中的缓冲区,用来暂时存放 redo log 的内容,之后再将这些内容刷入磁盘。 - redo log 在磁盘上由多个循环使用的日志文件组成(如 `ib_logfile_1`、`ib_logfile_2`、`ib_logfile_3`、`ib_logfile_4`)。这些文件是循环使用的,并且日志的写入位置会不断更新。 ### Redo Log 的关键位置 1. **write pos**:这是当前记录日志的位置,表示写入新 redo log 的起始点。随着新的操作不断写入,`write pos` 会向后移动,直到写到最后一个文件的末尾时,再回到第一个文件的开头进行循环使用。 2. **checkpoint**:这是当前要擦除日志记录的位置。在擦除之前,InnoDB 会确保这些日志对应的变更已经被应用到数据文件中。`checkpoint` 也会随着时间不断推进。 ### Redo Log 的区域 - **write pos 和 checkpoint 之间**的区域是可用空间,即当前还没有被使用,可以继续写入新的操作。 - 如果 **write pos 追上了 checkpoint**,表示 redo log 文件已满,无法再记录新的操作。在这种情况下,必须将旧的 redo log 数据刷新到磁盘(将数据文件同步),然后推进 `checkpoint`,释放空间给新的日志写入。 ### Redo Log 的作用 - **数据恢复**:如果数据库发生宕机或异常重启,InnoDB 可以通过 **redo log** 恢复尚未写入磁盘的数据,确保事务的持久性。这意味着即使数据库崩溃,已经提交的事务也不会丢失。 - **crash-safe**:正是由于 redo log 记录了事务的变更操作,数据库可以在崩溃后从中读取尚未写入磁盘的数据并进行恢复。这种机制被称为 crash-safe。 ### 工作流程总结 1. 当 MySQL 执行更新操作时,变更数据先写入 **redo log buffer**。 2. InnoDB 会将这些变更异步刷入磁盘中的 redo log 文件中,同时在合适的时间点将数据写入到真正的数据文件。 3. 如果系统发生崩溃,重启时通过 redo log 可以恢复 checkpoint 之后的数据,确保已提交的事务不会丢失。 通过 **redo log**,MySQL 能够在性能和数据安全之间取得平衡,尤其在处理大批量事务时,能显著提高写入性能。
    编辑于 2024-09-06 18:36 •IP属地 亚太地区
    举报
    评论
    收藏