binlog开启与格式设置必须修改my.cnf并重启mysql,关键配置为log-bin、binlog-format(推荐row)、server-id(非0整数);redo log不可动态调整,需停库删旧文件、改innodb_log_file_size后重启;两者刷盘策略需协同配置以平衡一致性与性能。

binlog 开启与格式设置必须改 my.cnf 并重启
MySQL 的 binlog 默认关闭,不改配置文件、不重启服务,光执行 SQL 是开不了的。关键配置项有三个:log-bin(启用并指定路径)、binlog-format(推荐 ROW)、server-id(主从必需,非 0 整数)。例如:
log-bin = /var/lib/mysql/mysql-bin binlog-format = ROW server-id = 1
注意:log-bin 值不能是相对路径或纯文件名(如 mysql-bin),否则 MySQL 启动会失败并报错 Failed to open log file;server-id 在单机也得设,否则某些备份工具(如 mydumper)会拒绝连接。
redo log 不可动态关闭,大小和数量靠 innodb_log_file_size 和 innodb_log_files_in_group
redo log 是 InnoDB 引擎级日志,由固定大小的物理文件组成(默认 2 个 × 48MB),它不像 binlog 那样能用 SQL 开关。调整大小必须停库、删旧文件、改配置、再启动。常见误操作是只改 innodb_log_file_size 就启动,结果 MySQL 直接拒绝启动,并报错 InnoDB: Error: log file ./ib_logfile0 is of different size。
安全调整步骤:
- 先执行
SET GLOBAL innodb_fast_shutdown = 0,确保脏页刷盘 - 正常关闭 mysqld
- 删除
ib_logfile0和ib_logfile1(路径由datadir决定) - 修改
my.cnf中的innodb_log_file_size(如设为256M) - 重启服务,InnoDB 会自动重建新大小的日志文件
binlog 和 redo log 混用场景下要注意刷盘策略冲突
两者都涉及持久化,但控制开关不同:binlog 刷盘靠 sync_binlog(设为 1 表示每次事务提交都 fsync),redo log 靠 innodb_flush_log_at_trx_commit(1 = 每次提交都刷盘)。若两者都设为 1,写性能明显下降,尤其在高并发小事务场景;若设为 0 或 2,则存在 crash 后最多丢失 1 秒数据的风险。
生产环境常见折中配置:
-
sync_binlog = 1+innodb_flush_log_at_trx_commit = 1:强一致性,适合金融类系统 -
sync_binlog = 1000+innodb_flush_log_at_trx_commit = 2:兼顾性能与可用性,适用于大部分 Web 应用
别忽略磁盘本身:即使参数设为 1,如果底层是带写缓存但未启用电池/电容保护的 RAID 卡,仍可能丢日志。
查看当前日志状态优先用 SHOW VARIABLES 和 SHOW MASTER STATUS
验证配置是否生效,不要只看配置文件。运行中检查 binlog 是否开启,执行:
SHOW VARIABLES LIKE 'log_bin'; -- 返回 ON 才算真开了
查当前 binlog 文件和位置:
SHOW MASTER STATUS;
查 redo log 状态,主要看:
SHOW VARIABLES LIKE 'innodb_log%';
特别注意 innodb_log_file_size 和 innodb_log_files_in_group 的值是否与配置一致;innodb_log_buffer_size 影响的是内存缓冲区,调太大反而浪费,一般 8–16MB 足够。
线上改日志配置前,务必确认备份完整、有回滚方案——redo log 文件删错或大小配错,MySQL 就起不来。










