首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL「無法建立/寫入檔案」錯誤排查:tmpdir 設定、權限與磁碟空間三大主因

     編輯:MySQL 資料庫相關知識

錯誤特徵

Can't create/write to file '\sqla3fe_0.ism' (Errcode: 28)

Windows 下典型路徑含反斜線;Linux/Unix 類似 /tmp/#sql_123_0.MAI。

三大根因與解決

1. tmpdir 目錄不存在、空間不足或權限錯誤

  • 修正 my.cnf:
    [mysqld]
    tmpdir = /mnt/mysql_tmp # Linux
    tmpdir = D:/mysql_tmp # Windows
  • 目錄需預先建立,擁有者為 mysql 使用者,權限 1777 (sticky bit)。
  • 磁碟空間:df -h /mnt/mysql_tmp 確認可用空間 > 總資料量 2 倍。

2. 檔案系統 Inode 耗盡

df -i /tmp
# Inode 使用 100% 時雖有磁碟空間也無法建檔
  • 清理大量小檔:find /tmp -type f -mtime +7 -delete
  • 調大 tmpdir 檔案系統 Inode 比例(重新格式化時指定 -i 參數)。

3. SELinux / AppArmor / 防毒軟體攔截

  • Linux:ausearch -m avc -ts recent 檢查拒絕日誌。
  • 臨時關閉驗證:setenforce 0(永久修改 /etc/selinux/config)。
  • Windows:排除 MySQL data/tmp 目錄於防毒掃描。

錯誤代碼速查 (perror)

shell> perror 28
Error code 28: No space left on device

shell> perror 13
Error code 13: Permission denied

shell> perror 24
Error code 24: Too many open files

進階:多 tmpdir 輪詢分散 I/O

[mysqld]
tmpdir = /tmp1:/tmp2:/tmp3  # 冒號分隔,MySQL 輪詢使用
  • 需掛載於不同物理磁碟,有效分散臨時表 I/O 壓力。
  • 適用於大量 ORDER BY/GROUP BY/UNION 產生磁碟臨時表場景。

監控建議

  • Created_tmp_disk_tables / Created_tmp_tables 比率 > 10% → 檢查 tmpdir 效能。
  • Prometheus mysqld_tmpdir_free_bytes 告警閾值 < 5GB。

結語

「無法建立/寫入檔案」本質是暫存空間資源耗盡或存取受限。標準化處置:指定獨立大容量 tmpdir → 設定 sticky bit 權限 → 監控磁碟/Inode 使用率 → 排除安全軟體干擾,即可徹底根治。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved