我在 MySQL 上的 Amazon Relational Database Service (Amazon RDS) 数据库实例使用的空间超过了预期。为什么会出现这种情况,我该如何优化磁盘存储?

您可以使用 FreeStorageSpace Amazon CloudWatch 指标监控 RDS 数据库实例可用的存储空间,但该指标不会说明数据库实例如何使用存储。

不过您可以利用几个策略来回收存储空间:

运行 OPTIMIZE TABLE

表所占用的部分空间并未主动使用,但仍会分配给表。如果启用了 innodb_file_per_table(默认情况下启用),您可以使用 OPTIMIZE TABLE 回收这些空间。

如需检查碎片化,您可以使用类似于下文的查询:

SELECT
	table_name,
	data_length,
	max_data_length,
	index_length,
	data_free
FROM
	information_schema.tables 
WHERE table_schema='schema_name'
;

data_free 列突出显示分配给表且未主动使用的空闲空间量。如果在单独的表空间中按照 RDS 默认 innodb_file_per_table 配置设置创建了表,则您可使用 OPTIMIZE TABLE 来回收此空间。

减少应用程序表存储

如需查看数据库实例上的应用程序表使用了多少存储,您可运行类似于下文的查询:

SELECT 
	table_schema,
	SUM(data_length + index_length + data_free)/1024/1024 AS total_mb,
	SUM(data_length)/1024/1024 AS data_mb,
	SUM(index_length)/1024/1024 AS index_mb,
	SUM(data_free)/1024/1024 AS free_mb,
	COUNT(*) AS tables,
	CURDATE() AS today 
FROM 
	information_schema.tables
	GROUP BY table_schema
	ORDER BY 2 DESC
;

如需查找数据库实例上最大的应用程序表,您可运行类似于下文的查询:

SELECT 
	table_schema,
	table_name,
	(data_length + index_length + data_free)/1024/1024 AS total_mb,
	(data_length)/1024/1024 AS data_mb,
	(index_length)/1024/1024 AS index_mb,
	(data_free)/1024/1024 AS free_mb,
	CURDATE() AS today
FROM 
	information_schema.tables
	ORDER BY 3 DESC
;

注意:如果数据库包含的表具有长度可变的列,并且列长度超过了 768 字节(例如,BLOB、TEXT、VARCHAR 或 VARBINARY),则无法计算单独数据库和表使用的存储总量。

减少二进制日志存储

添加只读副本会导致主实例的二进制日志使用额外的存储。如需查明主实例上的二进制日志使用了多少存储,请检查 BinLogDiskUsage CloudWatch 指标。如果出现大量增长,则可能表明一个或多个只读副本未同步。有关更多信息,请参阅访问 MySQL 二进制日志

减少或禁用一般日志及慢速查询日志存储

启用一般日志和慢速查询日志参数会导致数据库实例开始存储并备份这些日志。如需轮换这些文件并控制磁盘用量,请参阅 mysql.rds_rotate_general_logmysql.rds_rotate_slow_log

注意:为避免潜在的性能和磁盘使用问题,在您无需主动使用一般日志和慢速查询日志进行问题排查时,请禁用它们。

管理或减少 InnoDB 系统表空间大小

系统表空间包含 InnoDB 数据字典和撤消空间,其大小从 10 MB 起。分配了空间之后,文件始终最少保持此大小,不过长时间运行的事务会消耗更多的可用存储。

默认情况下,RDS 将 innodb_file_per_table 设置为 1,这意味着各个表空间的数据存储在自己的 .ibd 文件中。如需回收标记为可供相关表重用的空间,请使用 OPTIMIZE TABLE 命令来调整各表的表空间文件大小或者删除表。

如果 innodb_file_per_table 设置为 0,则所有表空间也将分配到系统表空间。删除表或索引,或者删除或截断系统表空间中所分配表的数据,可以将之前占据的空间标记为可重用。但是,该命令不会释放任何空间到文件系统。

由于它无法就地缩小系统表空间大小,请导出您当前表空间的数据并将数据导入新实例。要想缩短停机时间,请配置您的新 MySQL 实例作为源 RDS 主实例的从属实例。将从属实例与源 RDS 主实例同步时,切换到新实例。有关手动复制的信息,请参阅与在 Amazon RDS 外部运行的 MySQL 或 MariaDB 实例相关的复制

注意:从快照还原或者创建只读副本无助于从系统表空间中回收空间。这是因为这两种方法均使用包含系统表空间的源实例存储卷的快照。


此页内容对您是否有帮助? |

返回 AWS Support 知识中心

需要帮助? 访问 AWS 支持中心

发布时间:2015 年 11 月 3 日

更新时间:2018 年 12 月 28 日