直接回答

  • redo log(重做日志):InnoDB 存储引擎层的物理日志,记录"数据页做了什么修改",用于崩溃恢复,保证事务的持久性。
  • undo log(回滚日志):记录数据修改前的旧值,用于事务回滚和 MVCC 多版本读,保证原子性。
  • binlog(归档日志):MySQL Server 层的逻辑日志,记录 SQL 或行变更,用于主从复制和数据恢复(如误删数据的闪回)。

展开解析

redo log 是物理日志,记录"在某个表空间的某个页上做了什么偏移的修改",采用 WAL(先写日志再写磁盘页)机制,是循环写的固定大小文件。binlog 是逻辑日志(记录 SQL 语句或行的前后值),追加写,可一直归档。二者层次不同:redo 属于 InnoDB,binlog 属于 Server 层,因此提交时需要两阶段提交(2PC)保证两者一致,否则主库崩溃后主从数据可能不一致。

undo log 除了支持 rollback,还配合 ReadView 实现 MVCC:每一行的多个版本通过 undo 链串联,快照读沿着版本链找到可见版本。Purge 线程负责清理不再被任何事务需要的 undo 记录。

追问方向:两阶段提交的流程(prepare → 写 binlog → commit)、redo 的刷盘策略 innodb_flush_log_at_trx_commit、binlog 的三种格式(statement/row/mixed)及优劣。