/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...
矛盾點: 服務狀態顯示運行,但實際無法提供服務,重啟失敗。
df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/simfs 10321208 10315872 0 100% /
根因確認: 根分區 **100% 滿**,Available 0,MySQL 無法寫入臨時文件、日誌、pid 文件導致啟動超時失敗。
cd /
du -sk * | sort -n
# 輸出示例:
# 102400 tmp
# 512000 var
# ...
發現 /tmp 目錄佔用大量空間,內含大量臨時文件。
# 清理 tmp 目錄 (確認無進程使用後)
rm -rf /tmp/*
# 或更安全:只刪除超過 7 天的文件
find /tmp -type f -mtime +7 -delete
df -h / # 確認有可用空間
/etc/init.d/mysql restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
/var/run/mysqld/ 或 /tmp/ 建立 mysqld.pid,空間滿無法創建log-error 指向的文件無法擴展ibdata1 需自動擴展時失敗| 措施 | 實施方式 |
|---|---|
| 磁盤告警 | 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%) |
| 現象 | 可能原因 | 排查命令 |
|---|---|---|
| Port 已佔用 | 舊進程未死、其他進程佔 3306 | netstat -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 測試 |