Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
如何对显示存储空间已满的 RDS for MySQL 或 MariaDB 实例进行故障排除?
我想对显示存储空间已满的 Amazon Relational Database Service (Amazon RDS) for MySQL 或 MariaDB 实例进行故障排除。
简短描述
要对显示存储空间已满的 Amazon RDS for MySQL 或 MariaDB 实例进行故障排除,请检查数据库实例上的已用总空间,以识别占用空间的对象。您可以将数据库实例上的空间用于以下对象:
- 用户创建的数据库
- 临时表
- 二进制日志或者 MySQL 备用实例中继日志(如果使用读取副本)
- InnoDB 表空间
- 常规日志、慢速查询日志和错误日志
在检查存储空间并识别占用空间的对象后,您可以回收空间。然后,您可以监控 FreeStorageSpace 指标,以防止以后出现存储空间问题。
**注意:**如果可用存储空间突然减少,请运行 SHOW FULL PROCESSLIST 命令,以在数据库实例级别检查查询。SHOW FULL PROCESSLIST 命令会提供有关所有活动连接和每个连接执行的查询的信息。要查看长期处于活动状态的事务,请先运行 INFORMATION_SCHEMA.INNODB_TRX 或 SHOW ENGINE INNODB STATUS 命令。然后,查看输出。
解决方法
要对显示存储空间已满的 Amazon RDS for MySQL 或 MariaDB 实例进行故障排除,请完成以下步骤:
检查您的 MySQL 数据库实例上已使用的总空间
确定每个用户创建的数据库的大小
SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",1) AS DATABASE_NAME, ROUND((DATA_FREE/1024/1024/1024),3) AS 'REUSABLE (GB)', ROUND(SUM((TOTAL_EXTENTS * EXTENT_SIZE)/1024/1024/1024),3) AS 'TOTAL (GB)' FROM INFORMATION_SCHEMA.FILES GROUP BY DATABASE_NAME ORDER BY 'TOTAL (GB)' DESC;
检查您指定的用户数据库中每个表的大小:
**注意:**请将 example-database-name 替换为您的数据库名称。
SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",-1) as 'TABLE_NAME', ROUND((total_extents * extent_size)/1024/1024/1024,3) AS "TableSizeinGB" from information_schema.files WHERE FILE_NAME LIKE 'example-database-name';
检查您的 MariaDB 实例上已使用的总空间
确定每个用户创建的数据库的大小:
mysql> SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024/1024,2) "size in GB" FROM information_schema.tables GROUP BY 1 ORDER BY 2 DESC;
检查您指定的用户数据库中每个表的大小:
**注意:**请将 example-database 替换为数据库名称,将 example-table 替换为表名称。
mysql> SELECT table_schema "example-database", example-table,(data_length + index_length)/1024/1024/1024 AS "TableSizeinGB" from information_schema.tables where table_schema='database_name';
检查您的临时表
InnoDB 用户创建的临时表和磁盘上的内部临时表是在名为 ibtmp1 的临时表空间文件中创建的。临时表空间文件可以扩展到 MySQL 数据目录中的 ibtmp2。如果临时表 ibtmp1 使用的存储空间过多,请重启数据库实例以释放空间。
**注意:**只能使用 MySQL 5.7 及更高版本或 MySQL 8.0 及更高版本来查询 InnoDB 表空间的文件大小。
识别 InnoDB 临时表空间:
mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibtmp%';
要回收全局临时表空间数据文件占用的磁盘空间,请重启 MySQL 服务器或重启数据库实例。有关详细信息,请参阅 MySQL 网站上的 The temporary tablespace(临时表空间)。
检查您的 InnoDB 表空间
MySQL 可能会因查询而创建无法删除的内部临时表。这些临时表不是 information_schema 中名为 tables 的表的一部分。有关详细信息,请参阅 MySQL 网站上的 Internal temporary table use in MySQL(MySQL 中的内部临时表使用)。
识别内部临时表:
mysql> SELECT * FROM information_schema.innodb_sys_tables WHERE name LIKE '%#%';
识别 InnoDB 系统表空间:
mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibdata%';
**注意:**MySQL 5.7 及更高版本或 MySQL 8.0 及更高版本支持上述查询。
当系统表空间的大小增加后,无法再将其缩小。要解决此问题,您可以转储您的 InnoDB 表,并将这些表导入新的 MySQL 数据库实例。为避免系统表空间过大,请使用 file-per-table 表空间。有关详细信息,请参阅 MySQL 网站上的 File-per-table tablespaces(File-per-table 表空间)。
如果您启用 Innodb_file_per_table,则每个表都会将数据和索引存储在自己的表空间文件中。要回收空间,请运行 OPTIMIZE TABLE。有关详细信息,请参阅 MySQL 网站上的 OPTIMIZE TABLE statement(OPTIMIZE TABLE 语句)。
**注意:**OPTIMIZE TABLE 命令会使用 COPY 算法创建与原始表大小相同的临时表。在运行 OPTIMIZE TABLE 之前,请确保有可用的磁盘空间。
要优化表,请运行以下命令:
**注意:**请将 example-table-name 替换为要优化的表。
mysql> OPTIMIZE TABLE example-table-name;
(可选)要重建表,请运行以下命令:
**注意:**请将 example-table-name 替换为要优化的表。
mysql> ALTER TABLE example-table-name ENGINE=INNODB;
检查您的二进制日志
如果您在 Amazon RDS 实例上启用了自动备份,则数据库实例上将自动激活二进制日志。二进制日志存储在磁盘上并占用存储空间,但在每次配置二进制日志保留时都会被删除。实例的默认 binlog 保留值设置为 Null,文件会被立即删除。
为避免存储空间不足问题,请在 Amazon RDS for MySQL 中为二进制日志保留期设置适当的值。
要查看二进制日志的保留小时数,请运行 mysql.rds_show_configuration 命令:
CALL mysql.rds_show_configuration;
要减少二进制日志使用的空间量,请减少二进制日志的保留小时数。值为 NULL 会立即删除日志。
如果活动实例有备用实例,请监控备用实例上的 ReplicaLag 指标。ReplicaLag 指标表示处理活动实例上的二进制日志或备用实例上的中继日志时出现的任何延迟。
如果存在清除或复制问题,则二进制日志可能会随时间累积并消耗额外的磁盘空间。要检查实例上的二进制日志数量和文件大小,请使用 SHOW BINARY LOGS 命令。有关详细信息,请参阅 MySQL 网站上的 SHOW BINARY LOGS statement(SHOW BINARY LOGS 语句)。
如果数据库实例充当复制备用实例,请检查 Relay_Log_Space 以查看中继日志的大小:
SHOW SLAVE STATUS\G
检查 MySQL 日志(常规日志、慢速查询日志和错误日志)
要检查慢速查询、FILE 类型的常规日志以及错误日志的大小,请查看并列出数据库日志文件。如果慢速查询日志和常规日志表使用的存储空间过多,请手动轮换日志表以管理基于表的 MySQL 日志。
要删除旧数据并回收磁盘空间,请连续运行以下命令两次:
mysql> CALL mysql.rds_rotate_slow_log;mysql> CALL mysql.rds_rotate_general_log;
注意:这些表不会提供日志的准确文件大小。请将 slow_log 和 general_log 的log_output 的参数值修改为 File。
监控和扩展 Amazon RDS 数据库实例
要监控和扩展您的 Amazon RDS 实例,请执行以下操作:
- 使用 Amazon CloudWatch 监控您的 Amazon RDS 数据库实例。
- 针对 FreeStorageSpace 指标设置 CloudWatch 警报,以便在存储空间减少至指定阈值时接收警报。有关详细信息,请参阅如何创建 CloudWatch 警报来监控 Amazon RDS 的可用存储空间并防止出现存储空间已满问题?
- 使用 Amazon RDS 存储自动扩缩功能来自动管理容量。

