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

MySQL報錯「Can't create/write to file #sql_xxx.MYD」完整排查與解決方案

     編輯:MySQL 資料庫相關知識

報錯Can't create/write to file 'C:/WINDOWS/TEMP/#sql_5c0_0.MYD' (Errcode: 17),本質是臨時文件創建失敗。常見於大查詢、排序、臨時表操作。本文提供四層遞進解決方案:權限、磁碟空間、殺毒軟件干擾、MySQL配置變更。

錯誤本質分析

  • MySQL需在臨時目錄創建#sql_*.MYD/.MYI文件執行排序/分組/臨時表
  • 預設臨時目錄:WindowsC:\WINDOWS\TEMP、Linux/tmp
  • Errcode 17 = EEXIST(文件已存在)或權限/空間不足

四層解決方案(按推薦順序)

層級一:基礎環境檢查(必做)

  1. 權限:臨時目錄授予MySQL服務賬號(或Users/Everyone)讀寫權限
  2. 空間:清理臨時目錄(del /q C:\WINDOWS\TEMP\*),確保磁碟剩餘>20%
  3. 殘留文件:刪除舊#sql_*.MYD/.MYI文件

層級二:McAfee等殺毒軟件干擾(高發)

McAfee「訪問掃描」在文件寫入時掃描,導致MySQL創建臨時文件超時/失敗。

  1. 打開 McAfee VirusScan Console → 「按訪問掃描程序」 → 屬性 → 所有進程 → 檢測項
  2. 關鍵設置:取消勾選「掃描文件(在寫入磁盤時)」
  3. 或添加排除路徑:D:\mysql\temp\(讀取時/寫入時均排除)

層級三:修改MySQL臨時目錄(根治,強烈推薦)

[mysqld]
tmpdir = "D:/mysql/temp/"
  1. 創建目錄D:\mysql\temp\,授予MySQL服務賬號完全控制權限
  2. 修改my.ini,[mysqld]段添加上述行
  3. 重啟MySQL服務生效
  4. McAfee排除該目錄(比排除系統TEMP更安全)

優勢:隔離業務臨時文件與系統臨時文件,避開殺毒掃描熱點,便於磁碟配額管理。

層級四:服務賬號權限

  • MySQL服務預設用Local System(系統權限),通常足夠
  • 若改為自定義賬號,確保該賬號有臨時目錄完全控制權限

Linux 環境對應操作

# 修改 my.cnf
[mysqld]
tmpdir = /data/mysql/tmp

# 創建目錄並授權
mkdir -p /data/mysql/tmp
chown mysql:mysql /data/mysql/tmp
chmod 750 /data/mysql/tmp

# systemd 服務若啟用 PrivateTmp=true,需關閉或掛載共享 tmp
# 編輯 /usr/lib/systemd/system/mysqld.service
# PrivateTmp=false
systemctl daemon-reload && systemctl restart mysqld

驗證生效

SHOW VARIABLES LIKE 'tmpdir';
-- 執行大查詢觀察 tmpdir 下是否生成 #sql_* 文件

遵循「環境檢查→殺毒排除→隔離目錄→權限保障」四步走,徹底根治MySQL臨時文件創建失敗。

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