mysql innodb redo log何时同步到数据库行里,问题不是redo log何时落盘,而是redo log 落盘后怎么同步到一行数据里的?
3条回答 默认 最新
关注InnoDB存储引擎将更新操作写入事务的Redo Log后,它并不会立即同步到对应行数据。而是以以下过程完整流程:
- 更新缓冲池:首先,更新操作会被写入内存中的
Buffer Pool,是InnoDB存储引擎的主要数据缓存。在内存中,它被认为是“已经提交但尚未持久化到磁盘”的数据; - 写入Redo Log:此时,更新操作会被写入Redo Log文件。Redo Log是一个循环的,预分配的日志空间,记录了所有正在进行中和完成的事务的物理操作。
在写入Redo Log后,操作就被确认为持久化到磁盘; - 延迟写回数据页:随后,InnoDB会利用合适的时机,例如检查点(Checkpoint)或者其他I/O操作的发生的时候,来将对应的数据写回到磁盘的数据页中。
这个过程就是“延迟写回”(Deferred Writing)或“脏页刷新”;- 检查点是指为了定期刷新内存中的数据页,InnoDB会将一部分被修改的数据页刷新到磁盘上;
- 脏页刷新是指当需要淘汰使用频率较低的数据页时,InnoDB会将这些页中的脏数据写回到磁盘。
- 数据和Redo Log同步:当对应的数据页被写回到磁盘后,Redo Log中相应的更新操作就会同步到该行数据。这时候数据和Redo Log已经一致,并保持了持久性。
需要注意数据页和Redo Log之间的同步是异步进行的,即Redo Log写入和数据页刷新不一定同时发生。
所以在异常情况下(如掉电或崩溃),尚未将更新操作完全刷新到磁盘的数据可能会丢失。但由于事务日志的存在,可以使用Redo Log来恢复数据的一致性。这种方式的好处是可以提高性能,通过将I/O操作减少到最低限度,以及将写入操作合并为批量提交。
但它也带来了一定程度的风险,可能在发生故障时导致数据丢失。因此,在应用程序中,适当的配置和调整与数据一致性和可靠性相关的参数是有必要的本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 更新缓冲池:首先,更新操作会被写入内存中的