このトピックでは、一時ファイルの過剰によるストレージの枯渇の問題について説明します。 このトピックでは、ストレージを解放し、その後のメンテナンスを実行する方法に関するソリューションも提供します。
問題の内容
クラスター内のテーブルをソート、グループ化、または関連付けるクエリステートメントが実行されると、PolarDB for MySQLクラスター内に一時テーブルファイルが生成される場合があります。 または、キャッシュされたバイナリログファイルは、大きなトランザクションが送信される前に生成されます。 生成されたファイルは、多数のストレージリソースを占有し、クラスタのストレージリソースを使い果たす可能性がある。 この場合、エラーコード [1114]; テーブル '/home/mysql/log/tmp/#sqlxxxxx' がいっぱいです。エラーが報告されます。
ソリューション
[Copy to tmp table]や[Sending data]などのメッセージを含むセッションを終了します。PolarDBコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。 左上隅のリージョンを選択し、リスト内のクラスターのIDをクリックして、[基本情報] ページに移動します。
[基本情報] ページの右上隅にある [データベースにログイン] をクリックします。
管理するデータベースで、次のSQL文を実行してデータベースセッションを表示します。
SHOW PROCESSLIST;返されたクエリ結果の [状態] 列をクリックして、列内のデータを並べ替え、列に「tmpテーブルにコピー」や「送信データ」などの多数のメッセージが含まれているかどうかを確認します。 列に多数のメッセージが含まれている場合は、セッションIDを記録します。
次のSQL文を実行してセッションを終了します。
kill [$ID];上記のステートメントでは、[$ID] は前の手順で説明したセッションIDを示します。
重要セッションを終了する前に、セッションがビジネスに影響しないことを確認してください。
上記の手順を実行してもストレージが解放されない場合は、クラスター内のすべてのノードを再起動して、一時ファイルが占有しているストレージを解放できます。 ノードを再起動する方法の詳細については、「ノードの管理」をご参照ください。
パラメーターを変更します。
PolarDBコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。 左上隅のリージョンを選択し、リスト内のクラスターのIDをクリックして、[基本情報] ページに移動します。
左側のナビゲーションウィンドウで、 を選択します。 一時テーブルスペースのサイズを大きくするには、
tmp_table_sizeおよびmax_heap_table_sizeの値を変更します。
次に何をすべきか
クエリで生成された一時ファイルが大量のストレージを占有しないようにするには、クエリ文を最適化します。 たとえば、クエリ文でOrder ByおよびGroup By句が頻繁に使用されることを回避できます。 EXPLAINをSQL文と一緒に使用して、内部の一時テーブルが使用されているかどうかを確認できます。 例:
EXPLAIN SELECT * FROM alarm GROUP BY created_on ORDER BY default;次の出力が返されます。

Extra列に "Using temporary" メッセージが表示された場合は、内部の一時テーブルが使用されます。
キャッシュされたバイナリログファイルが大量のストレージを占有するのを防ぐために、大規模なトランザクション、特に複数の接続で並列に実行される大規模なトランザクションの数を減らすことができます。 大量の大規模なトランザクションを実行する場合は、短期間の接続を使用することをお勧めします。 これにより、キャッシュされたバイナリログファイルが占有するストレージが削減されます。
クラスターのストレージ使用量を定期的に監視し、ストレージ使用量が80% を超えないように、データを迅速にクリアまたは分割することをお勧めします。