首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 狀態檢測自動化腳本實戰:基於 nmap 的存活監控與自愈重啟機制

     編輯:MySQL 資料庫相關知識

腳本設計目標

  • 端口層面存活檢測:TCP 3306 埠是否開放 (nmap 掃描)。
  • 服務層面可用性驗證:實際建立連線、執行 SHOW DATABASES; 驗證 SQL 層響應。
  • 分級自愈策略:端口不在 → 直接啟動;端口在但 SQL 掛 → 強制殺進程後啟動。
  • 生產級健壯性:超時控制、靜默運行、日誌記錄、避免誤殺。

完整腳本 (Bash + nmap + mysql client)

#!/bin/bash
# mysql_guard.sh - MySQL 存活檢測與自動恢復
# 依賴: nmap, mysql client, mysqld_safe
# 部署: crontab -e  */5 * * * * /path/mysql_guard.sh >> /var/log/mysql_guard.log 2>&1

set -euo pipefail

# ========== 配置區 ==========
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="monitor_user"          # 建議專用監控帳號
MYSQL_PASS="StrongPass123!"
MYSQL_BASE="/usr/local/mysql"      # MySQL 安裝根目錄
MYSQLD_SAFE="${MYSQL_BASE}/bin/mysqld_safe"
MYSQL_BIN="${MYSQL_BASE}/bin/mysql"
CONNECT_TIMEOUT=5                  # 連線超時秒數
LOG_FILE="/var/log/mysql_guard.log"
PID_FILE="${MYSQL_BASE}/data/$(hostname).pid"
# ============================

log() { echo "[$(date '+%F %T')] $*" | tee -a "${LOG_FILE}"; }

# 1. 端口掃描 (nmap 快速、無需完整連線)
if nmap -p "${MYSQL_PORT}" "${MYSQL_HOST}" | grep -q "${MYSQL_PORT}/open"; then
    log "Port ${MYSQL_PORT} is OPEN. Proceeding to SQL layer check..."

    # 2. SQL 層健康檢查 (帶超時、只查元數據)
    if "${MYSQL_BIN}" -h"${MYSQL_HOST}" -P"${MYSQL_PORT}" \
       -u"${MYSQL_USER}" -p"${MYSQL_PASS}" \
       --connect-timeout="${CONNECT_TIMEOUT}" \
       -e "SHOW DATABASES;" >/dev/null 2>&1; then
        log "MySQL is HEALTHY. No action needed."
        exit 0
    else
        log "WARNING: Port open but SQL layer UNRESPONSIVE. Initiating FORCE RESTART..."
    fi
else
    log "WARNING: Port ${MYSQL_PORT} CLOSED. MySQL process likely DOWN. Initiating START..."
fi

# 3. 統一強制重啟流程 (殺進程 → 清理 → 啟動)
log "Stopping any residual MySQL processes..."
# 精準殺進程:僅殺 mysqld 主進程,避免誤殺備份/客戶端進程
pkill -f "${MYSQL_BASE}/bin/mysqld" 2>/dev/null || true
sleep 2
# 雙重保險:殘留進程用 SIGKILL
pkill -9 -f "${MYSQL_BASE}/bin/mysqld" 2>/dev/null || true

# 清理可能殘留的 socket/鎖文件
rm -f "${MYSQL_BASE}/data/mysql.sock" "${MYSQL_BASE}/data/mysql.sock.lock" 2>/dev/null

log "Starting MySQL via mysqld_safe..."
# nohup + & 確保脫離終端;輸出導向 /dev/null 避免 cron 郵件堵塞
nohup "${MYSQLD_SAFE}" --user=mysql >/dev/null 2>&1 &

# 4. 啟動後驗證 (給 10 秒緩衝)
sleep 10
if nmap -p "${MYSQL_PORT}" "${MYSQL_HOST}" | grep -q "${MYSQL_PORT}/open"; then
    if "${MYSQL_BIN}" -h"${MYSQL_HOST}" -P"${MYSQL_PORT}" \
       -u"${MYSQL_USER}" -p"${MYSQL_PASS}" \
       --connect-timeout="${CONNECT_TIMEOUT}" \
       -e "SHOW DATABASES;" >/dev/null 2>&1; then
        log "SUCCESS: MySQL RESTARTED and VERIFIED healthy."
        exit 0
    else
        log "CRITICAL: Process started but SQL layer STILL UNRESPONSIVE!"
        exit 1
    fi
else
    log "CRITICAL: MySQL FAILED to start (port still closed)."
    exit 1
fi

關鍵技術點深度解析

為什麼選 nmap 而非 netstat/ss/lsof?

工具優點缺點適用性
nmap主動探測、跨主機、狀態機標準化、腳本友好需安裝、掃描稍慢 (ms 級)✅ 最佳:腳本化、遠程檢測
netstat/ss系統內建、顯示進程 PID需 root 權限看完整資訊、解析麻煩次選:本機檢測
lsof -i:3306直接顯示進程與 FD需 root、輸出格式不穩定輔助:排查佔用
mysqladmin ping應用層語義檢測需帳號密碼、無法區分端口開但服務掛配合:二次驗證

為什麼殺進程不用正常 shutdown?

  • mysqladmin shutdown 需要 SQL 層響應,但故障時 SQL 層往往已掛死。
  • mysqld_safe 監控腳本會嘗試優雅關閉,但掛死進程不響應信號。
  • SIGTERM (kill) → 10s 後 SIGKILL (kill -9) 是業界標準強制停止流程。
  • InnoDB 紅日誌保證崩潰恢復,強制殺進程**不會損壞數據**,僅延長下次啟動恢復時間。

監控帳號最小權限建立

CREATE USER 'monitor_user'@'localhost' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT ON *.* TO 'monitor_user'@'localhost';  -- 僅需 SELECT 執行 SHOW DATABASES
FLUSH PRIVILEGES;

進階擴展方向

  1. 多實例支援:配置陣列遍歷多個 MYSQL_BASE/port。
  2. 告警整合:失敗時發送 Webhook 到钉钉/企業微信/Slack/PagerDuty。
  3. 狀態機持久化:記錄連續失敗次數,避免頻繁重啟震盪 (如連續 3 次失敗升級人工介入)。
  4. Prometheus Exporter 模式:改寫為 HTTP 端點輸出 mysql_up 1/0,接入監控體系。

部署檢查清單

  • [ ] 安裝 nmap: yum install -y nmap / apt install -y nmap
  • [ ] 建立監控帳號並驗證連線
  • [ ] 腳本賦予執行權限: chmod +x mysql_guard.sh
  • [ ] 手動執行測試: ./mysql_guard.sh
  • [ ] 加入 crontab: */5 * * * * /opt/scripts/mysql_guard.sh
  • [ ] 觀察日誌 /var/log/mysql_guard.log 確認無誤報

這個腳本體現了「檢測→判斷→分級處理→驗證閉環」的運維自動化核心思想。將其納入基礎設施代碼庫,配合監控告警體系,能將 MySQL 因進程掛死導致的業務中斷時間壓縮到分鐘級甚至秒級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved