跳至内容

我的 Amazon RDS for MySQL 数据库实例的存储空间使用量为何超出预期?

2 分钟阅读
0

我想知道我的 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 字节的表,则无法计算该数据库和表使用的单独存储空间。此限制包括 BLOBTEXTVARCHARVARBINARY 命令。

减少二进制日志的存储空间

如果您向 Amazon RDS 实例添加只读副本,则源实例的二进制日志将使用额外的存储空间。要确定源实例上的二进制日志使用的存储空间量,请查看 BinLogDiskUsage CloudWatch 指标。如果二进制日志使用的存储空间不断增加,则您可能需要同步只读副本。

减少或关闭常规日志和慢查询日志的存储空间

当您关闭常规日志和慢查询日志参数时,您的实例会开始存储日志和日志备份。要轮换文件并控制磁盘使用量,请查看 mysql.rds_rotate_general_logmysql.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”错误进行故障排除?