phpMyAdmin 中多張 MyISAM 表狀態顯示 「使用中」,點擊「修復表」報錯 can't create new temp file,「分析表」「優化表」同樣失敗。嘗試 myisamchk -r -f 強制修復亦無效。
MyISAM 修復/優化/分析操作均需在數據目錄下創建臨時文件 (*.TMD、*.TMP),磁碟剩餘空間為 0 時無法創建,導致所有維護操作失敗。表標記為「使用中」實為上次操作中斷留下的鎖狀態,非實際損壞。
net stop mysql (Windows) / systemctl stop mysqld (Linux)。datadir 至安全位置,防誤操作。.MYD 同級目錄下,若發現 *.TMD 文件,重命名為 *.MYD 覆蓋原文件 (或刪除原 .MYD 後改名)。bin 目錄執行:
myisamchk -r /path/to/datadir/db_name/*.MYI
net start mysql / systemctl start mysqld。mysqlcheck -o -r db_name -u root -p輸入密碼後執行,應無錯誤輸出。
/tmp、/var/tmp、Windows %TEMP%。find /backup -mtime +7 -delete,truncate -s 0 /var/log/mysql/*.log (需 FLUSH LOGS)。docker system prune -a。datadir (LVM 在線擴容/掛載新分區)。disk_free,閾值 < 15% 報警。cron 定期清理臨時文件、舊備份、Binlog (配合 expire_logs_days / binlog_expire_logs_seconds)。tune2fs -m 5 /dev/vg/lv),防寫滿導致 root 也無法登入清理。| 誤區 | 真相 |
|---|---|
| 以為表損壞需重建 | 多數是空間不足導致臨時文件創建失敗,空間恢復後自動正常 |
用 REPAIR TABLE 線上修復 | MyISAM 線上修復同樣需臨時文件,空間不足時必失敗 |
忽略 .TMD 文件 | 它是修復中斷留下的中間文件,直接改名可救數據 |
遇到「使用中」+「修復失敗」+「can't create new temp file」,第一時間查磁碟空間 (df -h),九成九是滿了。