TMPDIR / TEMP / TMP--tmpdir=/path/to/dir/tmp、/var/tmp、/usr/tmp)MySQL 5.1+ 支持多目錄輪詢:--tmpdir=/path1:/path2:/path3 (Unix冒號分隔,Windows分號)。建議掛載不同物理磁盤 分散 I/O 壓力。
嚴禁將 --tmpdir 指向內存文件系統 (tmpfs/ramfs) 或重啟清空的目錄
LOAD DATA INFILE 產生的臨時文件需在重啟後可用ER_CANT_CREATE_FILEls -la 默認不顯示,**難以發現大臨時文件佔用磁盤空間**ls -la /tmp/.mysql_* 或 lsof -p $(pidof mysqld) | grep -E "tmp|delete"所需空間 ≈ (排序行長度 + 行指針 4-8 字節) × 匹配行數 × 2
# ×2 因為歸並排序需雙緩衝區
sort_buffer_size 內存不足時溢寫磁盤臨時文件#sql__ tmp_table_size / max_heap_table_size 雙閾值控制內存臨時表上限#sql-ib (InnoDB) 或 #sql-.MYD/.MYI (MyISAM)ALGORITHM=INPLACE 避免全表拷貝 (視操作類型)[mysqld]
# 多磁盤分散 I/O (假設 /mnt/ssd1 /mnt/ssd2 為高性能獨立磁盤)
tmpdir=/mnt/ssd1/mysql_tmp:/mnt/ssd2/mysql_tmp
# 內存排序緩衝 (按連接分配,謹慎調大)
sort_buffer_size=4M
read_rnd_buffer_size=4M
# 內存臨時表上限 (取較小者生效)
tmp_table_size=64M
max_heap_table_size=64M
# 監控臨時表落盤比率
# SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';
# Created_tmp_disk_tables / Created_tmp_tables > 10% 需調優
# 1. 找出佔用大臨時文件的進程
lsof -p $(pidof mysqld) | awk '$5 ~ /REG/ && $7 > 100000000 {print $0}'
# 2. 找出被刪除但未釋放空間的文件 (deleted 狀態)
lsof -p $(pidof mysqld) | grep deleted
# 3. 重啟 MySQL 釋放所有隱式臨時文件 (最終手段)