MySQL 磁碟滿時行為
- 每分鐘檢查:嘗試寫入當前行,若空間足夠則繼續。
- 每 6 分鐘記錄警告:錯誤日誌寫入
The disk is full 訊息。
- 執行緒阻塞:寫入執行緒進入等待狀態,持有相關表鎖定。
緊急處理三步驟
1. 釋放空間 (首選)
- 刪除舊備份、舊日誌、tmp 檔案:
find /var/lib/mysql -name "*.log" -mtime +7 -delete
- 清理
/tmp:rm -f /tmp/#sql* (MySQL 臨時表)。
- 壓縮/移動大表至其他分區:
ALTER TABLE ... DATA DIRECTORY=... (需支援)。
2. 殺死阻塞執行緒
SHOW PROCESSLIST;
KILL ; -- 針對等待磁碟的寫入執行緒
- 殺死持有鎖定的寫入執行緒可釋放其他等待的讀取執行緒。
- 下次磁碟檢查 (1 分鐘內) 會自動終止該執行緒。
3. 避免雙寫同一資料目錄
- 嚴禁兩個 MySQL 實例指向同一
datadir 且皆開啟寫入,除非檔案系統支援完美鎖定 (如 GFS2/OCFS2)。
- 多實例必須隔離
datadir、socket、port、log 路徑。
預防性架構設計
- 磁碟監控:Prometheus + Node Exporter 監控
disk_free,設定 80%/90% 告警。
- 自動清理:
logrotate 管理錯誤/慢查詢/二進制日誌;expire_logs_days 自動清理 Binlog。
- 分區策略:大表按時間分區,定期歸檔/刪除舊分區釋放空間。
- 備份分離:備份檔案寫入獨立掛載點,不佔用資料磁碟。