問題の説明
原因
大量の一時ファイルがRDSインスタンスに書き込まれるか、大規模トランザクションの大量のバイナリログファイルがRDSインスタンスにキャッシュされてから、大規模トランザクションがコミットされます。 その結果、RDSインスタンスのストレージ容量が使い果たされます。 (データの並べ替え、データのグループ化、テーブルの関連付けを必要とするSQL文を実行すると、一時ファイルが生成されます。) この場合、ApsaraDB RDS for MySQLはRDSインスタンスを自動的にロックしてデータの損失を防ぎ、RDSインスタンスにデータを書き込むことはできません。
解決策
緊急時には、RDSインスタンスのストレージ容量を拡張することを推奨します。 RDSインスタンスのストレージ容量を拡張する場合は、システムがインスタンスのロックを解除するまで約5分間待ちます。 RDSインスタンスの設定をアップグレードする方法の詳細については、「ApsaraDB RDS For MySQLインスタンスの仕様の変更」をご参照ください。
RDSインスタンスのストレージ容量を拡張できない場合は、RDSインスタンスのメジャーエンジンバージョンに基づいて問題を解決します。
- RDSインスタンスがMySQL 5.7以前に実行されている場合は、RDSインスタンスを再起動します。 詳細は、「よくある質問」をご参照ください。
- RDSインスタンスがMySQL 8.0を実行してロックされている場合、すべてのセッションは終了し、セッションのトランザクションは自動的にロールバックされます。 トランザクションをロールバックするのに必要な期間は、トランザクション内のセッションによって実行されるクエリによって異なります。 すべてのトランザクションがロールバックされると、RDSインスタンスのストレージがリリースされます。 RDSインスタンスがまだロックされている場合は、次の操作を実行します。
- データ管理 (DMS) を使用してRDSインスタンスに接続します。
- 次のステートメントを実行して、RDSインスタンスのセッションを表示します。
show processlist
- 出力で、セッションをStateでソートし、State列に「tmpテーブルにコピー」や「データの送信」などのメッセージが大量に表示されているかどうかを確認します。 多数のメッセージが表示される場合は, メッセージが返されるセッションのIDを記録します。
- 次のSQL文を実行してセッションを終了します。
kill [$ID];
説明 [$ID] は、前のステップで取得したIDを示します。 セッションを終了する前に、サービスに影響がないことを確認してください。
次のステップ
RDSインスタンスがロック解除されている場合は、次の操作を実行して、RDSインスタンスが再度ロックされないようにします。
- RDSインスタンスの自動ストレージ拡張を設定します。 RDSインスタンスのストレージ使用量がしきい値に達すると、システムは自動的にRDSインスタンスのストレージ容量を拡張します。 詳細については、「ApsaraDB RDS For MySQLインスタンスの自動ストレージ拡張の設定」をご参照ください。
- 一時ファイルが過剰なストレージを占有しないようにするには、SQL文を最適化して、ORDER BY句とGROUP BY句が頻繁に使用されないようにします。 ビジネス要件に基づいてtmp_table_sizeとmax_heap_table_sizeの値を増やすこともできますが、推奨されません。 メモリストレージは、ディスクストレージよりも重要です。 EXPLAINをSQL文と一緒に使用して、内部の一時テーブルが使用されているかどうかを確認できます。 たとえば、Extraフィールドに一時的に使用するメッセージが存在するかどうかを確認できます。 はいの場合、内部一時テーブルが使用されます。
explain select * from alarm group by created_on order by default;
次のシステム出力は一例です。 - キャッシュされたバイナリログファイルが過剰な量のストレージを占有するのを防ぐために、大規模なトランザクション、特に複数の接続で並列に実行されるトランザクションの数を減らすことができます。 大量の大規模トランザクションを実行する場合は、ビジネス要件に基づいてbinlog_cache_sizeの値を増やすことができます。 ただし、ディスクストレージを節約するためにbinlog_cache_sizeの値を大きくしないことをお勧めします。 短期間の接続を使用して大規模なトランザクションを実行し、一時ファイルによって占有されるストレージを減らすことができます。
- ディスクの使用状況を監視するか、不要なデータをできるだけ早く削除するか、データ分割を実行することを推奨します。 これにより、ディスク使用量が80% を超えないようにします。
関連ドキュメント
一時ファイルを削除してもRDSインスタンスがロック状態になっている場合は、他の種類のファイルを削除してディスク使用量を減らすことができます。 詳細については、以下のトピックを参照してください。
よくある質問
RDSインスタンスの [基本情報] ページで [インスタンスの再起動] ボタンが暗くなっている場合はどうすればよいですか。
ApsaraDB RDSコンソールにログインし、[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 RDSインスタンスを見つけ、インスタンスIDをクリックします。
- 左側のナビゲーションウィンドウで、[パラメーター] をクリックします。
- [編集可能なパラメーター] タブで、[強制再起動] 列に [はい] が表示されているパラメーターを見つけ、パラメーターの値を変更します。