問題の説明
RDSインスタンスを使用すると、次のエラーメッセージが表示されます。 エラーメッセージでは、[$Tab_Name] は一時テーブルの名前を示します。
the table '/home/mysql/xxxx/xxxx/#[$Tab_Name]' is full原因
内部の一時テーブルは、GROUP BY、ORDER BY、DISTINCT、UNION、複数のテーブルの更新、サブクエリ、およびテーブル結合の操作を実行するときに使用できます。 これは、group_concat関数とcount(distinct) 関数を呼び出す場合にも当てはまります。 MySQLは、メモリにMEMORYストレージエンジン用の一時テーブルを作成します。 一時テーブルのサイズが大きすぎる場合、一時テーブルは自動的にディスク上のMyISAMストレージエンジン用の一時テーブルに変換されます。 クエリにBLOBまたはTEXTタイプのフィールドが含まれている場合、MySQLはディスク上の一時テーブルを使用します。 このエラーメッセージは、ディスク上の一時テーブルの物理サイズが制限されており、増やすことができないことを示しています。 このエラーメッセージは、クエリステートメントで使用する内部一時表のサイズがloose_rds_max_tmp_disk_spaceで指定された上限に達した場合に表示されます。 loose_rds_max_tmp_disk_spaceのデフォルト値は10 GBです。 内部一时テーブルは、MyISAMストレージエンジンのディスクに保存されます。
解決策
説明
- インスタンスの設定やデータの変更などのリスクの高い操作を実行する前に、インスタンスのディザスタリカバリ機能とフォールトトレランス機能を確認して、データのセキュリティを確保することを推奨します。
- ECS (Elastic Compute Service) インスタンスやApsaraDB RDSインスタンスなどのインスタンスの設定またはデータを変更する前に、インスタンスのスナップショットを作成するか、バックアップを有効にすることを推奨します。 たとえば、ApsaraDB RDSインスタンスのログバックアップを有効にできます。
- Alibaba Cloud管理コンソールで機密情報または送信された機密情報に対する権限を付与した場合は、できるだけ早い機会に機密情報を変更することを推奨します。 機密情報には、ユーザー名とパスワードが含まれます。
ビジネス要件に基づいて次の方法を使用します。
- ApsaraDB RDSコンソールにログインし、RDSインスタンスの [パラメーター] ページに移動し、RDSインスタンスの残りのストレージとアプリケーションのストレージ使用量に基づいて、loose_rds_max_tmp_disk_spaceの値を増やします。 このパラメーターは、MySQL 5.5とMySQL 5.6でサポートされています。 このパラメーターは、RDSインスタンスの残りのストレージよりも小さい値に設定することを推奨します。 このように、ストレージはバイナリログファイルとデータファイルを保存するために予約されます。 これにより、RDSインスタンスのロックが防止され、サービスの安定性が確保されます。 説明
- loose_rds_max_tmp_disk_spaceはバイト単位で測定されます。 デフォルト値は10737418240バイトで、10 GBに相当します。 最大値は107374182400バイトで、これは100 GBに相当します。
- RDSインスタンスの [モニタリングとアラート] ページに移動して、インスタンスの使用可能なストレージを表示できます。 詳細については、「モニタリング情報の表示」をご参照ください。
- loose_rds_max_tmp_disk_spaceを変更しても、インスタンスの再起動はトリガーされません。
- ディスク上の一時テーブルを同時に使用するセッションの数を減らします。 ディスク上の一時テーブルの合計サイズを指定します。 一時テーブルのサイズがこのパラメーターで指定された上限を超えないように、一時テーブルを同時に使用するセッションの数を減らすことができます。
- ApsaraDB RDSコンソールにログインし、RDSインスタンスの [パラメーター] ページに移動し、tmp_table_sizeの値を増やして、メモリ内の一時テーブルのサイズの上限を増やします。 説明 tmp_table_sizeはバイト単位です。 デフォルト値は2097152バイトで、2 MBに相当します。 最大値は67108864バイトで、64 MBに相当します。
- クエリ中にBLOB型とTEXT型のフィールドを使用しないことをお勧めします。
- クエリロジックを最適化して、過度の中間データセット操作を回避します。
参考資料
次のセクションでは、クエリが内部一時テーブルを使用するかどうかを確認する方法について説明します。
EXPLAINステートメントを実行して、実行計画を表示します。 出力の [Extra] フィールドに [Using temporary] が表示されている場合は、内部の一時テーブルが使用されます。 
説明select * fromアラームグループby created_on order by detail; 