MySQL磁盘占用突增主因是日志膨胀、大表增长、临时文件堆积或未清理中继日志;需优先检查binlog等活跃日志、定位异常大表与碎片、排查tmpdir与relay log、验证auto_increment相关配置并定期巡检。

MySQL磁盘占用突然升高,通常不是单一原因导致,而是日志膨胀、大表增长、临时文件堆积或未清理的备份/中继日志共同作用的结果。快速定位关键源头比盲目清理更有效。
检查活跃日志文件是否失控
binlog、redo log、slow query log 和 general log 是最常“偷偷吃掉”磁盘空间的日志类型。尤其 binlog 在主从复制或未配置自动清理时极易累积:
- 执行 SHOW VARIABLES LIKE 'log_bin'; 确认 binlog 是否开启;
- 用 SHOW BINARY LOGS; 查看当前 binlog 文件数量和大小;
- 检查 expire_logs_days(MySQL 8.0 前)或 binlog_expire_logs_seconds(MySQL 8.0+)是否设为 0 或过大;
- 若需立即释放空间,可手动执行 PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';(注意:主从环境下需确认从库已同步)。
定位异常增长的大表或碎片化表
某些表因频繁 DELETE/UPDATE 导致数据页空洞,或业务误操作写入大量测试/日志数据,会使 ibdata1 或独立表空间(innodb_file_per_table=ON)急剧膨胀:
- 运行 SELECT table_schema, table_name, round(((data_length + index_length) / 1024 / 1024), 2) AS size_mb FROM information_schema.tables ORDER BY size_mb DESC LIMIT 10; 找出体积 Top 10 的表;
- 对疑似表执行 SHOW TABLE STATUS LIKE 'table_name';,关注 Data_free 字段——若远大于 0(如几百MB),说明存在严重碎片;
- 确认业务无写入后,对大且碎片高的表执行 OPTIMIZE TABLE table_name;(InnoDB 表会重建,需锁表;MySQL 5.7+ 支持 ALGORITHM=INPLACE 减少影响)。
排查临时文件与未清理的中继日志
大查询排序、GROUP BY、JOIN 或子查询可能生成大量临时表,若 tmpdir 指向 MySQL 数据目录,就会直接撑爆磁盘。从库还可能残留已应用完的 relay log:
- 检查 SHOW VARIABLES LIKE 'tmpdir';,确认临时目录是否与 datadir 相同;
- 查看 SHOW GLOBAL STATUS LIKE 'Created_tmp%';,若 Created_tmp_disk_tables 持续增长,说明内存不足导致频繁落盘;
- 从库上执行 SHOW SLAVE STATUS\G,观察 Relay_Log_File 和 Relay_Master_Log_File,再结合 ls -lh /path/to/relay-log* 确认是否有旧 relay log 未被 purge;
- 在从库执行 RESET SLAVE;(慎用!会清空复制信息)或更安全的 PURGE RELAY LOGS BEFORE 'mysql-relay-bin.000100';(指定保留点)。
验证并限制自动增长行为
auto_increment 列本身不占空间,但若配合无主键表、或触发器反复插入,可能引发隐式全表扫描+临时表;同时,innodb_autoextend_increment 过大会让 ibdata1 或 .ibd 文件“一步涨很多”:
- 检查是否有表缺失主键:SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('mysql','information_schema','performance_schema','sys') AND engine='InnoDB' AND table_name NOT IN (SELECT table_name FROM information_schema.key_column_usage WHERE constraint_name='PRIMARY');
- 查看 SHOW VARIABLES LIKE 'innodb_autoextend_increment';,默认值 64(单位:MB),若业务写入量小但该值过大,会导致每次扩展浪费空间;
- 调整建议:SET GLOBAL innodb_autoextend_increment = 4;(重启后失效,如需持久化需写入 my.cnf)。
不复杂但容易忽略——多数突发磁盘暴涨背后,是某个配置项长期未调优,或一次未回滚的批量导入/日志开关误开。定期用脚本巡检日志生命周期、表碎片率和 tmpdir 分离状态,能避免半夜告警。
以上就是mysql磁盘占用突然升高怎么办_mysql存储问题排查的详细内容,更多请关注php中文网其它相关文章!