是的,MySQL主从复制必须依赖binlog才能工作;binlog是主库记录DML/DDL事件的日志,从库通过I/O线程读取并写入relay log,再由SQL线程重放实现同步。

是的,MySQL主从复制必须依赖 binlog(二进制日志)才能工作。binlog 不仅是复制的数据源,也是实现数据恢复、审计和变更追踪的核心日志。
binlog 是主从复制的数据源头
主库在执行 INSERT、UPDATE、DELETE、CREATE、ALTER 等操作时,只要涉及数据或结构变更,就会把对应事件写入 binlog。从库的 I/O 线程正是通过读取主库的 binlog 内容,再写入本地 relay log,最后由 SQL 线程重放,完成同步。
- 没有开启 binlog(即未配置 log-bin),主库无法提供复制所需的事件流,从库将无法启动复制
- binlog 必须在主库上启用,从库无需开启 binlog(除非它也作为其他从库的主库)
- 主库的 server-id 和从库的 server-id 必须唯一且不为 0,否则复制线程拒绝启动
binlog 的三种格式影响复制行为
binlog_format 参数决定日志记录方式,直接影响数据一致性与日志体积:
- STATEMENT(SBR):记录原始 SQL 语句;节省空间,但遇到 NOW()、RAND()、USER() 等非确定性函数时,主从执行结果可能不同
- ROW(RBR):记录每一行变更前后的完整镜像;安全性高,能精准还原数据,适合生产环境推荐使用
- MIXED:MySQL 自动选择 SBR 或 RBR;多数场景可靠,但控制粒度不如显式指定 RBR
binlog 相关关键参数
除基础启用外,以下参数对复制稳定性至关重要:
- sync_binlog = 1:每次事务提交都刷盘,避免主机宕机导致 binlog 丢失,保障主从数据不丢
- binlog_row_image = FULL(默认):确保 RBR 模式下记录足够信息用于回放和闪回
- expire_logs_days 或 binlog_expire_logs_seconds:控制 binlog 自动清理周期,防止磁盘占满
- max_binlog_size:单个 binlog 文件最大容量,超限后自动滚动新文件
binlog 与其他日志的区别
MySQL 有多种日志,作用各不相同:
- binlog(Server 层):逻辑日志,记录所有 DML/DDL 变更,用于复制和 PITR(基于时间点恢复)
- redo log(InnoDB 层):物理日志,保证事务持久性(crash safe),只在本地生效,不参与复制
- undo log(InnoDB 层):用于事务回滚和 MVCC,并不对外输出,也不传输到从库
- error log / slow query log:诊断类日志,与数据同步无关










