MySQL磁盘爆满快速排查方案:一键查询库表空间、定位占用大户(RDS/自建通用)

MySQL磁盘爆满快速排查方案:一键查询库表空间、定位占用大户(RDS/自建通用)

摘要 :线上MySQL磁盘爆满是运维最高频的紧急故障,会直接导致数据库写入失败、业务报错、服务宕机。多数开发者遇到磁盘占用100%时,无从下手,不知道是哪个库、哪张表、日志文件占用了大量磁盘。本文结合生产实战,整理一套MySQL磁盘爆满极速排查流程,包含一键排查大库、大表、日志文件、碎片空间的全套SQL和Linux命令,适配自建MySQL、阿里云/腾讯云RDS,看完即可快速解决磁盘爆满故障。

核心关键词:MySQL磁盘爆满排查、MySQL查找占用空间最大的表、MySQL RDS磁盘占用查询、MySQL磁盘空间释放、MySQL日志清理

一、前言

线上生产环境中,MySQL磁盘100%占用是致命级故障。一旦磁盘爆满,数据库无法写入数据、无法创建临时文件、binlog无法归档,直接引发用户下单、登录、数据提交等核心业务报错。

很多运维和开发排查磁盘问题时,只会盲目删除日志、重启数据库,治标不治本,过几天磁盘再次爆满。想要彻底解决问题,必须精准定位磁盘占用大户:是业务大表、冗余索引、表碎片,还是binlog、临时文件导致的空间溢出。

本文提供一套标准化、流程化的MySQL磁盘爆满排查方案,从快速定位问题根源、精准统计空间占用、清理冗余资源、预防二次爆满四个维度讲解,所有脚本可直接用于生产应急排查。

二、应急第一步:快速确认磁盘占用整体情况

遇到磁盘爆满,优先通过服务器命令快速确认是系统文件占用,还是MySQL数据文件占用,避免无效排查。该步骤适用于所有自建MySQL服务器。

2.1 查看服务器整体磁盘使用率

复制代码

# 查看服务器磁盘整体占用情况 df -h

如果挂载MySQL数据目录的磁盘使用率100%,即可确定是MySQL相关文件导致的磁盘爆满,进入下一步精准排查。

2.2 定位MySQL数据目录磁盘占用

复制代码

# 进入MySQL数据目录上级文件夹,查看各目录占用 du -sh /* | sort -rh # 单独统计MySQL数据总占用 du -sh /usr/local/mysql/data/

通过以上命令可快速区分:是MySQL数据文件占用,还是系统日志、垃圾文件占用磁盘,精准锁定排查方向。

三、核心排查:一键找出占用空间最大的数据库

磁盘爆满后,优先排查全局所有数据库的空间占用,快速定位占用磁盘最高的业务库,针对性优化,这是最高效的排查方式。

以下SQL兼容MySQL5.7、8.0,自动换算MB/GB,按空间大小倒序排列,直接展示核心数据。

复制代码

SELECT TABLE_SCHEMA AS 数据库名称, ROUND(SUM(DATA_LENGTH + INDEX_LENGTH)/1024/1024/1024, 3) AS 数据库总大小_GB, ROUND(SUM(DATA_LENGTH)/1024/1024/1024, 3) AS 数据空间_GB, ROUND(SUM(INDEX_LENGTH)/1024/1024/1024, 3) AS 索引空间_GB, COUNT(TABLE_NAME) AS 数据表总数 FROM information_schema.TABLES GROUP BY TABLE_SCHEMA ORDER BY 数据库总大小_GB DESC;

结果解读

  • 排名第一的数据库即为磁盘占用大户,优先对该库做优化清理;

  • 对比数据空间和索引空间,若索引空间占比过高,说明存在大量冗余索引;

  • 系统库无需关注,重点排查业务数据库。

四、精准排查:找出指定库中最大的数据表

定位到爆满的数据库后,需要进一步精准排查库内超大表,90%的磁盘爆满问题,都是由单张或几张超大业务表导致。

替换对应数据库名称,执行以下SQL,自动筛选库内所有表并按空间倒序:

复制代码

SELECT TABLE_NAME AS 表名, TABLE_ROWS AS 数据行数, ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024/1024, 3) AS 表总大小_GB, ROUND(DATA_FREE/1024/1024/1024, 3) AS 碎片空间_GB, ENGINE AS 存储引擎, CREATE_TIME AS 表创建时间 FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' ORDER BY 表总大小_GB DESC;

生产优化标准

  • 单表超过 10GB:属于风险大表,需规划分表、数据归档;

  • 碎片空间超过 2GB:优先整理碎片释放磁盘;

  • 老旧归档表、临时日志表:可直接清理释放大量空间。

五、隐藏元凶:MySQL日志文件磁盘占用排查

很多时候,业务表数据并不大,但磁盘依然爆满,核心原因是MySQL各类日志文件堆积,这是最容易被忽略的磁盘占用元凶。

5.1 Binlog日志占用过高

开启主从复制的MySQL,会持续生成binlog日志,若未设置自动清理,日志会无限堆积,快速占满磁盘。

查看binlog日志大小:

复制代码

# 进入mysql数据目录查看binlog文件大小 ls -lh /usr/local/mysql/data/mysql-bin.*

临时清理方案(应急使用):

复制代码

# 清理3天前的binlog日志 PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);

永久解决方案:在my.cnf配置文件设置日志自动过期

复制代码

expire_logs_days = 3

5.2 慢查询日志、错误日志堆积

长期未清理的慢日志、错误日志会持续膨胀,占用大量磁盘空间,可直接清空日志文件,不影响业务运行。

六、InnoDB磁盘空间不释放终极解决办法

绝大多数开发者遇到过:删除了几千万数据,磁盘空间依然不释放。这是InnoDB引擎的核心特性,删除数据仅标记为空闲碎片,不会主动归还磁盘空间。

6.1 快速查询库内所有表碎片占用

复制代码

SELECT TABLE_NAME AS 表名, ROUND(DATA_FREE/1024/1024,2) AS 空闲碎片_MB, ROUND((DATA_FREE/(DATA_LENGTH+INDEX_LENGTH))*100,2) AS 碎片占比 FROM information_schema.TABLES WHERE TABLE_SCHEMA='你的数据库名' AND ENGINE='InnoDB' ORDER BY 空闲碎片_MB DESC;

6.2 三种空间释放方案(按优先级选择)

方案一:碎片整理(小表优先)

碎片占比超过30%、表数据量较小的表,低峰期执行:OPTIMIZE TABLE 表名;

方案二:数据归档+重建表(中大表)

超大表禁止使用OPTIMIZE,建议归档历史数据,新建空表迁移有效数据,删除旧表即可释放全部磁盘空间。

方案三:重启MySQL(碎片极多应急)

部分零散页碎片,可在业务停机维护时重启MySQL,自动回收部分空闲空间。

七、云RDS专属磁盘排查方法(无法登录服务器)

阿里云、腾讯云MySQL RDS无法登录服务器执行Linux命令,可通过专属SQL精准排查空间占用。

7.1 RDS一键查询磁盘空间明细

复制代码

SELECT TABLE_SCHEMA AS 库名, ROUND(SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024,2) AS 总空间_MB FROM information_schema.TABLES GROUP BY TABLE_SCHEMA ORDER BY 总空间_MB DESC;

7.2 RDS磁盘爆满专属解决方案

  • 控制台开启自动备份清理、日志自动过期

  • 通过RDS监控后台,查看磁盘空间增长曲线,定位异常膨胀表;

  • 清理无用大表、冗余索引,快速释放RDS磁盘空间。

八、磁盘爆满预防规范(生产必备)

为避免MySQL磁盘反复爆满,日常运维需遵守以下规范,从根源规避问题:

  1. 开启binlog自动过期,禁止日志无限堆积;

  2. 定期巡检超大表,对超过10GB的表做分表、归档处理;

  3. 定期清理冗余索引、无效数据,减少空间浪费;

  4. 监控磁盘使用率,设置80%使用率预警,提前扩容清理;

  5. 禁止在生产表执行大批量DELETE删除,改用分批删除、归档替换。

九、总结

MySQL磁盘爆满排查无需盲目操作,按照查磁盘整体占用→定位超大数据库→排查超大数据表→清理日志碎片→优化归档的标准化流程,即可快速解决99%的磁盘空间问题。

本文全套SQL和命令均经过生产故障验证,适配自建MySQL和云RDS,可直接收藏作为运维应急手册,遇到磁盘爆满故障直接对照排查,高效解决问题、恢复业务。

相关推荐
念越1 小时前
SQL 基础语法复习
数据库·sql·数据库系统概论
华山令狐虫1 小时前
告别手写 SQL——DBAPI 企业版 v4.6.0 推出 AI 助手
数据库·人工智能·sql·dbapi
Cx330❀1 小时前
【MySQL基础】库与表的全面操纵指南
linux·服务器·网络·数据库·c++·mysql
天丁o1 小时前
企业 AI Agent 工程化落地:从需求边界到系统集成的 6 个环节
数据库·人工智能
涛思数据(TDengine)1 小时前
从时序数据库到工业AI:涛思数据参编“人工智能+工业软件”评价规范,推动工业数据标准
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·工业数据库
Database_Cool_1 小时前
AI 时代的数据仓库:阿里云 AnalyticDB MySQL 向量检索 + SQL 分析一体化实战
数据仓库·人工智能·mysql·阿里云
点灯小铭1 小时前
基于51单片机的LED点阵汉字显示系统设计
数据库·单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
SilentSamsara1 小时前
DuckDB + Python:嵌入式 OLAP 数据库的轻量分析实战
开发语言·数据库·python·微服务
AOwhisky2 小时前
MySQL 学习笔记(第七期):高可用架构进阶与综合项目实战
linux·运维·笔记·学习·mysql·高可用·mha