Percona Toolkit 被譽為 MySQL DBA 的「瑞士軍刀」,其 pt-query-digest 比官方 mysqldumpslow 強大得多:支援靈活過濾、按庫/表聚合、歷史趨勢對比、生成報告等。
--review 與 --history 將慢查詢指紋存入資料庫(percona_schema.query_review、query_history)。first_seen = last_seen AND first_seen > 15分鐘前),避免重複告警。slow_query_monitor.sh#!/bin/bash
# 依賴:percona-toolkit、mailx、mysql client
# Crontab: */15 * * * * /path/to/slow_query_monitor.sh
DATE_AGO=$(date -d '15 min ago' '+%Y-%m-%d %H:%M:%S')
MYSQL_CONN="mysql -uuser -ppwd -h127.0.0.1"
SLOW_LOG="/mysqldata/dev-env-slow.log"
SCHEMA="test"
TMP_FILE="/tmp/slow_query_inc"
# 1. 寫入 review & history 表(無報告模式)
pt-query-digest --history u=user,p=pwd,D=$SCHEMA $SLOW_LOG --no-report
pt-query-digest --review u=user,p=pwd,D=$SCHEMA $SLOW_LOG --no-report
# 2. 清空上次結果
> $TMP_FILE
# 3. 找出 15 分鐘內首次出現的 checksum
for cks in $($MYSQL_CONN -Nse "SELECT checksum FROM percona_schema.query_review WHERE first_seen=last_seen AND first_seen>'$DATE_AGO'"); do
$MYSQL_CONN -e "
SELECT
sample AS Statement,
ts_max AS Time,
query_time_pct_95 AS Query_Time,
Rows_sent_pct_95 AS Rows_Sent,
Rows_examined_pct_95 AS Rows_Examined
FROM percona_schema.query_history
WHERE checksum='$cks'\G
" 2>/dev/null | sed 's/^[ \t]*//g' | awk -F: '{print $1": "$2}' >> $TMP_FILE
done
# 4. 有新增慢查詢才發郵件
if [ -s "$TMP_FILE" ]; then
mail -s "【慢查詢告警】Dev 環境新增慢 SQL - $(date '+%H:%M')" dba@company.com < $TMP_FILE
fi
| 參數 | 作用 |
|---|---|
--review | 建立/更新指紋表,記錄首次/最後見到時間、樣本 SQL、聚合統計 |
--history | 每次運行產生一條歷史記錄,支援趨勢分析 |
first_seen=last_seen | 過濾條件:僅本輪次首次出現的查詢 |
query_time_pct_95 | 95 分位執行時間,比平均值更能反映尾部延遲 |
Rows_examined/Rows_sent > 100 或 Query_Time > 5s 觸發 P1/P2 不同級別。pt-query-digest,合併請求階段攔截慢 SQL,扼殺於萌芽。
腳本輕量、零依賴框架,幾分鐘即可落地,讓慢查詢無處遁形。