MySQL中log.write_lsn与log.flushed_to_disk_lsn的区别及疑问
关于InnoDB redo log中log.write_lsn与log.flushed_to_disk_lsn的疑问解答
1. 这两个参数是否仅针对redo log文件的写入操作?
是的,这两个参数完全属于InnoDB redo log子系统,仅用于追踪redo log的写入和刷盘进度,与binlog、慢查询日志等其他MySQL日志类型无关。
2. 描述中的“written”与“flushed”具体区别是什么?
两者对应redo log写入磁盘过程的两个不同阶段:
- written:指InnoDB的log writer线程将log buffer中的redo log数据写入到**操作系统的页缓存(OS Page Cache)**中。此时数据仅存于内存级的缓存,并未真正写入物理磁盘,系统断电或崩溃时这部分数据会丢失。log.write_lsn就是标记到这一步的LSN进度。
- flushed:指InnoDB的log flusher线程调用操作系统的
fsync()(或类似)系统调用,将操作系统页缓存中的redo log数据强制刷入物理磁盘的redo log文件。此时数据真正持久化,即使系统崩溃也不会丢失。log.flushed_to_disk_lsn标记的是这一步的完成进度。
正因为存在这样的两步流程,所以必然满足:
log.flushed_to_disk_lsn <= log.write_lsn
3. log.write_lsn的官方描述是否存在笔误,是否应为写入log buffer而非log files?
官方描述存在表述歧义(大概率是翻译或笔误),正确的逻辑与描述中的后半句更吻合:
- 前半句“小于等于此LSN的所有数据已写入日志文件”的表述不准确,实际是指这些数据已从log buffer写入到操作系统的redo log文件缓存(而非直接写入磁盘文件)。
- 后半句“它是未写入日志缓冲区的起始位置”明显错误,正确表述应为“它是未写入日志文件(OS缓存)的起始位置”——因为log buffer中小于等于write_lsn的部分已经被写入OS缓存,这部分缓冲区空间可以被循环复用;而从write_lsn开始的log buffer内容,是尚未写入OS缓存的redo log数据。
内容的提问来源于stack exchange,提问作者Gokul Selvaraj
相关产品推荐
相关产品推荐

