我想知道我的 Amazon Relational Database Service (Amazon RDS) for MySQL 数据库实例的空间使用量为何超出预期。我还想优化磁盘存储。
解决方法
要监控 Amazon RDS 数据库实例的可用存储空间,您可以使用 Amazon CloudWatch 指标 FreeStorageSpace。但是,FreeStorageSpace 指标并不会显示数据库实例中的存储使用情况。要确定存储使用情况并回收存储空间,请使用以下方法。
运行 OPTIMIZE TABLE
表仅会使用未被主动使用的空间。但是,Amazon RDS 仍会为表分配空间。如果您启用了 innodb_file_per_table,则可以运行 OPTIMIZE TABLE 命令来回收空间。有关详细信息,请参阅 MySQL 网站上的 OPTIMIZE TABLE statement。
您可以对 InnoDB、MyISAM 和 ARCHIVE 表使用 OPTIMIZE TABLE。当您根据 Amazon RDS 的默认 innodb_file_per_table 配置设置在单独的表空间中创建表时,OPTIMIZE TABLE 将生效。有关详细信息,请参阅 MySQL 网站上的 File-per-table tablespaces。
Amazon RDS 接受 OPTIMIZE TABLE 命令,但实际上它会改为运行 ALTER TABLE...FORCE 命令。发生此情况时,您会收到一条类似于以下内容的警告消息:
“表不支持优化,请改为重新创建并分析。”
更新您的统计数据,然后运行以下 information_schema.tables 查询,以根据统计数据估算存储使用情况:
SELECT table_name,
data_length,
max_data_length,
index_length,
data_free
FROM
information_schema.tables
WHERE table_schema='schema_name'
;
**注意:**在上述查询中,请根据您的用例添加值。
data_free 列显示了分配给表但未被主动使用的可用空间量。
减少应用程序表的存储空间
要查看应用程序表在 RDS MySQL 数据库实例上使用的存储空间量,请运行以下查询:
SELECT TABLESPACE_NAME,
ROUND(DATA_FREE/EXTENT_SIZE,0) FREE_DATA_MB,
FREE_EXTENTS FREE_EXTENTS_MB, TOTAL_EXTENTS
TOTAL_EXTENTS_MB FROM
INFORMATION_SCHEMA.FILES;
要查找 RDS MySQL 数据库实例上最大的应用程序表,请运行以下查询:
SELECT TABLESPACE_NAME,
ROUND(DATA_FREE/EXTENT_SIZE,0) FREE_DATA_MB,
FREE_EXTENTS FREE_EXTENTS_MB,
TOTAL_EXTENTS TOTAL_EXTENTS_MB FROM
INFORMATION_SCHEMA.FILES
ORDER BY TOTAL_EXTENTS_MB DESC;
**注意:**如果数据库包含变长列长度超过 768 字节的表,则无法计算该数据库和表使用的单独存储空间。此限制包括 BLOB、TEXT、VARCHAR 和 VARBINARY 命令。
减少二进制日志的存储空间
如果您向 Amazon RDS 实例添加只读副本,则源实例的二进制日志将使用额外的存储空间。要确定源实例上的二进制日志使用的存储空间量,请查看 BinLogDiskUsage CloudWatch 指标。如果二进制日志使用的存储空间不断增加,则您可能需要同步只读副本。
减少或关闭常规日志和慢查询日志的存储空间
当您关闭常规日志和慢查询日志参数时,您的实例会开始存储日志和日志备份。要轮换文件并控制磁盘使用量,请查看 mysql.rds_rotate_general_log 和 mysql.rds_rotate_slow_log。
**注意:**在不进行故障排除时,最佳做法是关闭常规日志和慢查询日志。
管理或减少 InnoDB 系统表空间的大小
系统表空间初始为 10 MB 空间,包含 InnoDB 数据字典和 undo 空间。分配空间后,文件至少为 10 MB,且可使用更多可用存储空间。
默认情况下,Amazon RDS 会将 innodb_file_per_table 设置为 1,以便数据库将每个表空间的数据存储在自己的 .ibd 文件中。要恢复相关表的可重用空间,请使用 OPTIMIZE TABLE 调整每个表空间文件的大小。或者,您可以删除表。
如果您将 innodb_file_per_table 设置为 0,则 Amazon RDS 会将所有表分配给系统表空间。如果您删除表或索引,或从系统中已分配的表中删除或截断数据,则表空间会将这些空间标记为可重用。但是,innodb_file_per_table 不会为文件系统释放空间。
您无法缩小系统表空间所处实例的表空间大小。相反,请导出当前数据库的数据,然后将数据导入新实例。要减少停机时间,请将您的新 MySQL 实例配置为源 Amazon RDS 实例的副本。将该副本与源 Amazon RDS 实例同步后,切换到新实例。
**注意:**当您从快照恢复或创建只读副本时,无法从系统表空间恢复空间。两种方法均使用包含系统表空间的源实例存储卷的快照。
相关信息
Amazon RDS 数据库实例耗尽存储空间
修改 Amazon RDS 数据库实例
如何对使用 Amazon RDS for MySQL 时出现的“MySQL HA_ERR_RECORD_FILE_FULL”错误进行故障排除?