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

MySQL 磁碟滿 (No space left on device) 響應機制與緊急處理指南

     編輯:MySQL 資料庫相關知識

MySQL 寫入阻塞時的自動行為

  1. 每分鐘檢查:若釋放出足夠空間,靜默繼續寫入,無錯誤返回。
  2. 每 10 分鐘記錄警告:錯誤日誌寫入 Disk is full writing... 提醒管理員。
  3. 僅影響 MyISAM 表寫入、二進制日誌、中繼日誌;InnoDB 表空間滿會直接報錯回滾。

緊急處理三板斧

1. 釋放空間讓寫入繼續(最快恢復業務)

  • 刪除舊備份、舊日誌、臨時檔案:rm /backup/old_*.sql /var/log/mysql/old_*.log
  • 清理 tmpdir 目錄殘留 #sql* 臨時表檔案。
  • 壓縮/移動大檔案到其他掛載點。

2. Kill 阻塞線程釋放鎖資源

SHOW PROCESSLIST;
KILL ;  -- 針對 "Waiting for disk space" 或持有鎖的長事務

若多線程等待同表鎖,Kill 其中一個可讓其他線程繼續。

3. REPAIR/OPTIMIZE/ALTER 期間磁碟滿的特殊處理

  • 這些操作會建立大臨時檔案,磁碟滿時 MySQL 會自動刪除臨時檔、標記表為崩潰。
  • 例外:ALTER TABLE 採用線上 DDL (MySQL 5.6+),舊表保持不變,臨時檔刪除後原表仍可用。
  • 事後需 REPAIR TABLE 或從備份恢復被標記崩潰的表。

預防與監控

層面措施
作業系統磁碟使用率 > 80% 告警;df -h 定時巡檢
MySQL 配置innodb_max_dirty_pages_pct 控制刷頁積極度;expire_logs_days 自動清理 binlog
架構設計資料目錄、日誌目錄、tmpdir 掛載獨立分區/磁碟,互不干擾
應用層大批次寫入分片、監控 Innodb_buffer_pool_pages_dirty 刷盤追不上時背壓

tmpdir 設定建議

[mysqld]
tmpdir = /mnt/ssd/tmp  # 掛載大容量、高IOPS 磁碟
# 或多目錄分散壓力
tmpdir = /tmp1:/tmp2:/tmp3

目錄必須預先建立、mysql 用戶可寫、空間充足。

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