MySQL 5.7+ 开启 binlog 必须同时配置 log-bin 和 server-id,缺一不可;仅配 log-bin 无效,因 server-id 是复制身份标识,未设置则 binlog 默认禁用,且配置须置于 [mysqld] 段下、重启生效、目录权限需正确。
log_bin 和 server_id 必须同时配置,缺一不可——这是 MySQL 5.7+ 开启 binlog 的硬性要求。只配 log_bin,重启后 SELECT @@log_bin 仍返回 0,日志根本不会生成。最常见原因是漏配 server_id。MySQL 把它当作复制身份标识,哪怕你单机不用主从,没设 server_id 就默认禁用 binlog 写入。
server_id 必须是正整数(如 1、101),不能为 0 或空值[mysqld] 段下,放错位置(比如 [client])会导致完全不加载log_bin 值建议写绝对路径(如 /var/lib/mysql/mysql-bin),不带后缀;Windows 下用正斜杠或双反斜杠,避免路径解析失败mysql)必须对 log_bin 所指目录有写权限,否则启动可能静默失败重启不是终点,要确认三件事:
SELECT @@log_bin, @@log_bin_basename, @@server_id; —— 三个值都应非空/非零SHOW BINARY LOGS;,能列出文件才说明物理日志已开始写入ls -l /var/lib/mysql/mysql-bin.*(路径需与 log_bin 配置一致)mysqld --defaults-file=/etc/my.cnf --verbose --help | grep "log-bin" 确认配置文件是否被真正读取Windows 用户常卡在路径创建和权限上:
log_bin="C:/ProgramData/MySQL/MySQL Server 5.7/logs/mysql-bin" —— 目录必须提前手动创建,MySQL 不会自动建多级目录mysql 服务运行账户(默认是 LocalSystem 或指定用户)对该目录有“写入”权限,否则服务启动失败且错误日志里只有一句模糊提示my.ini 文件编码必须是 ANSI 或 UTF-8 无 BOM,否则 MySQL 可能跳过整个配置段mysqladmin reload 或 FLUSH PRIVILEGES 代替重启——binlog 是启动时初始化的模块,运行时无法动态开启binlog_format=ROW 是当前事实标准,尤其涉及函数、触发器、时间字段时,STATEMENT 容易导致主从不一致;sync_binlog=1 能保证事务提交即刷盘,但会略微影响吞吐量。
binlog_format=ROW + sync_binlog=0,平衡安全与性能sync_binlog=1,尤其配合 innodb_flush_log_at_trx_commit=1
expire_logs_days=7 或 binlog_expire_logs_seconds=604800 必须配,否则日志无限增长占满磁盘log_bin 都只是个摆设。别只盯着 SQL 命令看返回值,得去文件系统里翻真实文件。