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 就起不来。
