不久前,运行我的实例的服务器有 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_priv
向Super_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 中的空间
还有一件事,根据网站的说法,由于您有长时间运行的事务,ibdata1 文件将快速增长。尝试尽快提交它们,以避免执行系统还原来回收空间。
答案2
我认为丢失的可用空间位于 InnoDB 存储引擎的表空间文件中。与 AWS 支持人员沟通后,他们建议我通过设置新实例来重新创建它们,方法是转储所有数据并导入到这个新实例,然后切换。在这种情况下,创建只读副本不起作用,因为只读副本在创建时使用与主实例相同的存储。
在此过程中,我必须手动设置复制。我按照此处的指南进行操作(http://www.ruempler.eu/2014/06/15/external-non-mysql-slaves-with-rds-reloaded/) 并创建了一个脚本来自动执行此过程。您可以在以下位置找到它: