すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:MySQL 5.7を実行するApsaraDB RDSインスタンスのinformation_schemaデータベースのテーブルのDATA_FREEの値が異常な場合はどうすればよいですか?

最終更新日:Jan 22, 2024

問題の説明

MySQL 5.7を実行するApsaraDB RDS for MySQLインスタンスで、次のSQL文を実行してDATA_FREEの値を照会すると、DATA_FREEの大きな値のほとんどが同じになり、information_schemaデータベースの一部のテーブルで検出されます。 ただし、これらの値はディスクフラグメントの実際のサイズと一致しません。

SELECT TABLE_SCHEMA、TABLE_NAME、DATA_FREE FROM INFORMATION_SCHEMA.TABLES ORDER BY DATA_FREE DECA LIMIT 10;

次の結果が返されます。

+ -------------------- + ----------------- + ---------
| TABLE_SCHEMA | TABLE_NAME | DATA_FREE |
+ -------------------- + ----------------- + ---------
| information_schema | コラム | 8388608 |
| information_schema | イベント | 8388608 |
| information_schema | OPTIMIZER_TRACE | 8388608 |
| information_schema | パラメータ | 8388608 |
| information_schema | 8388608 |
| information_schema | プラグイン | 8388608 |
| information_schema | プロセッサリスト | 8388608 |
| information_schema | ルート | 8388608 |
| information_schema | TRIGGERS | 8388608 |
| information_schema | ビュー | 8388608 |
+ -------------------- + ----------------- + --------- + 

原因

MySQL 5.7にバグが存在します。

information_schemaデータベース内の一部のテーブル (COLUMNSやEVENTSなど) は、InnoDBストレージエンジンを使用します。 これらのテーブルは一時テーブルであり、innodb_temporaryテーブルスペースに属します。 tablespaceはibtmp1ファイルに対応します。

上記のSQL文を実行して、一時テーブルによって生成されるディスクフラグメントのサイズを照会すると、システムは、各テーブルによって生成されるディスクフラグメントのサイズではなく、information_schemaデータベースのテーブルのDATA_FREEの値として、ibtmp1ファイルのディスクフラグメントサイズを使用します。 ibtmp1ファイルのディスクフラグメントサイズは、ファイル内のすべてのテーブルによって生成されるディスクフラグメントのサイズをカウントします。

説明

次のSQL文を実行して、ibtmp1ファイルのDATA_FREEの値を照会できます。

SELECT TABLESPACE_NAME、FILE_NAME、ENGINE、DATA_FREE FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME='innodb_temporary';

次の結果が返されます。

+ ------------------ + -----------------------------------
| TABLESPACE_NAME | FILE_NAME | エンジン | DATA_FREE |
+ ------------------ + ----------------------------------- +
| innodb_temporary | 。/ibtmp1 | InnoDB | 8388608 |
+ ------------------ + ------------------------------------ + 

結果は、DATA_FREEの異常値がibtmp1ファイルのDATA_FREEの値と同じであることを示しています。

ソリューション

この問題は、MySQL 5.7のバグが原因です。 この問題は無視できます。 この問題を防ぐために、RDSインスタンスのメジャーエンジンバージョンをMySQL 8.0にアップグレードすることを推奨します。 詳細については、「ApsaraDB RDS For MySQLインスタンスのメジャーエンジンバージョンのアップグレード」をご参照ください。

ibtmp1ファイルのディスクフラグメントが占有しているストレージを解放する場合は、RDSインスタンスを再起動できます。 RDSインスタンスが再起動されると、ibtmp1ファイルが占有するストレージは自動的に元の値に復元されます。 元の値は、innodb_temp_data_file_pathパラメーターで指定します。