Amazon RDS 实例逐渐失去可用磁盘空间

Amazon RDS 实例逐渐失去可用磁盘空间

不久前,运行我的实例的服务器有 20GB 的 EBS 存储。然后它开始出现磁盘存储错误,所以我将其增加到 40GB。然后,再次出现存储缺失错误,所以我再次将其增加到 60GB。(所以这是一个 60GB 的 RDS 实例)

您可以在这里看到可用存储空间 (MB)图表。每次它飙升时,我都会添加更多的存储空间。

在此处输入图片描述

如果我运行这个查询..

SELECT CONCAT(table_schema, '.', table_name),
       CONCAT(ROUND(table_rows / 1000000, 2), 'M')                                    rows,
       CONCAT(ROUND(data_length / ( 1024 * 1024 * 1024 ), 2), 'G')                    DATA,
       CONCAT(ROUND(index_length / ( 1024 * 1024 * 1024 ), 2), 'G')                   idx,
       CONCAT(ROUND(( data_length + index_length ) / ( 1024 * 1024 * 1024 ), 2), 'G') total_size,
       ROUND(index_length / data_length, 2)                                           idxfrac
FROM   information_schema.TABLES
ORDER  BY data_length + index_length DESC
LIMIT  10;

我收到以下回复...

在此处输入图片描述

没有什么特别突出的东西占用了大量的空间。

如果我然后运行

select table_schema, CONCAT(ROUND( sum((data_length+index_length)/1024/1024)/1024, 2), 'G') AS MB from information_schema.tables group by 1;

我可以看到最大的表大约有 10GB。 (这包括 data_length 和 index_length )

在此处输入图片描述

我的下一个想法是存储中的缓慢低点是general_log或慢查询日志写入磁盘......

如果我检查 RDS 实例上的参数组,我可以看到日志记录已被禁用。

在此处输入图片描述

有人知道为什么我的 RDS 服务器正在慢慢泄漏存储吗?


更新:

我从 #mysql 上的好心人那里得到了一些帮助

跑步后

show global variables like 'log_bin';

很明显二进制日志已启用。

然后我跑了

show binary logs并有 41674+ 条日志。

向下滚动我的日志,我可以看到其中一个文件的大小为 2064636

在此处输入图片描述

然后我尝试删除该更改日志文件中的所有二进制日志。

purge binary logs to "mysql-bin-changelog.152193"

但是 RDS 不File_privSuper_priv主用户提供。

我想这就是磁盘空间消失的地方..但是,2064636 只有大约 2Mb...所以回到绘图板?

答案1

您可以在MySQL下通过以下命令检查您的二进制日志保留期限:

mysql> call mysql.rds_show_configuration;

要将保留期设置为 1 天,请使用以下命令:

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

这意味着 MySQL 服务将每天清除二进制日志。

此外,二进制日志,我认为你可以检查一下表 1. innodb_file_per_table,如果分配了“0”,所有数据都将存储到ibdata文件中。

我建议您将选项分配为“1”,这样您的表将被单独存储,并且您可以通过以下方式回收您使用的空间:

mysql> OPTIMIZE TABLE <table_name>

检查下面的参考链接,看看它们是否反映您的问题:
当 innodb_file_per_table 为 ON 时如何回收 InnoDB 中的空间

为什么MySQL中ibdata1文件不断增长?

还有一件事,根据网站的说法,由于您有长时间运行的事务,ibdata1 文件将快速增长。尝试尽快提交它们,以避免执行系统还原来回收空间。

答案2

我认为丢失的可用空间位于 InnoDB 存储引擎的表空间文件中。与 AWS 支持人员沟通后,他们建议我通过设置新实例来重新创建它们,方法是转储所有数据并导入到这个新实例,然后切换。在这种情况下,创建只读副本不起作用,因为只读副本在创建时使用与主实例相同的存储。

在此过程中,我必须手动设置复制。我按照此处的指南进行操作(http://www.ruempler.eu/2014/06/15/external-non-mysql-slaves-with-rds-reloaded/) 并创建了一个脚本来自动执行此过程。您可以在以下位置找到它:

https://github.com/cenk/darbe

相关内容