RDS MySQL实例的空间使用率是日常需要重点关注的监控项之一,如果实例的存储空间不足,会导致严重后果,例如数据库无法写入、数据库无法备份、存储空间扩容任务耗时过长等。本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案。
查看空间使用情况
您可以在实例的基本信息页面查看存储空间使用情况,但是这里只展示当前的空间使用总量,没有展示各类数据分别占用的磁盘空间信息,也没有空间使用的历史信息。
您可以在控制台查看实例各类数据占用的磁盘空间信息,详情请参见查看监控信息。
您可以在控制台的
页面,单击空间分析页签,查看实例更详细的空间使用情况,包括数据与日志的空间使用对比、空间使用的历史变化趋势、Top数据库空间明细、Top表空间明细等。说明表空间包含数据空间、索引空间和未使用空间(已保留给该表但还未分配使用的空间)。
空间大小是从统计信息中采集的,和真实的空间大小可能会存在误差。
登录数据库后执行命令
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引擎),可以大大降低数据占用的磁盘空间。
高可用云盘版实例可以开启存储空间自动扩容功能,防止空间不足被锁定。更多信息,请参见设置存储空间自动扩容。
采用分析型数据库。