mysql二进制日志默认关闭,需在my.cnf或my.ini的[mysqld]段添加log-bin和server-id并重启服务才能启用,运行时无法动态开启,且必须确保路径权限、server-id唯一性和binlog过期策略配置正确。

MySQL 二进制日志默认是关闭的
绝大多数 MySQL 安装(尤其是 MySQL 8.0 默认配置、Docker 官方镜像、部分云数据库)log_bin 是禁用状态,SHOW VARIABLES LIKE 'log_bin'; 返回 OFF。不手动启用,就无法做主从复制、闪回恢复或基于时间点的还原。
修改 my.cnf 或 my.ini 启用 log_bin
必须在 MySQL 启动前配置,运行时无法动态开启(SET GLOBAL log_bin = ON; 会报错 ERROR 1238 (HY000): Variable 'log_bin' is a read only variable)。
编辑配置文件(Linux 通常是 /etc/my.cnf 或 /etc/mysql/my.cnf,Windows 是 my.ini),在 [mysqld] 段落下添加:
log_bin = /var/lib/mysql/mysql-bin server_id = 1
-
log_bin值可以是绝对路径(推荐),也可以只写文件名(如mysql-bin),此时日志会生成在datadir目录下 -
server_id必须设置且唯一(主从环境中尤其关键),值为 1–4294967295 的整数 - 不要加
.log或.bin后缀 —— MySQL 会自动追加序列号(如mysql-bin.000001) - 确保 MySQL 进程对指定路径有读写权限,否则启动失败并报错
Can't init tc log或直接拒绝启动
验证是否生效及常见启动失败原因
重启 MySQL 后执行:SHOW VARIABLES LIKE 'log_bin'; 应返回 ON;再查 SHOW BINARY LOGS; 看是否有日志文件列出。
如果服务起不来,重点检查:
- 配置文件语法错误(比如多写了等号、漏了
[mysqld]段落头) -
log_bin路径所在磁盘空间不足或 inode 耗尽 - SELinux 或 AppArmor 阻止 MySQL 写入指定目录(Linux 上可临时
setenforce 0测试) - Windows 下路径用了反斜杠
\却没转义或用双引号包裹(应写成log_bin = "C:/mysql/data/mysql-bin")
启用后要注意 binlog_format 和过期策略
二进制日志格式默认是 ROW(MySQL 5.7+),但旧应用可能依赖 STATEMENT。若需兼容,加配置:binlog_format = ROW(或 STATEMENT / MIXED)。
日志不会自动清理,务必设过期时间,否则磁盘迟早打满:
-
expire_logs_days = 7(已弃用,仅兼容旧版本) - 推荐用
binlog_expire_logs_seconds = 604800(7 天,MySQL 8.0.28+) - 也可手动清理:
PURGE BINARY LOGS TO 'mysql-bin.000010';或PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
路径权限、server_id 唯一性、binlog_expire_logs_seconds 缺失 —— 这三处最容易被跳过,结果就是启得了一时,扛不住几天。











