mysql 5.7+ 开启 binlog 必须同时配置 log-bin 和 server-id,缺一不可;仅配 log-bin 无效,因 server-id 是复制身份标识,未设置则 binlog 默认禁用,且配置须置于 [mysqld] 段下、重启生效、目录权限需正确。

MySQL 5.7+ 开启 binary log 的必备配置项
binary log 默认是关闭的,必须通过 my.cnf(Linux)或 my.ini(Windows)手动启用,仅靠 SQL 命令无法开启。关键配置只有两个:开启开关 + 日志路径前缀。
-
log-bin=/var/lib/mysql/mysql-bin:必须指定绝对路径和基础文件名(不带编号),MySQL 会自动追加.000001等后缀 -
server-id=1:必须设置且全局唯一(主从复制场景下不能重复),值为正整数即可,0 不合法 - 如果只写
log-bin不带路径,MySQL 会尝试写入数据目录,但可能因权限失败;不设server-id会导致启动报错ERROR 2002 (HY000): Can't connect to local MySQL server或服务无法启动
验证 binary log 是否真正生效
配置改完重启 MySQL 后,不能只看进程或配置文件是否加载,得查运行时状态。最直接的方式是连上 MySQL 执行命令确认。
- 执行
SHOW VARIABLES LIKE 'log_bin';—— 返回ON才算开启成功 - 执行
SHOW MASTER STATUS;—— 若返回非空结果(如File: mysql-bin.000001),说明日志已生成并可被读取 - 执行
SHOW BINARY LOGS;—— 如果提示Error 1381 (HY000),大概率是log-bin路径不可写,或 MySQL 用户对目录无写权限
常见错误:日志没生成、空间爆满、主从同步失败
binary log 不只是“开了就行”,几个典型问题都跟配置细节强相关。
-
log-bin指向的目录磁盘满或权限不足 → MySQL 启动失败或日志静默停止写入,检查/var/log/mysql/error.log中是否有Failed to open log file - 没配
expire_logs_days或max_binlog_size→ 日志无限增长,建议设expire_logs_days=7(自动清理 7 天前日志) - 主库
binlog_format=STATEMENT但用了NOW()、UUID()等非确定性函数 → 从库执行结果不一致,推荐统一用ROW格式 - 应用频繁执行
CREATE TEMPORARY TABLE→ 在STATEMENT模式下不会记录到 binlog,导致从库缺失临时表结构
动态调整 binlog 行为(无需重启)
有些参数支持运行时修改,适合生产环境微调,但注意不是所有都能热生效。
-
SET GLOBAL expire_logs_days = 3;:立即生效,控制过期策略(MySQL 8.0.11+ 已弃用,改用binlog_expire_logs_seconds) -
SET GLOBAL sql_log_bin = OFF;:临时关闭当前会话的 binlog 记录(常用于避免大事务打爆日志),但需 SUPER 权限 -
FLUSH LOGS;:手动滚动 binlog,生成新文件(如从mysql-bin.000001切到.000002),可用于归档前触发切换 - 不能动态开启/关闭
log-bin,必须重启 mysqld 进程
server-id 和目录权限——前者让 MySQL 直接拒绝启动,后者让日志看似开启实则空转。别只盯着配置文件写了什么,一定要进数据库跑 SHOW MASTER STATUS; 看真实输出。











