RDS MySQL实例的空间使用率是日常需要重点关注的监控项之一,如果实例的存储空间不足,会导致严重后果,例如数据库无法写入、数据库无法备份、存储空间扩容任务耗时过长等。本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案。

查看空间使用情况

  • 您可以在实例的基本信息页面查看存储空间使用情况,但是这里只展示当前的空间使用总量,没有展示各类数据分别占用的磁盘空间信息,也没有空间使用的历史信息。基本信息
  • 您可以在控制台的监控与报警页面,单击标准监控页签内的资源监控,查看实例各类数据占用的磁盘空间信息,并且会显示历史变化曲线。磁盘空间
  • 您可以在控制台的自治服务 > 一键诊断页面,单击空间分析页签,查看实例更详细的空间使用情况,包括数据与日志的空间使用对比、空间使用的历史变化趋势、Top数据库空间明细、Top表空间明细等。空间分析1空间分析2
    说明
    • 表空间包含数据空间、索引空间和未使用空间(已保留给该表但还未分配使用的空间)。
    • 空间大小是从统计信息中采集的,和真实的空间大小可能会存在误差。
  • 登录数据库后执行命令show table status like '<表名>';查看表空间。

索引太多导致空间不足

  • 现象

    通常表上除了主键索引,还存在二级索引,二级索引越多,整个表空间越大。

  • 解决方案

    优化数据结构,减少二级索引数量。

大字段导致空间不足

  • 现象

    如果表结构定义中有blob、text等大字段或很长的varchar字段,也会占用更大的表空间。

  • 解决方案

    将数据压缩以后再插入。

空闲表空间太多导致空间不足

  • 现象

    空闲表空间太多是指InnoDB表的碎片率高。InnoDB是按页(Page)管理表空间的,如果Page写满记录,然后部分记录又被删除,后续这些删除的记录位置又没有新的记录插入,就会产生很多空闲空间。

  • 解决方案

    可以通过命令show table status like '<表名>';查看表上空闲的空间,如果空闲空间过大,可以执行命令optimize table <表名>;整理表空间。

临时表空间过大导致空间不足

  • 现象
    • 半连接(Semi-join)、去重(distinct)、不走索引的排序等操作,会创建临时表,如果涉及的数据量过多,可能导致临时表空间特别大。
    • DDL操作重建表空间时,如果表特别大,创建索引排序时产生的临时文件也会特别大。RDS MySQL 5.6和5.7不支持即时增加字段,很多DDL是通过创建新表实现的,DDL执行结束再删除旧表,DDL过程中会同时存在两份表。
  • 解决方案
    • 可以查看执行计划,确认是否包含Using Temporary
    • 大表DDL需要注意实例的空间是否足够,不足的话需要提前升级存储空间

空间优化方案

  • 使用空间碎片自动回收。开启该功能后,主实例会自动执行Optimize Table命令来回收表空间碎片,帮助您整理物理空间碎片。
  • 使用云盘存储。云盘支持的存储空间比本地盘更大。
  • 使用X-Engine引擎。X-Engine是支持高压缩比的存储引擎。
  • 使用PolarDB。PolarDB采用分布式存储,支持超大存储空间,且支持自动扩容,结合PolarDB历史库(采用X-Engine引擎),可以大大降低数据占用的磁盘空间。
  • 高可用云盘版实例可以开启存储空间自动扩容功能,防止空间不足被锁定。更多信息,请参见设置存储空间自动扩容
  • 采用分析型数据库