監控 MySQL 運行狀態是資料庫運維的核心任務之一。本文介紹兩種主流腳本方案:基於 mysqladmin 的輕量級 Shell 腳本,以及功能更豐富的 Python 互動式監控工具 mysqlstatus.py。兩者各有優勢,可根據場景選擇。
mysqladmin extended-status 可輸出所有全域狀態變數(相當於 SHOW GLOBAL STATUS)。但大多數指標為累計值,若要掌握當前每秒增量,需配合 -r (--relative) 參數進行差值計算,並用 -i (--sleep) 指定刷新頻率。
在 [mysqldump] 區段設定連線帳號,避免命令列明文密碼:
[mysqldump] user=root password=123456
mysqladmin -r -i 1 extended-status
每秒刷新一次,顯示所有狀態變數的每秒增量。
以下腳本提取 QPS、TPS、各類 DML 計數、InnoDB 緩衝池命中率、線程數等核心指標,並格式化輸出:
#!/bin/bash
# author: pingzhao1990@163.com
mysqladmin extended-status -i1 | awk '
BEGIN { local_switch=0 }
$2 ~ /Queries$/ { q=$4-lq; lq=$4; }
$2 ~ /Com_commit$/ { c=$4-lc; lc=$4; }
$2 ~ /Com_rollback$/ { r=$4-lr; lr=$4; }
$2 ~ /Com_select$/ { s=$4-ls; ls=$4; }
$2 ~ /Com_update$/ { u=$4-lu; lu=$4; }
$2 ~ /Com_insert$/ { i=$4-li; li=$4; }
$2 ~ /Com_delete$/ { d=$4-ld; ld=$4; }
$2 ~ /Innodb_rows_read$/ { irr=$4-lirr; lirr=$4; }
$2 ~ /Innodb_rows_deleted$/{ ird=$4-lird; lird=$4; }
$2 ~ /Innodb_rows_inserted$/{ iri=$4-liri; liri=$4; }
$2 ~ /Innodb_rows_updated$/{ iru=$4-liru; biru=$4; }
$2 ~ /Innodb_buffer_pool_read_requests$/ { ibprr=$4-libprr; libprr=$4; }
$2 ~ /Innodb_buffer_pool_reads$/ { ibpr=$4-libpr; libpr=$4; }
$2 ~ /Threads_connected$/ { tc=$4; }
$2 ~ /Threads_running$/ { tr=$4;
if (local_switch==0) { local_switch=1; count=16 }
else {
if (count>15) {
count=0;
print "------------------------------------------------------------------------------------------------------------------------------------";
print "Time-----| QPS | Commit Rollback TPS | select insert update delete | read inserted updated deleted | logical physical | Tcon Trun";
print "------------------------------------------------------------------------------------------------------------------------------------";
} else {
count+=1;
printf "%s | %-5d| %-6d %-7d %-5d| %-7d %-7d %-5d %-6d| %-7d %-7d %-7d %-7d| %-6d %-9d| %-4d %-2d \\n",
strftime("%H:%M:%S"), q, c, r, c+r, s, u, i, d, irr, ird, iri, iru, ibprr, ibpr, tc, tr;
}
}
}'
------------------------------------------------------------------------------------------------------------------------------------ Time-----| QPS | Commit Rollback TPS | select insert update delete | read inserted updated deleted | logical physical | Tcon Trun ------------------------------------------------------------------------------------------------------------------------------------ 11:07:39 | 792 | 0 0 0 | 680 12 8 1 | 337862 0 2 2 | 52243 0 | 20 3 11:07:40 | 792 | 0 0 0 | 665 6 1 1 | 1338 0 1 3 | 2548 0 | 18 3 11:07:41 | 755 | 0 0 0 | 680 6 4 0 | 254448 0 4 6 | 88879 0 | 16 3 ...
此腳本適合快速排查性能抖動,無需額外依賴。
當需要更豐富的互動操作(如切換 SHOW PROCESSLIST、調整刷新間隔、彩色終端顯示)時,mysqlstatus.py 是更佳選擇。它基於 curses 庫實現終端 UI,支援互動模式與非互動(CLI)模式雙模運行。
# 安裝 Python 2.7 wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tar.xz xz -d Python-2.7.8.tar.xz && tar -xvf Python-2.7.8.tar cd Python-2.7.8 && ./configure --prefix=/usr/local && make && make altinstall # 安裝 setuptools & pip wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz tar -xvf setuptools-1.4.2.tar.gz && cd setuptools-1.4.2 && python2.7 setup.py install curl https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py | python2.7 - # 修復 yum(將 shebang 改為 python2.6) which yum # 編輯 /usr/bin/yum,首行改為 #!/usr/bin/python2.6 # 安裝 MySQLdb pip install mysql-python
status(預設,顯示 SHOW GLOBAL STATUS 關鍵指標)與 process(顯示 SHOW FULL PROCESSLIST)一鍵切換(按 s/p)。Uptime 與 Questions 差值得出精確 QPS。-n 參數可將結果導向標準輸出或檔案,便於整合到監控系統。# 互動模式(預設) python mysqlstatus.py -h 127.0.0.1 -u root -P password -i 1 # 非互動模式,輸出到檔案 python mysqlstatus.py -n -o /var/log/mysql_status.log -i 5
localhost.localdomain, 2015-12-29 00:12:24, 5.6.25-log ---------------------------------------------------------------------- QPS : 1.00 Aborted_connects : 1 Binlog_cache_disk_use : 0 Bytes_received : 21450 Bytes_sent : 4321757 Connections : 40 Created_tmp_disk_tables: 0 ... Threads_connected : 1 Threads_running : 1 Uptime : 3600
按 h 或 ? 顯示幫助,q 退出。
| 場景 | 推薦工具 | 理由 |
|---|---|---|
| 臨時排查、極簡依賴 | mysqladmin + AWK | 零安裝、輕量、輸出可直接導入試算表分析 |
| 長期監控、需互動/導出 | mysqlstatus.py | 支援 Processlist、彩色 UI、非互動模式易整合 |
| 圖形化儀表板 | Prometheus + Grafana + mysqld_exporter | 歷史趨勢、告警、多實例聚合 |
掌握這兩種腳本,即可覆蓋從「臨時看一眼」到「持續監控」的大多數需求。建議將 AWK 腳本納入運維工具箱,將 mysqlstatus.py 部署為跳板機常駐工具。