2022-08-03 02:07:20
redo log(重做日志)和binlog(归档日志)是MySQL中两种重要的日志机制,其核心特性与区别如下:
redo log的核心作用与机制
redo log是InnoDB存储引擎特有的物理日志,用于实现崩溃恢复(Crash-Safe)。当执行数据更新时,InnoDB会先将修改记录到redo log中(写入内存并标记为prepare状态),再更新内存中的数据页。系统空闲时,后台线程会将redo log中的操作异步刷盘到实际数据文件。其设计基于WAL(Write Ahead Logging)技术,即先写日志再写磁盘,显著降低高频写入时的IO成本。
redo log采用固定大小、循环写入的机制:通过write pos(当前写入位置)和check point(可擦除位置)的移动划分可用空间。若write pos追上check point,则需暂停写入并擦除旧日志(擦除前需确保数据已落盘)。这一机制保证了即使数据库异常重启,未刷盘的数据也能通过redo log恢复,确保事务持久性。
binlog的核心作用与机制
binlog是MySQL Server层的逻辑日志,与存储引擎无关,所有引擎均可使用。它以追加写入的方式记录所有修改数据的SQL语句(或行变更数据),用于主从复制和时间点恢复(Point-in-Time Recovery)。例如,通过binlog可将数据恢复到半个月内任意一秒的状态。
binlog的写入流程与redo log不同:事务提交时,执行器先生成binlog并写入磁盘,再调用InnoDB将redo log标记为commit状态(即两阶段提交)。这一设计确保了redo log和binlog的逻辑一致性,避免因日志写入顺序不同导致的主从数据不一致问题。
关键区别
两阶段提交的意义
通过将事务提交分为prepare(redo log)和commit(binlog)两个阶段,确保redo log和binlog的状态严格一致。若缺少此机制,异常重启后可能因日志状态不同导致数据恢复不一致,进而引发主从数据差异。