
本文详解 mysql 何时生成新 binlog 文件(如 mysql-bin.000002 → mysql-bin.000003),明确三种触发条件(大小阈值、flush logs、服务重启),并指导 java 应用通过 checkpoint 机制实现可靠、不丢事件的 binlog 流式消费。
本文详解 mysql 何时生成新 binlog 文件(如 mysql-bin.000002 → mysql-bin.000003),明确三种触发条件(大小阈值、flush logs、服务重启),并指导 java 应用通过 checkpoint 机制实现可靠、不丢事件的 binlog 流式消费。
MySQL 的二进制日志(binlog)以滚动文件形式持续记录数据变更事件,但不会实时按事务或秒级切分——它只在特定条件下关闭当前文件、创建并写入新文件。理解这一机制,是构建高可用、不丢事件的 CDC(Change Data Capture)应用(如基于 mysql-binlog-connector-java 的 Java 监听服务)的前提。
✅ 何时生成新 binlog 文件?三大明确触发条件
MySQL 创建新 binlog 文件仅在以下 三种且唯一 的场景下发生:
-
文件大小达到阈值(max_binlog_size)
- 默认值为 1G(即 1073741824 字节),可在配置中显式设置:
[mysqld] max_binlog_size = 512M # 推荐设为 256M–1G,兼顾 I/O 与管理粒度
- ⚠️ 注意:MySQL 允许单个事件跨文件边界,因此实际文件大小可能略超设定值(通常不超过几十 KB),以确保事件原子性。
- 默认值为 1G(即 1073741824 字节),可在配置中显式设置:
-
显式执行 FLUSH LOGS 命令
MySQL(Linux)下载MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 手动触发:mysql> FLUSH LOGS;
- 自动触发:
- MySQL 服务重启时自动执行;
- mysqldump 使用 --flush-logs 参数时;
- 某些运维脚本或备份工具调用该命令。
-
MySQL 服务重启(Restart)
- 无论当前 binlog 是否接近满载,重启都会强制关闭当前文件、生成新文件(编号 +1),并更新 mysql-bin.index 索引文件。
? 验证当前状态:
SHOW BINARY LOGS; -- 查看所有已生成的 binlog 文件列表及大小 SHOW MASTER STATUS; -- 查看当前正在写入的文件名(File)与起始位置(Position) SHOW VARIABLES LIKE 'max_binlog_size'; -- 确认配置值
? Java 应用如何避免事件丢失?——Checkpoint 实践要点
你使用的 com.github.shyiko:mysql-binlog-connector-java 是业界主流的轻量级 binlog 解析库。为防止应用崩溃导致事件丢失,必须持久化消费位点(checkpoint),并在重启后从该位置继续拉取:
✅ 正确做法(推荐)
- 在每次成功处理一批事件(例如每 100 条或每秒)后,同步将当前 filename + position 写入外部可靠存储(如 MySQL 表、Redis Hash 或本地文件+ fsync);
- 启动时优先读取该 checkpoint,调用 BinaryLogClient#setBinlogFilename() 和 BinaryLogClient#setBinlogPosition() 初始化客户端;
- 示例代码片段:
client.setBinlogFilename("mysql-bin.000005"); client.setBinlogPosition(123456789L); client.registerEventListener(event -> { // 处理事件... if (event instanceof RotateEvent) { // 收到 RotateEvent 表示即将切换文件,此时 position 已指向新文件开头 // 可在此刻安全更新 checkpoint(新文件名 + position=4) } if (event instanceof XidEvent || event instanceof QueryEvent) { // 定期落盘 checkpoint(建议结合事务边界或时间窗口) saveCheckpoint(event.getFileName(), event.getPosition()); } });
⚠️ 关键注意事项
- 不要依赖 SHOW MASTER STATUS 的实时 position 作为 checkpoint:该值仅反映“当前写入位置”,若应用 crash 后未及时保存,会丢失中间事件;
- RotateEvent 是文件切换的唯一可靠信号:当监听到 RotateEvent,说明下一个事件将出现在新文件中,此时应立即更新 checkpoint 中的文件名;
- position 是字节偏移量,非行号或事件序号:必须严格按 mysqlbinlog 解析逻辑理解(如 mysql-bin.000005:123456789);
- 启用 binlog_format = ROW + sync_binlog = 1:确保每个提交事务都持久化到 binlog,避免因宕机丢失已提交但未刷盘的事件。
? 总结:稳态运行的关键设计原则
| 维度 | 推荐实践 |
|---|---|
| Binlog 配置 | log_bin=/var/lib/mysql/mysql-bin, server_id=1, binlog_format=ROW, max_binlog_size=512M, expire_logs_days=7, sync_binlog=1 |
| Checkpoint 存储 | 使用 ACID 数据库(如 MySQL 自身)或带持久化的 KV 存储(如 Redis AOF + RDB),避免纯内存或临时文件 |
| 异常恢复逻辑 | 启动时校验 checkpoint 是否存在于 SHOW BINARY LOGS 列表中;若文件已被清理(如过期删除),需触发全量 + 增量补偿流程 |
| 监控告警 | 监控 Seconds_Behind_Master(若做主从)、binlog 文件增长速率、checkpoint 落盘延迟,及时发现积压或中断 |
掌握 binlog 切换时机与 checkpoint 设计,你的 Java CDC 应用即可真正实现“一次处理、绝不丢失”的生产级可靠性。










