萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 磁盤空間不足應對機制與緊急處理指南

MySQL 磁盤滿時的內部行為

當磁盤剩餘空間不足寫入當前行時,MySQL (MyISAM/InnoDB redo log/binlog) 採取「等待-重試-記錄」策略:

  1. 每 60 秒檢查一次可用空間
  2. 每 10 分鐘在錯誤日誌寫入一條警告
  3. 空間釋放後自動恢復寫入,無需重啟

緊急釋放空間操作手冊

方案一:清理無用檔案 (最快見效)

# 1. 確認佔用大戶
du -h /var/lib/mysql | sort -hr | head -20

# 2. 安全清理項目
# 歸檔/刪除舊 Binlog (保留近 7 天)
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

# 清理慢查詢/一般日誌
TRUNCATE TABLE mysql.slow_log; -- 若用 TABLE 存儲
# 或刪除檔案並 FLUSH LOGS

# 刪除臨時表殘留 (#sql-*.ibd)
# 重啟 MySQL 自動清理,或手動 DROP

# 壓縮歷史分區表 (InnoDB)
ALTER TABLE big_table COMPRESS=ON; -- 需 5.7+ 與 Barracuda 格式

方案二:殺掉佔用空間的長事務

-- 查找長事務
SELECT * FROM information_schema.INNODB_TRX
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 600;

-- Kill 阻塞源頭
KILL thread_id;

方案三:遷移/擴容 (根治)

  • 掛載新磁碟掛載至 datadir 或獨立表空間目錄
  • LVM 在線擴容 / 雲盤擴容
  • 啟用 innodb_file_per_table 便於單表遷移

特殊場景:REPAIR/OPTIMIZE/ALTER TABLE 期間磁盤滿

這些操作會建立大臨時檔案 (#sql-*.ibd)。磁盤滿時 MySQL 會:

  • 刪除臨時檔案
  • 標記表為 崩潰 (CRASHED)
  • 例外:ALTER TABLE 採用拷貝算法時,舊表保持完整

恢復:REPAIR TABLE tbl_name 或 myisamchk -r (MyISAM);InnoDB 重啟自動崩潰恢復。

預防性監控體系

# Prometheus + node_exporter 告警規則
- alert: DiskSpaceCritical
  expr: (node_filesystem_avail_bytes{mountpoint="/var/lib/mysql"} / node_filesystem_size_bytes{mountpoint="/var/lib/mysql"}) < 0.15
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "MySQL 數據目錄磁盤剩餘 < 15%"

# 定時任務巡檢腳本
#!/bin/bash
usage=$(df -h /var/lib/mysql | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $usage -gt 80 ]; then
  echo "磁盤使用率 $usage%" | mail -s "MySQL 磁盤預警" dba@company.com
fi

總結

磁盤滿是可預防的嚴重故障。核心策略:監控預警 → 定期清理 Binlog/日誌 → 獨立表空間便於遷移 → LVM/雲盤彈性擴容。緊急時刻,PURGE BINARY LOGS 和 Kill 長事務是最快止血手段。

copyright © 萬盛學電腦網 all rights reserved