全部產品
Search
文件中心

ApsaraDB RDS:MySQL 5.7 information_schema.tables中DATA_FREE值異常

更新時間:Jun 20, 2025

問題現象

在RDS MySQL 5.7版本的執行個體中 ,執行如下SQL語句查詢DATA_FREE值時,發現DATA_FREE的較大值集中在information_schema庫下的部分表,這些表的DATA_FREE值相同且與實際的磁碟片段空間不符。

SELECT TABLE_SCHEMA, TABLE_NAME, DATA_FREE FROM INFORMATION_SCHEMA.TABLES ORDER BY DATA_FREE DESC LIMIT 10; 

查詢結果:

+--------------------+-----------------+-----------+
| TABLE_SCHEMA       | TABLE_NAME      | DATA_FREE |
+--------------------+-----------------+-----------+
| information_schema | COLUMNS         |   8388608 |
| information_schema | EVENTS          |   8388608 |
| information_schema | OPTIMIZER_TRACE |   8388608 |
| information_schema | PARAMETERS      |   8388608 |
| information_schema | PARTITIONS      |   8388608 |
| information_schema | PLUGINS         |   8388608 |
| information_schema | PROCESSLIST     |   8388608 |
| information_schema | ROUTINES        |   8388608 |
| information_schema | TRIGGERS        |   8388608 |
| information_schema | VIEWS           |   8388608 |
+--------------------+-----------------+-----------+

可能原因

MySQL 5.7版本存在缺陷:

information_schema中的部分表(如COLUMNS、EVENTS等)儲存引擎為InnoDB,類型為暫存資料表,其資料表空間均為innodb_temporary(該空間與檔案ibtmp1相對應)。

在使用上述SQL語句查詢這些暫存資料表的磁碟片段空間時,INFORMATION_SCHEMA.TABLES中的DATA_FREE均讀取的是檔案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 | ENGINE | DATA_FREE |
+------------------+-----------+--------+-----------+
| innodb_temporary | ./ibtmp1  | InnoDB |   8388608 |
+------------------+-----------+--------+-----------+

可以看到,問題現象中所述的DATA_FREE異常值和ibtmp1的DATA_FREE相同。

解決方案

儲存引擎為InnoDB的暫存資料表的磁碟片段空間查詢不準確是由MySQL 5.7版本的缺陷導致的,目前暫無解決方案。您可以忽略該問題。如果您不希望遇到此問題,建議升級資料庫版本到MySQL 8.0版本

如果您希望釋放ibtmp1檔案所佔用的磁碟片段空間,可以重啟執行個體,重啟後ibtmp1檔案所佔用的磁碟空間會自動回復至初始值(由innodb_temp_data_file_path參數定義)。