確保 MySQL 服務持續運行是資料庫運維的基礎工作。本文提供 Windows 批次檔與 Linux Shell 腳本兩套方案,涵蓋進程檢測、服務狀態查詢、自動重啟等核心功能,並支援加入排程實現無人值守監控。
透過 tasklist 搭配 find 計數 mysqld.exe 進程數量,若為 0 則嘗試重啟服務並記錄日誌。
@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 直接讀取服務狀態,支援更精細的啟停邏輯控制。
@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
pause
優勢:官方服務 API,狀態判斷更可靠;支援自訂啟停邏輯(如優雅關閉)。
官方推薦方式,直接檢測 MySQL 回應能力,支援郵件告警與自動重啟。
#!/bin/bash
result=`/usr/bin/mysqladmin ping`
expected='mysqld is alive'
if [[ "$result" != "$expected" ]]; then
echo "It's dead - restart mysql"
SUBJECT="[MYSQL ERROR] - Attempting to restart service"
EMAIL="admin@example.com"
EMAILMESSAGE="/tmp/emailmessage.txt"
echo "$result was received" > $EMAILMESSAGE
echo "when we were expected $expected" >> $EMAILMESSAGE
mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
sudo /etc/init.d/mysql restart
fi
部署建議:加入 crontab 定時執行(如每分鐘 * * * * * /path/check_mysql.sh)。
透過 netstat 檢查 3306 埠監聽狀態,適合無法使用 mysqladmin 的環境。
#!/bin/bash
PORT="0"
PORT=`netstat -lnt | grep 3306 | wc -l`
echo $PORT
if [ $PORT -eq 1 ]; then
echo "mysql is running"
else
echo "mysql is not running"
echo "program ready to start mysql"
sudo service mysql start
./check_mysql.sh
fi
注意:僅檢測埠監聽,無法識別 MySQL 內部錯誤(如資料損壞導致拒絕連線)。
SELECT 1)Windows 推薦 sc query 方案,Linux 首選 mysqladmin ping。生產環境建議部署雙重檢測機制,並納入統一監控平台(Zabbix/Prometheus/Grafana)實現可視化運維。