MySQL 遇到磁碟滿(No space left on device)或配額超限時的內部處理邏輯,針對 MyISAM 表、二進制日誌、索引建立臨時檔案的不同行為。
磁碟滿時的標準行為(MyISAM 寫入)
- 每分鐘檢查一次 是否有足夠空間寫入當前列
- 有空間 → 繼續寫入,如無事發生
- 無空間 → **等待**,每 10 分鐘在錯誤日誌寫入一筆提醒
應對操作
| 目標 | 操作 | 生效時間 |
| 繼續寫入 | 釋放磁碟空間(刪檔、擴容、清理日誌) | 下次檢查時(1分鐘內)
| 放棄當前執行緒 | mysqladmin kill thread_id | 下次檢查時
| 解除其他執行緒阻塞 | Kill 等待該表的執行緒,讓其他執行緒繼續 | 立即
特例操作:REPAIR / OPTIMIZE / ALTER TABLE / LOAD DATA
這些操作會建立**大型臨時檔案**,若磁碟滿會導致系統級問題。
- MySQL 會**自動刪除臨時檔案**
- 將表標記為 **Crashed(損壞)**
- ⚠️
ALTER TABLE 例外:舊表保持不變,不標記損壞
二進制日誌與索引檔案
同樣遵循上述機制:寫入時檢查空間,滿則等待、記錄日誌。
實務建議
- ✅ 設定磁碟使用率告警(如 80% 觸發)
- ✅ 定期
PURGE BINARY LOGS、清理錯誤日誌、慢查詢日誌
- ✅ 大表
OPTIMIZE/REPAIR 時預留 2-3 倍表大小的臨時空間
- ✅ 使用
innodb_file_per_table 便於單表空間管理
- ✅ 考慮將
tmpdir 指向獨立磁碟/分區
相關配置參數
[mysqld]
tmpdir = /mnt/tmp_mysql # 臨時檔案目錄
max_binlog_size = 100M # 控制單一 binlog 大小
expire_logs_days = 7 # 自動清理舊 binlog
- 上一篇文章: MySQL 建立外鍵完整語法:主表/子表定義、命名約束、引擎限制
- 下一篇文章: phpMyAdmin 安裝與設定完整教學:下載、config.inc.php、認證模式、中文介面
Copyright ©
程式碼之家 All Rights Reserved