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

MySQL 運行狀態監控的兩種核心方法與自動化巡檢腳本

     編輯:MySQL 資料庫相關知識

方法一:MySQL 客戶端原生命令(輕量、無依賴)

1. `STATUS` / `\s` 命令

mysql -u root -p -e "STATUS"
# 或交互模式
mysql> \s

# 輸出範例
--------------
mysql  Ver 8.0.33 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 12345
Current database: biz_db
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.33 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db     characterset: utf8mb4
Client characterset: utf8mb4
Conn.  characterset: utf8mb4
UNIX socket: /data/mysql/mysql.sock
Uptime: 3 days 5 hours 12 min 34 sec
Threads: 45
Questions: 123456789
Slow queries: 12
Opens: 3456
Flush tables: 1
Open tables: 1024
Queries per second avg: 475.32
--------------
關鍵指標:`Uptime`(存活時間)、`Threads`(當前連線)、`Questions`(總查詢數)、`Slow queries`(慢查詢數)、`Open tables`(表緩存命中)、`Queries per second avg`(QPS 基線)。

2. `SHOW GLOBAL STATUS` 精準抓取

# 核心健康度指標
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Uptime';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_waits';
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_time_avg';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Aborted_connects';
SHOW GLOBAL STATUS LIKE 'Aborted_clients';"

3. `SHOW ENGINE INNODB STATUS` 深度診斷

mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G"
# 關注:SEMAPHORES(鎖等待)、TRANSACTIONS(活躍事務)、FILE I/O(檔案 I/O)、BUFFER POOL(緩存命中/髒頁)、LOG(Redo Log 寫入/檢查點)

方法二:phpMyAdmin 圖形化狀態頁(適合快速人工巡檢)

  • 登入 phpMyAdmin → 點擊頂部「狀態」頁籤
  • 視覺化圖表:流量、查詢類型分佈、表緩存命中率、InnoDB 緩存池使用率、鎖等待趨勢
  • 優化建議區:自動分析配置參數與狀態變數,給出調優提示(如「table_open_cache 過小」「query_cache 失效」等)
局限:生產環境通常禁用 phpMyAdmin 或僅內網跳板機可訪問,不適合自動化監控。

自動化巡檢與存活檢測腳本(生產就緒)

1. Bash:MySQL 存活檢測 + 自動重啟(適配 systemd)

#!/bin/bash
# /usr/local/bin/mysql_uptime_check.sh
# 加入 crontab:*/2 * * * * /usr/local/bin/mysql_uptime_check.sh >> /var/log/mysql_uptime.log 2>&1

PORT=$(netstat -lnt 2>/dev/null | grep -c ':3306 ')
if [ "$PORT" -eq 1 ]; then
    echo "$(date) MySQL is running (port 3306 listening)"
    exit 0
fi

echo "$(date) MySQL port 3306 NOT listening, attempting restart..."
systemctl restart mysqld

# 等待啟動並再次檢查
sleep 10
PORT=$(netstat -lnt 2>/dev/null | grep -c ':3306 ')
if [ "$PORT" -eq 1 ]; then
    echo "$(date) MySQL restarted successfully"
    # 可加入郵件/企業微信/釘釘告警
else
    echo "$(date) MySQL restart FAILED, manual intervention required"
    # 告警升級
fi

2. Bash:mysqladmin ping 精準存活檢測(官方推薦)

#!/bin/bash
# 來源:https://www.codeproject.com/Articles/988967/Mysql-Uptime-Check-Script
RESULT=$(/usr/bin/mysqladmin ping 2>/dev/null)
EXPECTED="mysqld is alive"

if [[ "$RESULT" != "$EXPECTED" ]]; then
    echo "$(date) MySQL ping failed: $RESULT"
    SUBJECT="[MYSQL ALERT] Ping failed on $(hostname)"
    EMAIL="dba@company.com"
    echo -e "Expected: $EXPECTED\nGot: $RESULT" | mail -s "$SUBJECT" "$EMAIL"
    systemctl restart mysqld
fi

3. Windows Bat:服務狀態切換(啟動/停止切換)

@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

生產級監控體系建議(超越腳本)

層級工具/方案核心指標告警閾值範例
基礎存活systemd `Restart=on-failure` + `mysqladmin ping` cron進程存活、端口監聽連續 3 次 ping 失敗 → 重啟 + 告警
效能指標Prometheus + mysqld_exporter + GrafanaQPS、TPS、延遲 P99、緩存命中率、鎖等待、連線數、磁碟/記憶體QPS 突降 >50%、P99 > 1s、命中率 < 95%
日誌審計ELK/EFK 收集 error.log/slow.log/audit.log錯誤頻率、慢查詢 TopN、死鎖、權限拒絕每分鐘 error > 10、死鎖 > 5/min
主從同步Prometheus `mysqld_slave_status_seconds_behind_master`Seconds_Behind_Master、IO/SQL Thread 狀態延遲 > 30s、任一 Thread 非 Yes
容量規劃每日統計 `information_schema.TABLES` 大小增長庫/表/索引大小、增長率、剩餘磁碟單表 > 500G、磁碟剩餘 < 20%

總結

MySQL 狀態監控:**原生命令(`STATUS`/`SHOW GLOBAL STATUS`/`SHOW ENGINE INNODB STATUS`)是基石,自動化腳本(`mysqladmin ping` + systemd)是保底,Prometheus + Grafana 是標準化可觀測體系**。建議分層部署:單機腳本保存活、集群監控看趨勢、日誌平台查細節、告警直達人。切勿依賴 phpMyAdmin 作為生產監控主力。

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