腳本邏輯流程
- 用
nmap localhost | grep 3306 檢測 3306 埠是否開放。
- 若埠不存在 → 直接啟動
mysqld_safe。
- 若埠存在 → 執行
mysql -u user -p --connect_timeout=5 -e "SHOW DATABASES;" 驗證真實可用性。
- 連線失敗 →
kill -9 所有 MySQL 進程 → 重啟 mysqld_safe。
- 連線成功 → 無操作。
完整腳本
#!/bin/bash
# 依賴 nmap,請先安裝:yum install nmap / apt-get install nmap
MYSQL_USER=xxxxxx
MYSQL_PASS=xxxxxx
MYSQL_BIN=/usr/local/mysql/bin/mysql
MYSQLD_SAFE=/usr/local/mysql/bin/mysqld_safe
# 1. 檢測埠口
/usr/bin/nmap localhost | grep -q 3306
if [ $? -eq 0 ]; then
# 2. 埠口存在,驗證連線
$MYSQL_BIN -u$MYSQL_USER -p$MYSQL_PASS --connect_timeout=5 -e "SHOW DATABASES;" >/dev/null 2>&1
if [ $? -ne 0 ]; then
# 3. 連線失敗,強制殺進程重啟
ps aux | grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9 2>/dev/null
$MYSQLD_SAFE --user=mysql & >/dev/null
fi
else
# 4. 埠口不存在,直接啟動
$MYSQLD_SAFE --user=mysql & >/dev/null
fi
部署建議
- 放入
/usr/local/bin/mysql_monitor.sh,chmod +x。
crontab -e 每分鐘檢查:
* * * * * /usr/local/bin/mysql_monitor.sh
- 日誌導向檔案便於事後分析:
* * * * * /usr/local/bin/mysql_monitor.sh >> /var/log/mysql_monitor.log 2>&1
優化與注意事項
| 問題 | 改進 |
nmap 掃描較慢、權限需求高 | 改用 netstat -tln | grep :3306 或 ss -tln | grep :3306 (無需 root、毫秒級) |
| 密碼明文寫在腳本 | 用 .my.cnf [client] 區段存密碼,腳本不帶 -p 參數 |
kill -9 可能導致 InnoDB 恢復時間變長 | 先嘗試 mysqladmin shutdown,失敗再 kill -TERM,最後才 kill -9 |
| 單機單實例假設 | 多實例需指定 --socket、--port 區分 |
| 無告警通知 | 整合 mail、curl 推送至企業微信/鉚釘/Telegram |
生產級替代方案
- systemd:
Restart=on-failure、RestartSec=5 內建守護。
- MHA / Orchestrator:主從故障自動切換、健康檢查。
- Prometheus + mysqld_exporter + Alertmanager:指標級監控、多維度告警。