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),则系统无法计算单个数据库和表所占用的总存储空间。

减少二进制日志存储

添加只读副本会导致主实例的二进制日志占用额外存储。要了解主实例的二进制日志所占用的存储空间,请查看二进制日志磁盘用量 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 年 4 月 2 日