
MySQL 在三种情况下会创建新的 binlog 文件:当前文件达到 max_binlog_size 上限(允许小幅溢出以保证事件完整性)、执行 FLUSH LOGS 命令,或 MySQL 服务重启。这是实现可靠日志消费与断点续传的关键依据。
mysql 在三种情况下会创建新的 binlog 文件:当前文件达到 `max_binlog_size` 上限(允许小幅溢出以保证事件完整性)、执行 `flush logs` 命令,或 mysql 服务重启。这是实现可靠日志消费与断点续传的关键依据。
在基于 binlog 的实时数据同步、CDC(Change Data Capture)或审计系统开发中,确保不丢失任何变更事件是核心诉求。你使用的 Java 库 mysql-binlog-connector-java(v0.21.0)正是业界主流的轻量级 binlog 解析客户端,它通过模拟从库(slave)协议连接 MySQL,持续拉取 binlog event 流。但正如你所担忧的——若应用意外崩溃(Crash),未持久化的消费位点(position 或 GTID)将导致事件漏读。
✅ 何时触发 binlog 文件切换?
MySQL 并非按时间或事务数量自动轮转,而是严格依赖以下三个确定性事件:
| 触发条件 | 说明 | 可控性 | 示例场景 |
|---|---|---|---|
| max_binlog_size 达标 | 默认 1G(可通过 SHOW VARIABLES LIKE 'max_binlog_size'; 查看),当当前 binlog 文件写入接近该值时,MySQL 会在写完当前完整 event 后立即关闭该文件,并创建下一个序号文件(如 mysql-bin.000002 → mysql-bin.000003)。注意:因 event 不可拆分,实际文件大小可能略超设定值。 | ✅ 可配置(推荐设为 512M–1G,平衡 I/O 与恢复粒度) | 高频写入场景下最常见触发方式 |
| 执行 FLUSH LOGS | 手动或由工具触发,强制结束当前 binlog 并生成新文件。该命令还同时刷新 error log、general log 等。 | ✅ 可主动调用(如备份前确保日志边界清晰) | mysqldump --flush-logs、运维脚本定期归档 |
| MySQL 服务重启 | 启动时总会新建一个 binlog 文件(即使旧文件远未满)。这是最“硬性”的轮转条件。 | ⚠️ 不可控,但可预期(计划内维护需考虑) | 升级、配置热加载失败后重启等 |
? 提示:可通过 SHOW BINARY LOGS; 查看全部 binlog 文件及其大小;用 SHOW MASTER STATUS; 获取当前正在写入的文件名和起始 position(即 File + Position 字段)。
? 如何实现零丢失的断点续传?
针对你的 Java 应用,关键在于 将消费位点(checkpoint)与 binlog 文件生命周期对齐,并及时落盘:
-
位点必须包含两要素:
filename = mysql-bin.000005 position = 1248762
(或使用 GTID set,更推荐——需 MySQL 5.6+ 且 gtid_mode=ON)
-
安全落盘策略(避免仅内存缓存):
- 每处理 N 条 event(如 100 条)或每 T 秒(如 5s),将最新 position 异步写入本地高可靠性存储(如 RocksDB、PostgreSQL 表、或带 fsync 的文件);
- 严禁在事务提交前更新 checkpoint —— 必须确保业务逻辑处理成功且位点已持久化,再推进消费位点;
- 使用 mysql-binlog-connector-java 时,可在 EventDeserializer 回调中捕获 RotateEvent(标识文件切换),此时应立即刷盘并记录新文件起始 position。
-
崩溃恢复流程:
// 伪代码:启动时加载最后 checkpoint BinlogPosition lastPos = loadLastCheckpoint(); BinaryLogClient client = new BinaryLogClient("host", 3306, "user", "pwd"); client.setBinlogFilename(lastPos.filename); client.setBinlogPosition(lastPos.position); client.registerEventListener(...); // 注册事件处理器 client.connect();
⚠️ 注意事项与最佳实践
- 不要依赖 expire_logs_days / binlog_expire_logs_seconds 清理逻辑做恢复保障:过期清理是运维手段,不应作为应用设计前提;务必确保 checkpoint 对应的 binlog 文件在清理窗口内仍存在(建议保留 ≥ 7 天)。
- ROW 格式是 CDC 的事实标准:确保 binlog_format = ROW,它能精确捕获每一行变更(含 before/after image),避免 STATEMENT 格式下的不确定性(如 NOW()、UUID() 等函数)。
- sync_binlog = 1 是强一致性基石:配合 innodb_flush_log_at_trx_commit = 1,可确保已提交事务 100% 落盘到 binlog,杜绝因宕机导致的 binlog 缺失。
- 监控 binlog 增长速率:若单个 binlog 文件长期不轮转(如数天仍为 .000001),可能意味着写入极低或配置异常(如 log_bin 未生效),需及时告警。
掌握 binlog 轮转时机,本质上就是掌握了 MySQL 数据变更流的“分段刻度”。合理设计 checkpoint 机制,即可构建出高可用、可追溯、零丢失的实时数据管道。


















