information_schema.FILES可准确查看MySQL 5.7+各表空间磁盘实际占用,FILE_SIZE为文件系统大小,DATA_FREE为InnoDB空闲页,差值约等于已用数据页;binlog/relay_log需结合文件系统与配置监控;ibdata1在innodb_file_per_table=OFF时不可收缩;磁盘监控须叠加df -h与inotifywait,缺一不可。

查 information_schema.FILES 看数据文件实际占用
MySQL 5.7+ 的 information_schema.FILES 表直接暴露了每个表空间(包括系统表空间、独立表空间、undo 表空间)在磁盘上的真实大小,比 SHOW TABLE STATUS 或 du 更可靠,因为它绕过了文件系统缓存和临时文件干扰。
常用查询:
SELECT
FILE_TYPE,
TABLESPACE_NAME,
FILE_NAME,
ROUND(SUM(FILE_SIZE)/1024/1024, 2) AS size_mb,
ROUND(SUM(DATA_FREE)/1024/1024, 2) AS free_mb
FROM information_schema.FILES
WHERE FILE_TYPE IN ('DATAFILE', 'UNDO LOG')
GROUP BY FILE_TYPE, TABLESPACE_NAME, FILE_NAME
ORDER BY size_mb DESC;
-
FILE_SIZE是操作系统层看到的文件大小(含碎片和未回收空间),DATA_FREE是 InnoDB 内部标记为“可重用”的空闲页空间,二者差值≈当前已用数据页 - 注意
FILE_NAME可能是相对路径(如./test/t1.ibd),需结合datadir配置确认真实位置 - 该表默认不记录 binlog、relay log、slow log 等日志文件——它们压根不在 InnoDB 管理范围内
监控 binlog 和 relay_log 增长要靠文件系统 + 配置双查
MySQL 不提供内置视图汇报 binlog 文件体积,必须依赖外部手段,但不能只靠 ls -l:自动清理(expire_logs_days)、手动 purge(PURGE BINARY LOGS)、复制延迟都会让磁盘占用波动剧烈。
- 先确认 binlog 开关和位置:
SHOW VARIABLES LIKE 'log_bin';、SHOW VARIABLES LIKE 'log_bin_basename'; - 看当前活跃日志:
SHOW BINARY LOGS;返回的是已写入且未被 purge 的文件名与大小,但不包含正在写的mysql-bin.000001的实时增长量 - 真正要盯住的是磁盘上整个 binlog 目录的总大小,配合
du -sh /var/lib/mysql/mysql-bin.*(路径以log_bin_basename为准) - 如果启用了
relay_log_purge=OFF(常见于延迟从库),relay_log文件会持续堆积,必须单独监控其目录
innodb_file_per_table=OFF 时,ibdata1 膨胀不可逆
当关闭独立表空间时,所有用户表数据、索引、undo、insert buffer 都挤进共享表空间 ibdata1。这个文件一旦变大,即使删掉大量表,ibdata1 也不会缩容——InnoDB 只回收内部页,不返还磁盘空间给操作系统。
- 检查是否启用:
SHOW VARIABLES LIKE 'innodb_file_per_table';,返回OFF就踩中这个坑 - 此时
information_schema.FILES中TABLESPACE_NAME='innodb_system'对应的FILE_NAME很可能就是ibdata1,它的FILE_SIZE只增不减 - 想释放空间?只能导出全部数据 → 删除
ibdata1→ 重启 MySQL → 重新导入。生产环境慎操作,停机时间长,且要求innodb_fast_shutdown=0
用 df -h 和 inotifywait 做轻量级实时告警
数据库层无法感知磁盘满,但 OS 层可以。单纯查 MySQL 视图不够,必须叠加系统级监控,否则等 ERROR 3(无法写入磁盘)报出来就晚了。
-
df -h /var/lib/mysql比查 MySQL 表更早发现问题,建议阈值设为 85%,而非 95% - 对高频写入场景(如日志表、监控埋点),可用
inotifywait -m -e modify /var/lib/mysql/监听文件变更,配合stat快速判断单个.ibd或binlog是否在持续膨胀 - 注意:不要监听整个
datadir下所有子目录,inotify 有句柄数限制;优先监控ibdata1、ib_logfile*、mysql-bin.*所在目录
磁盘空间问题从来不是单一维度的事:MySQL 视图告诉你“里面装了多少”,文件系统告诉你“盒子还剩多大”,而配置项(比如 innodb_file_per_table)决定了这个盒子能不能拆开重装。三者漏掉任何一个,监控就只剩半截。










