MySQL 服務的高可用性是生產環境運維的核心指標之一。本文系統整理 Windows 與 Linux 平台下,透過批次檔、Shell 腳本實現 MySQL 進程監控、服務狀態檢測與自動重啟的多種實戰方案,助您構建自我修復的資料庫監控體系。
透過 tasklist 配合 find 計算 mysqld.exe 進程數量,若為 0 則觸發 net start mysql 並記錄日誌:
@echo off
for /f "usebackq" %%i in (`tasklist ^| find /c "mysqld.exe"`) do (
set chkstat=%%i
)
if %chkstat% == 0 (
net start mysql
echo ================ >> %date:~0,10%.log
echo %date% %time% check mysql service stop >> %date:~0,10%.log
echo restart mysql service! >> %date:~0,10%.log
echo ================ >> %date:~0,10%.log
)
優點:不依賴服務名稱,直接檢測進程存活,適用於非標準服務名稱安裝場景。
利用 sc query 讀取服務狀態,根據 RUNNING / STOPPED 動態決定啟停邏輯:
@echo off
for /f "skip=3 tokens=4" %%i in ('sc query mysql') do set "zt=%%i" & goto :next
:next
if /i "%zt%"=="RUNNING" (
echo 服務正在運行,執行關閉測試
net stop mysql
) else (
echo 服務已停止,嘗試啟動
net start mysql
)
exit /b
適用場景:需精確控制服務狀態切換、或整合至更複雜的批次作業流程中。
透過 mysqladmin ping 驗證服務回應,異常時發送郵件告警並重啟服務,適合加入 crontab 定時執行:
#!/bin/bash
result=`/usr/bin/mysqladmin ping`
expected='mysqld is alive'
if [[ "$result" != "$expected" ]]; then
echo "MySQL 偵測異常,嘗試重啟服務"
SUBJECT="[MYSQL ALERT] Service restart attempted"
EMAIL="dba@example.com"
EMAILMESSAGE="/tmp/mysql_alert.txt"
echo "$result was received" > $EMAILMESSAGE
echo "Expected: $expected" >> $EMAILMESSAGE
mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
sudo systemctl restart mysql
fi
進階技巧:若環境無 mail 指令,可改用 curl 對接企業微信、鉉釘或 Slack Webhook 實現即時通訊告警。
檢查 3306 埠是否處於 LISTEN 狀態,簡單輕量但無法驗證 SQL 層可用性:
#!/bin/bash
PORT=`netstat -lnt | grep 3306 | wc -l`
if [ $PORT -eq 1 ]; then
echo "MySQL 監聽正常"
else
echo "埠未監聽,嘗試啟動服務"
sudo systemctl start mysql
# 遞迴檢查防止啟動失敗
./check_mysql.sh
fi
| 維度 | 建議配置 |
|---|---|
| 執行頻率 | crontab 每 1-2 分鐘一次,平衡偵測延遲與系統負載 |
| 日誌輪轉 | 配合 logrotate 定期清理監控日誌,避免磁碟佔滿 |
| 告警去抖 | 引入狀態檔記錄上次告警時間,避免頻繁重啟產生告警風暴 |
| 權限最小化 | 建立專用監控帳號,僅授予 SHUTDOWN、PROCESS 權限 |
掌握跨平台的 MySQL 存活檢測技巧,結合自動化重啟與多渠道告警,即可大幅降低資料庫宕機帶來的業務影響時間,邁向高可用架構的堅實一步。