SET sql_log_bin = 0; PURGE BINARY LOGS BEFORE NOW() - INTERVAL 1 DAY; du -sh /var/lib/mysql/* | sort -h | tail -5
压测造数跑了两小时,磁盘使用率从 40% 冲到 100%,MySQL 报 1030 Got error 28,所有写入变成只读。看数据目录 300G,其中 binlog 占了 180G。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:压测库和主库在同一个实例,造数全走正常写入,binlog 按行记录。expire_logs_days 设的是 7 天,压测两小时产生的日志足够把盘写满。压测脚本没有清理步骤,跑完数据一直留着。
「压测数据撑满磁盘」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
处理上按这个顺序:压测前把 binlog 过期时间临时调到 1 天 或关掉当前会话的 binlog;造数用批量导入 减少事务数;压测结束按表清数据 别只删一部分;给数据目录单独挂盘 和应用日志分开。
确认没问题再收工,磁盘回到 60% 以下,写入恢复正常,binlog 目录小于 20G。
