简介 MySQL日志之redo log和binlog

简介 MySQL日志之redo log和binlog
最新回答
长发与酒

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的逻辑一致性,避免因日志写入顺序不同导致的主从数据不一致问题。

关键区别

  1. 层级与适用范围:redo log属于InnoDB引擎层,binlog属于Server层。
  2. 日志类型:redo log是物理日志(记录数据页修改),binlog是逻辑日志(记录SQL语句或行变更)。
  3. 写入方式:redo log循环写入,空间固定;binlog追加写入,文件滚动切换。
  4. 核心用途:redo log保障崩溃恢复,binlog支持复制与时间点恢复。

两阶段提交的意义
通过将事务提交分为prepare(redo log)commit(binlog)两个阶段,确保redo log和binlog的状态严格一致。若缺少此机制,异常重启后可能因日志状态不同导致数据恢复不一致,进而引发主从数据差异。