阿里面试:MySQL 的 redo log 和 binlog 有什么区别?

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:追加写,长期保存。

评论交流
    说说你的看法