しばらく前、私のインスタンスを実行しているサーバーには20GBのEBSストレージがありました。その後、ディスクストレージエラーが発生し始めたので、40 GBに増やしました。次に、ストレージ不足エラーが発生したため、再び60GBに増やしました。 (つまり、これは60GB RDSインスタンスです)
Free Storage Space(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以上のログがありました。
ログを下にスクロールすると、ファイルサイズの1つが2064636であることがわかりました
次に、そのchangelogファイルまでのすべてのバイナリログを削除しようとしました。
purge binary logs to "mysql-bin-changelog.152193"
ただし、RDSはFile_priv
またはSuper_priv
をマスターユーザーに送信します。
これがディスク領域がなくなったところだと思いたいのですが、2064636は約2Mbしかありません。
MySQLで次のコマンドを実行すると、バイナリログの保持期間を確認できます。
mysql> call mysql.rds_show_configuration;
保存期間を1日に設定するには、次のコマンドを使用します。
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
つまり、MySQL servceは毎日バイナリログを削除します。
その上、バイナリログ、innodb_file_per_tableの設定を確認できると思います。「0」が割り当てられている場合、すべてのデータはibdataファイルに保存されます。
オプションを「1」に割り当てて、テーブルが個別に保存され、使用済みスペースを再利用できるようにすることをお勧めします。
mysql> OPTIMIZE TABLE <table_name>
以下の参照リンクをチェックして、問題が反映されているかどうかを確認してください。
innodb_file_per_tableがONのときにInnoDBでスペースを再利用する方法
MySQLでibdata1ファイルが増え続けるのはなぜですか?
もう1つ、Webサイトによると、トランザクションの実行時間が長いため、ibdata1ファイルが急成長します。できるだけ早くコミットして、システムの復元を実行してスペースを取り戻さないようにしてください。
失われた空き領域はInnoDBストレージエンジンのテーブルスペースファイルにあると思います。 AWSサポートと話し合った後、すべてのデータをダンプして新しいインスタンスをセットアップし、この新しいインスタンスにインポートすることで新しいインスタンスをセットアップしてから切り替えることを提案しました。この場合、リードレプリカの作成は機能しません。リードレプリカの作成時に、マスターインスタンスと同じストレージが使用されるためです。
このプロセスでは、レプリケーションを手動でセットアップする必要がありました。私はここのガイド( http://www.ruempler.eu/2014/06/15/external-non-mysql-slaves-with-rds-reloaded/ )に従い、自動化するスクリプトを作成しましたこのプロセス。あなたはそれを見つけることができます: