問題現象
在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參數定義)。