慢查詢日志原始文本難以直觀定位核心問題。本文深度講解 pt-query-digest 進階過濾報告、審計庫持久化、Query-Digest-UI 可視化平台部署,構建「采集→分析→存儲→展示→告警」閉環體系。
SHOW VARIABLES LIKE '%slow%'; -- 期望:slow_query_log=ON, long_query_time=1 (或更小), log_queries_not_using_indexes=ON
動態修改:
SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 0.1; -- 100ms 閾值 SET GLOBAL log_queries_not_using_indexes = ON;
# Time: 130905 14:15:59 # User@Host: root[root] @ [183.239.28.174] # Query_time: 0.735883 Lock_time: 0.000078 Rows_sent: 262 Rows_examined: 262 SET timestamp=1378361759; SHOW TABLES FROM `test_db`;
Query_time:總耗時(秒,微秒精度)Rows_examined:引擎層掃描行數,遠大於 Rows_sent 表明全掃/索引失效Lock_time:鎖等待佔比高提示熱點鎖爭用# 基礎報告
pt-query-digest --report slow.log
# 最近 30 分鐘
pt-query-digest --report --since 1800s slow.log
# 指定時間窗
pt-query-digest --report --since '2023-02-10 21:48:59' --until '2023-02-16 02:33:50' slow.log
# 僅 SELECT
pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log
# 指定用戶
pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log
# 全表掃描或 Full Join
pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") || (($event->{Full_join} || "") eq "yes")' slow.log
wget https://nodeload.github.com/kormoc/Query-Digest-UI/zip/master unzip Query-Digest-UI-master.zip cd Query-Digest-UI-master
-- install.sql DROP DATABASE IF EXISTS slow_query_log; CREATE DATABASE slow_query_log; USE slow_query_log; CREATE TABLE `global_query_review` ( ... ); -- 指紋級元數據 CREATE TABLE `global_query_review_history` ( ... ); -- 時間序列統計
mysql -uroot -p -h 192.168.1.190 < install.sql mysql -uroot -p -h 192.168.1.190 -e "GRANT ALL ON slow_query_log.* TO 'slowlog'@'%' IDENTIFIED BY '123456';"
$reviewhost = array( 'dsn' => 'mysql:host=192.168.1.190;port=3306;dbname=slow_query_log', 'user' => 'slowlog', 'password' => '123456', 'review_table' => 'global_query_review', 'history_table' => 'global_query_review_history', );
pt-query-digest --user=slowlog --password=123456 \
--review h=192.168.1.190,D=slow_query_log,t=global_query_review \
--review-history h=192.168.1.190,D=slow_query_log,t=global_query_review_history \
--no-report --limit=0% \
--filter="\$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}='$HOSTNAME'" \
/usr/local/mysql/data/slow.log
加入 crontab 每 5 分鐘跑一次,Web 端即可按時間序列、Top SQL、指紋聚合多維檢視。
long_query_time=0.5,非核心 =1,避免日志爆炸。--filter 正則剔除 SET NAMES、COMMIT 等噪聲語句。Query_time_pct_95 > 1s 或 Rows_examined > 100000 觸發釘釘/企微告警。