MySQL是大厂核心,下面我详解MySQL 的redo log 和 binlog@mikechen
一、所属层级不同
redo log 是 InnoDB 存储引擎层 的日志,只对 InnoDB 生效。
它主要服务于事务提交、崩溃恢复等底层机制。
binlog 是 MySQL Server 层 的日志,不依赖具体存储引擎。
无论是 InnoDB 还是其他引擎,只要 MySQL Server 层执行了数据变更,通常都会记录 binlog。
总结:
redo log:引擎层日志;
binlog:服务层日志。
二、作用不同
redo log 的核心作用是 保证事务持久性(D 维度)。
当 InnoDB 数据页还没来得及刷盘时,先把修改写入 redo log。
这样即使数据库宕机,也可以通过 redo log 将已提交事务重做回来,避免数据丢失。
binlog 的核心作用是 数据归档、主从复制和数据恢复。
它记录的是 SQL 逻辑变更过程,方便从库重放主库的操作,也可以用于误删数据后的恢复。
总结:
redo log:保证崩溃恢复和事务持久性;
binlog:用于复制、恢复和审计。
三、记录内容不同
redo log 记录的是 物理日志,更偏向于“某个数据页上做了什么修改”。
它关注的是页级别、偏底层的变化,因此体积小、写入快。
binlog 记录的是 逻辑日志,通常记录的是“执行了什么 SQL”或者“数据发生了什么变化”。
它更接近业务操作语义,便于在不同环境中重放。
总结:
redo log:物理日志,记录数据页变化;
binlog:逻辑日志,记录 SQL 或行变化。
四、写入时机和刷盘方式不同
redo log 是循环写入的,空间固定,写满后会覆盖旧内容。
事务执行过程中,InnoDB 会先把修改写到 redo log buffer,再按一定策略刷盘。
binlog 是追加写入的,按文件顺序持续增长,一个写满后会切换到下一个日志文件。
它通常在事务提交时写入,作为全局变更记录保留下来。
总结:
redo log:循环写,空间固定;
binlog:追加写,长期保存。