MySQL 報錯 Can't create/write to file xxx (Errcode: 13) 通常發生在需要建立臨時檔案的操作中(ORDER BY、GROUP BY、UNION、大結果集排序等)。本文分析三大根因並提供對應解決方案。
TMPDIR/TEMP/TMP 決定,系統預設通常為 /tmp、/var/tmp、C:\Windows\Temp。mysqld 結束時自動清理。| 原因 | 現象 | 排查指令 |
|---|---|---|
| 目錄權限不足 | MySQL 進程用戶無寫入權限 | ls -ld /tmp、ps aux | grep mysql 確認用戶 |
| 磁碟空間/Inode 耗盡 | df -h 顯示 100% 或 df -i Inode 滿 | df -h /tmp、df -i /tmp |
| 第三方軟體攔截 | 防毒軟體、EDR、備份軟體鎖定/掃描臨時檔 | 查看防毒日誌、暫時停用測試 |
編輯 my.cnf / my.ini 的 [mysqld] 區段:
[mysqld]
tmpdir = /data/mysql_tmp # Linux
tmpdir = D:/mysql_tmp # Windows
確保目錄存在、權限正確(chown mysql:mysql /data/mysql_tmp; chmod 1777 /data/mysql_tmp),重啟 MySQL 生效。
# 清理舊檔(謹慎執行)
find /tmp -type f -mtime +1 -name 'mysql*' -delete
# 或手動清理大檔
ls -lh /tmp | head -20
tmpdir 目錄至信任區/排除掃描。ExcludePath。若因臨時檔案錯誤導致表損壞:
# myisamchk(需停機)
service mysql stop
myisamchk -r /var/lib/mysql/dbname/*.MYI
service mysql start
# mysqlcheck(線上熱修復,僅 MyISAM)
mysqlcheck -r -u root -p dbname
# phpMyAdmin:選擇表 → 底部「修復表」
⚠️ 避免使用 -f 強制修復,可能刪除損壞資料列。
tmpdir,避免與系統盤爭搶空間。tmpdir 磁碟使用率(>80% 告警)。ORDER BY/GROUP BY、增加 LIMIT、使用覆蓋索引減少臨時表大小。SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables',磁碟臨時表過多需優化 SQL 或調大 tmp_table_size/max_heap_table_size。臨時檔案錯誤看似簡單,實則反映資源規劃與安全策略的缺口,系統性解決才能一勞永逸。