MySQL磁盘空间不足时表现为写入失败、无法建表、主从中断或崩溃;应先用df -h和du定位大文件,再安全清理(如PURGE BINARY LOGS、TRUNCATE TABLE)、优化存储(innodb_file_per_table、字段类型)并建立监控预警机制。
MySQL磁盘空间不足时,最直接的表现是写入失败、无法创建表、主从同步中断或服务崩溃。关键不是等报错才处理,而是快速定位大文件、释放无效数据、优化存储结构,并建立长期监控机制。
先确认是哪个分区满了(常用 df -h),再聚焦 MySQL 数据目录(datadir,可通过 SHOW VARIABLES LIKE 'datadir'; 查看)。进入该目录后:
du -sh * | sort -hr | head -20 快速列出最大的库/文件du -sh *.ibd | sort -hr 找出最大的表ibtmp1 过大、未清理的 .err 或慢日志)information_schema.TABLES 只反映 InnoDB 表估算大小,实际物理占用以 .ibd 文件为准不建议直接删文件,应通过 SQL 或规范操作释放:
DELETE FROM table WHERE ... + OPTIMIZE TABLE(注意锁表,生产环境慎用)TRUNCATE TABLE 比 DELETE 更快且立即释放空间(但不可回滚)DROP 表,或用 ALTER TABLE ... REMOVE PARTITIONING(若已分区)PURGE BINARY LOGS BEFORE '2025-01-01'; 或设置 expire_logs_days = 7
general_log=OFF)、限制慢日志大小释放只是治标,需从配置和设计上减少空间浪费:
innodb_file_per_table=ON(默认开启),确保每张表独立 .ibd,便于单独回收空间TEXT/BLOB 存大量冗余内容,考虑外存或压缩存储TINYINT 代替 INT,用 VARCHAR(50) 代替 VARCHAR(255)
SELECT table_name, data_free FROM information_schema.tables WHERE data_free > 1024*1024*100;(>100MB 碎片)ROW_FORMAT=COMPRESSED(需启用 innodb_file_format=Barracuda)靠人工巡检容易滞后,应主动预警:
zabbix / prometheus + mysql
d_exporter 监控 mysql_global_status_innodb_data_pending_fsyncs 和磁盘使用率datadir 使用率,超 85% 自动发邮件/钉钉告警SELECT table_schema, table_name, round((data_length+index_length)/1024/1024,2) size_mb FROM information_schema.tables ORDER BY size_mb DESC LIMIT 10;