Binlog暴增本身不直接造成IO瓶颈,但它会通过强制高频刷盘、阻塞事务提交、挤占磁盘带宽三重机制拖垮IO;判断其为真凶需交叉验证四点:SHOW PROCESSLIST中大量线程卡在Writing to net或Updating,iostat显示w_await>10ms(SSD)或>50ms(HDD),Innodb_log_writes与Binlog_cache_use同步飙升,ps与iotop确认mysqld高iowait且刷mysql-bin.*,以及SHOW BINARY LOGS总大小超2GB且单日增长>5GB而业务无明显变化。

Binlog暴增本身不直接造成IO瓶颈,但它会通过强制高频刷盘、阻塞事务提交、挤占磁盘带宽这三重机制把IO拖垮——先确认是不是它在作祟,再动手。
怎么判断 binlog 是真凶,不是背锅侠?
别一看到磁盘%util高就去调sync_binlog。先交叉验证四点:
-
SHOW PROCESSLIST里大量线程卡在Writing to net或Updating,同时iostat -x 1显示某块盘w_await > 10ms(SSD)或> 50ms(HDD) -
SHOW GLOBAL STATUS LIKE 'Innodb_log_writes'和Binlog_cache_use同步飙升,说明redo+binlog双写压力大 -
ps -eo pid,comm,iowait里mysqld的iowait持续>10%,且iotop -oP确认是它在刷mysql-bin.* -
SHOW BINARY LOGS总大小超2GB,单日增长>5GB,而业务写入量没明显变化——大概率是格式或SQL低效导致日志膨胀
为什么 ROW 格式会让 binlog 疯涨?
ROW 格式记录每一行变更的完整镜像,一次UPDATE t SET status=1 WHERE id IN (1,2,3...1000)会生成1000条事件;STATEMENT 只记一条SQL。高频批量更新场景下,体积差常达5–10倍。
- 查当前格式:
SHOW VARIABLES LIKE 'binlog_format'; - 临时切 STATEMENT:
SET GLOBAL binlog_format = 'STATEMENT';(需确认无NOW()、RAND()等非确定函数) - 永久生效:在
my.cnf的[mysqld]段加binlog_format = STATEMENT,重启后验证 - 注意:含触发器、存储过程或GTID复制时慎用,MIXED 是更稳妥的折中选择
清理 binlog 前必须守住的两个安全线
删错一个文件,主从立刻中断,报错Got fatal error 1236。安全边界只有两个:
-
主库视角:
SHOW MASTER STATUS返回的File字段(如mysql-bin.000142)是当前正在写的文件,PURGE TO目标必须≥这个序号+1 -
从库视角:每台从库执行
SHOW SLAVE STATUS\G,取所有Relay_Master_Log_File中序号最小的那个(如mysql-bin.000135),这就是你能删的最老文件——PURGE TO 'mysql-bin.000136'; - 执行后若
df -h没释放空间,跑lsof | grep deleted,看到mysql-bin.* deleted说明句柄未关,此时FLUSH BINARY LOGS;或重启MySQL - 严禁
rm -f mysql-bin.*,MySQL进程仍持有句柄,空间不会回收
自动清理配置在 MySQL 8.0+ 必须用 binlog_expire_logs_seconds
expire_logs_days在8.0.23+已废弃,设了也不生效。只配这个参数还可能被覆盖:
- 临时生效:
SET GLOBAL binlog_expire_logs_seconds = 604800;(7天),并同步清旧参数:SET GLOBAL expire_logs_days = 0; - 永久生效:编辑
/www/server/mysql/etc/my.cnf(宝塔路径)或/etc/my.cnf,在[mysqld]下加两行:binlog_expire_logs_seconds = 604800和expire_logs_days = 0 - 重启后验证:
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';必须返回你设的值 - 注意:该策略只对「已轮转完成」的旧binlog生效,堆积的旧文件仍需手动
PURGE一次
真正容易被忽略的是:binlog暴增常是表结构或SQL写法的问题外显——比如没走索引的大范围UPDATE、全表DELETE、或应用层循环单条INSERT。调参能缓解,但不解决根因。


















