service mysql start # ERROR! MySQL server PID file could not be found! mysql -uroot -p # ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
MySQL 進程卡死(僵屍進程)導致 PID 文件異常,新進程無法寫入 PID 文件啟動失敗。
ps aux | grep mysqld # 輸出示例: # mysql 27664 0.0 0.5 123456 7890 ? S 10:00 0:00 /usr/sbin/mysqld # mysql 28873 0.0 0.5 123456 7890 ? S 10:05 0:00 /usr/sbin/mysqld # mysql 30041 0.0 0.5 123456 7890 ? S 10:10 0:00 /usr/sbin/mysqld
# 逐個 kill(推薦,避免誤傷) kill 27664 kill 28873 kill 30041 # 或一次性殺掉所有 mysqld(謹慎使用) # pkill -9 mysqld
service mysql start # Starting MySQL... [OK] service mysql status # mysqld (pid 31234) is running...
| 常見原因 | 排查命令 | 預防措施 |
|---|---|---|
| 長時間查詢阻塞 | SHOW FULL PROCESSLIST; | 設置 max_execution_time、優化慢查詢 |
| 鎖等待/死鎖 | SHOW ENGINE INNODB STATUS\G | 合理索引、固定加鎖順序、縮短事務 |
| 磁盤空間耗盡 | df -h | 監控告警、定期清理 Binlog/慢查詢日誌 |
| 內存不足 OOM Killer | dmesg | grep -i kill | 配置 Swap、調整 innodb_buffer_pool_size |
| 配置文件語法錯誤 | mysqld --help --verbose | head -20 | 變更後 mysqld --validate-config 驗證 |
#!/bin/bash
# /usr/local/bin/mysql_health_check.sh
# 每 5 分鐘 cron 執行一次
PID_FILE="/var/run/mysqld/mysqld.pid"
SOCKET_FILE="/var/lib/mysql/mysql.sock"
if [ ! -f "$PID_FILE" ] || [ ! -S "$SOCKET_FILE" ]; then
echo "[$(date)] MySQL 異常,嘗試重啟..." | tee -a /var/log/mysql_health.log
pkill -9 mysqld
sleep 2
systemctl start mysqld
sleep 3
if systemctl is-active --quiet mysqld; then
echo "[$(date)] 重啟成功" | tee -a /var/log/mysql_health.log
else
echo "[$(date)] 重啟失敗,需人工介入" | tee -a /var/log/mysql_health.log
# 發送告警通知
fi
fi
systemctl 而非 service(CentOS 7+)Restart=on-failure 在 systemd 單元文件中PIDFile=/var/run/mysqld/mysqld.pid 確保路徑一致logrotate