每 5 秒採集一次 MySQL 全域狀態、InnoDB 狀態、進程列表、系統負載,寫入時間序列檔案,事後用 pt-query-digest、Excel、Grafana 分析效能趨勢。
#!/bin/ksh
INTERVAL=5
PREFIX=${INTERVAL}-sec-status
touch /tmp/running
RUNFILE=/tmp/running
# 固定變數快照
mysql -e 'SHOW GLOBAL VARIABLES' > mysql-variables
while test -e $RUNFILE; do
file=$(date +%F_%H)
sleep=$(date +%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}")
sleep $sleep
ts="$(date +\"TS %s.%N %F %T\")"
loadavg="$(uptime)"
echo "$ts $loadavg" >> $PREFIX-${file}-status
mysql -e 'SHOW GLOBAL STATUS' >> $PREFIX-${file}-status &
echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
mysql -e 'SHOW ENGINE INNODB STATUS\G' >> $PREFIX-${file}-innodbstatus &
echo "$ts $loadavg" >> $PREFIX-${file}-processlist
mysql -e 'SHOW FULL PROCESSLIST\G' >> $PREFIX-${file}-processlist &
echo $ts
done
echo "Exiting because $RUNFILE does not exist."
| 來源 | 關鍵指標 | 健康閾值/含義 |
|---|---|---|
| GLOBAL STATUS | Threads_connected | 當前連接數,接近 max_connections 報警 |
| Threads_running | 活躍查詢數,持續高位 → 慢查詢/鎖爭用 | |
| Questions / Queries | QPS 基線 | |
| Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests | 命中率 = 1 - reads/requests,< 99% 需擴充 buffer pool | |
| Innodb_row_lock_waits / Innodb_row_lock_time_avg | 行鎖等待次數/平均時間,飆高 → 熱點更新/索引缺失 | |
| INNODB STATUS | SEMAPHORES / TRANSACTIONS / FILE I/O | 信號量等待、活躍事務、檔案 I/O 待完成,定性分析卡點 |
| PROCESSLIST | Time, State, Info | 長時間 Sleep、Locked、Sending data、Copying to tmp table |
| OS | loadavg, vmstat, iostat | CPU、記憶體、磁碟瓶頸交叉驗證 |
# 產生報表
pt-query-digest 5-sec-status-2024-01-15-status --type slowlog --limit 20
# 導入 InfluxDB/Grafana 持續監控
# Telegraf + MySQL input plugin 替代手工腳本