1、在干净关闭mysql时,重做日志应该逻辑上为空。意思是在检查点LSN之后没有要恢复的记录。但是,日志文件仍可能包含一些旧数据(在恢复过程中不使用)。
2、对数据页面内容的每次更改都必须通过mtr完成,该事物由mtr_commit()函数提交完成。
3、在提交mtr前,在mtr的内部缓冲区内收集更改日志。它包含多个日志记录,提交mtr时,所有日志记录都将写入一组日志记录中的日志缓冲区。包括:
- 计算日志记录的总数据字节数。
- 保留日志记录的空间。为一组日志记录分配lsn值的范围。
- 日志记录将写入日志缓冲区中的保留空间。
- 已修改的页面标记为脏页并移动到刷新列表。所有脏页都标有相同范围的lsn值。
- 保留空间关闭。
后台线程负责将日志缓冲区中的新更改写入日志文件。需要持久记录的用户线程必须等到日志刷新到所需的点。
重做日志刷新图解:


本文深入探讨了MySQL在干净关闭时重做日志的状态,解释了在检查点LSN之后没有待恢复记录的原理。同时,文章详细介绍了mtr(mini-transaction)在数据页面更改中的作用,以及其如何通过mtr_commit()函数提交,确保数据的一致性和安全性。此外,还解析了日志记录在mtr内部缓冲区的收集过程,以及日志刷新到日志文件的机制。
1133

被折叠的 条评论
为什么被折叠?



