執行 ALTER TABLE ... ADD INDEX 等 DDL 期間若 MySQL Crash/重啟,會在資料目錄殘留 #sql-XXXX_XXXX.ibd 和 #sql-XXXX_XXXX.frm 臨時表檔案,佔用大量空間且無法直接 rm 刪除 (資料字典仍記錄)。
# 1. 確認檔案名 (例:#sql-928_76f7)
ls -la /var/lib/mysql/db_name/#sql-*
# 2. 使用特殊前綴 `#mysql50##` 忽略檔案名安全編碼 (MySQL 5.1+ 引入)
mysql> DROP TABLE `#mysql50##sql-928_76f7`;
Query OK, 0 rows affected (16.28 sec)
# 3. 空間即時釋放,驗證
df -h /var/lib/mysql
mysql> CREATE DATABASE tmp_repair;
mysql> CREATE TABLE tmp_repair.tmp LIKE db_name.target_table; -- 僅複製結構與索引
# Shell 執行
cp /var/lib/mysql/tmp_repair/tmp.frm /var/lib/mysql/db_name/#sql-928_76f7.frm
mysql> DROP TABLE `#mysql50##sql-928_76f7`;
mysql> DROP DATABASE tmp_repair;
#mysql50## 前綴告訴 InnoDB 忽略檔案名編碼,直接按字面匹配資料字典條目。#sql-{thread_id}_{random}。rm 會導致 InnoDB 資料字典孤兒條目,重啟報錯 Table ... doesn't exist in InnoDB internal data dictionary。pt-online-schema-change (Percona Toolkit) 線上變更,避免長時間鎖表與 Crash 風險。#sql-* 檔案,發現立即處理。CHECK TABLE 檢測孤兒表。MySQL 官方手冊:InnoDB Data Dictionary Troubleshooting