pt-query-digest的一个问题

昨天有同学问,用pt-query-digest分析后,发现排在最前面都是ADMIN开头的语句,真正的语句却没有真实反映在报表中

$ sudo pt-query-digest --type genlog /tmp/general.log  --order-by Query_time:cnt --limit 3
 
# Profile
# Rank Query ID           Response time Calls R/Call V/M   Item
# ==== ================== ============= ===== ====== ===== =============
#    1 0x440061F2EB7A7639  0.0000  0.0% 53390 0.0000  0.00 ADMIN CLOSE
#    2 0x99AA0165670CE848  0.0000  0.0% 53389 0.0000  0.00 ADMIN PREPARE
#    3 0x1228F184663C8627  0.0000  0.0% 53386 0.0000  0.00 ADMIN EXECUTE
# MISC 0xMISC              0.0000  0.0%  5042 0.0000   0.0 <42 ITEMS>

首先要知道这些语句是因为JAVA使用preparestatment引起,打开general.log发现类似语句:

11637701 Prepare select * from t  
 11637701 Execute select * from t
 11637701 Close stmt

pt-query-digest没有很好处理prepare及execute后面语句,导致真正的sql没有展示出来。
想到把Execute改成Query,把其余的ADMIN过滤掉,那就是一份正确的报告了。

$sed -i 's/Execute/Query/g' /tmp/general.log 
$ sudo pt-query-digest --type genlog /tmp/general.log --filter '$event->{fingerprint} !~ m/^admin/i' --order-by Query_time:cnt --limit 3
# Profile
# Rank Query ID           Response time Calls R/Call V/M   Item
# ==== ================== ============= ===== ====== ===== ===============
#    1 0x2DAF846CC781D91A  0.0000  0.0% 14855 0.0000  0.00 SELECT t?
#    2 0x7164FF6E647C5863  0.0000  0.0% 11604 0.0000  0.00 SELECT t2?
#    3 0x6576B004C40147B5  0.0000  0.0%  4582 0.0000  0.00 SELECT t3

可以看到真正的sql出来

细心同学会发现ADMIN CLOSE、ADMIN PREPARE、ADMIN EXECUTE的值几乎都是一样,理论上应该是相同。


Post a Comment