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

磁盤空間不足導致 MySQL 啟動失敗:排查與解決全記錄

     編輯:MySQL 資料庫相關知識

故障現象

/etc/init.d/mysql restart
Stopping MySQL: [FAILED]
Timeout error occurred trying to start MySQL Daemon.
Starting MySQL: [FAILED]

# 檢查進程卻顯示運行中
service mysqld status
mysqld (pid 21847) is running...

矛盾點: 服務狀態顯示運行,但實際無法提供服務,重啟失敗。

根因排查過程

  1. 檢查磁盤空間:
    df -k
    Filesystem     1K-blocks      Used Available Use% Mounted on
    /dev/simfs     10321208   10315872         0 100% /
    

    根因確認: 根分區 **100% 滿**,Available 0,MySQL 無法寫入臨時文件、日誌、pid 文件導致啟動超時失敗。

  2. 定位大文件/目錄:
    cd /
    du -sk * | sort -n
    # 輸出示例:
    # 102400  tmp
    # 512000  var
    # ...
    

    發現 /tmp 目錄佔用大量空間,內含大量臨時文件。

  3. 清理釋放空間:
    # 清理 tmp 目錄 (確認無進程使用後)
    rm -rf /tmp/*
    
    # 或更安全:只刪除超過 7 天的文件
    find /tmp -type f -mtime +7 -delete
    
  4. 驗證修復:
    df -h /  # 確認有可用空間
    /etc/init.d/mysql restart
    Stopping MySQL: [  OK  ]
    Starting MySQL: [  OK  ]
    

深度分析:為什麼磁盤滿會導致此現象?

  1. pid 文件無法寫入: MySQL 啟動需在 /var/run/mysqld/ 或 /tmp/ 建立 mysqld.pid,空間滿無法創建
  2. 錯誤日誌無法寫入: log-error 指向的文件無法擴展
  3. InnoDB 系統表空間無法擴展: ibdata1 需自動擴展時失敗
  4. 臨時表無法創建: 複雜查詢需磁盤臨時表,空間不足報錯
  5. Binlog/Relay log 無法寫入: 同步中斷、甚至損壞

預防與最佳實踐

措施實施方式
磁盤告警Zabbix/Prometheus 監控 disk.used.percent > 80% 告警
定期清理策略crontab 定時 find /tmp -mtime +7 -delete、journalctl --vacuum-time=30d
分離關鍵目錄將 datadir、log_bin、tmpdir 掛載到獨立分區/磁盤
設置 innodb_max_dirty_pages_pct控制髒頁刷盤頻率,避免突發大量寫入佔滿磁盤
啟用 log_rotate配置 logrotate 定期切割 MySQL 錯誤日誌、慢查詢日誌、Binlog (配合 expire_logs_days)
保留緩衝空間文件系統預留 5-10% 空間給 root 用戶 (ext4 默認 5%)

擴展:其他常見啟動失敗原因速查

總結

**「磁盤空間不足」是 MySQL 啟動/運行故障的隱形殺手**。表面現象可能誤導 (如進程顯示運行),**df -h 應是故障排查的第一步**。建立完善的磁盤監控與清理機制,比事後搶修更經濟高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象可能原因排查命令
Port 已佔用舊進程未死、其他進程佔 3306netstat -tlnp | grep 3306, lsof -i:3306
權限問題datadir 屬主非 mysql、socket 目錄無權限ls -ld /var/lib/mysql, chown -R mysql:mysql /var/lib/mysql
配置錯誤my.cnf 語法錯、路徑錯、參數不兼容mysqld --help --verbose 2>&1 | head -20, 查看錯誤日誌
數據損壞InnoDB 校驗和失敗、MyISAM 表損壞查看 error.log,嘗試 innodb_force_recovery=1..6
SELinux/AppArmor安全模塊阻止訪問ausearch -m avc -c mysqld, 臨時 setenforce 0 測試