mysql线上SQL捕获和分析

线上SQL捕获方法

基于tcpdump线上SQL抓取

基于查询日志记录

基于慢日志记录


mysql SQL执行的一个过程

说明:tcpdump抓取基于的是mysql接入层;基于查询日志和慢日志基于的是日志层

利用tcpdump可能存在的问题:

1.在事务中的SQL抓取乱码,解析不出来(如tpcc-mysql压测)

2.利用strings解出来的东西,处理着样子多样,较难匹配

3.没有好的工具做分析

mysql日志的作用和启用方法

常规日志:记录和数据库所有的交互过程

set global general_log=1;

二进制日志:记录数据库相关的写操作(复制中重要的依据)

log-bin=mysql-bin

慢日志:记录执行超过long_query_time的语句

log-slow-queries=slow.log

错误日志:记录mysql启动及运行中的错误提示

log-error=error.log

同步中继日志:slave上IO_THREAD从主库上获取的相应的二进制日志,供slave上的SQL_THREAD执行

relay-log=relay-log


SQL分析工具

推荐工具 pt-query-digest

输出分块

文件概述部分

profiler信息

具体SQL部分


pt-query-digest输出说明

文件描述部分

# 6.2s user time, 100ms system time, 26.52M rss, 205.46M vsz

# Current date: Thu Oct 23 16:24:02 2014 分析的时间

# Hostname: 机器名

# Files: 分析的慢日志名

# Overall: 23.33k total, 41 unique, 262.10 QPS, 100.40x concurrency ______(总共多少SQL,归类后多少类型的 SQL unique,每秒慢日志数量QPS,并发度X)

# Time range: 2014-10-23 16:22:33 to 16:24:02(慢日志的起始时间到结束时间)

# Attribute     total   min   max   avg   95% stddev median

# ============   ======= ======= ======= ======= ======= ======= =======

# Exec time     8935s   3us   14s  383ms  374ms   2s  348us

# Lock time     6687s    0   12s  287ms  113us   2s  69us

# Rows sent     18.90k    0   227  0.83  0.99  6.48  0.99

# Rows examine    1.04M    0  2.98k  46.84  0.99 362.21  0.99

# Rows affecte   10.08k    0   15  0.44  0.99  1.12    0

# Bytes sent     4.75M    0  2.30k 213.51 1012.63 324.44  69.19

# Query size     2.37M    6   597 106.53 202.40  65.10  80.10

profile部分

# Profile

# Rank Query ID      Response time  Calls R/Call V/M  Item

# ==== ================== =============== ===== ====== ===== =============

#  1 0x255C57D761A899A9 6579.0369 73.6%  698 9.4256 0.89 UPDATE warehouse

#  2 0x9577D48F480A1260 764.5008 8.6%  164 4.6616 3.71 SELECT customer

#  3 0x5E61FF668A8E8456 708.6685 7.9% 5640 0.1257 0.06 SELECT stock

#  4 0xBD195A4F9D50914F 299.9228 3.4% 2647 0.1133 0.07 SELECT stock

#  5 0xE5E8C12332AD11C5  91.6826 1.0%  257 0.3567 4.58 SELECT district

#  6 0xBF40A4C7016F2BAE  70.9122 0.8% 2648 0.0268 0.15 SELECT item

#  7 0xFDB1B7AE94BF0D5A  68.5291 0.8%  148 0.4630 4.78 SELECT customer

#  10 0xF8A4D3E71E066ABA  33.6522 0.4%  27 1.2464 0.23 SELECT orders

#  23 0xF172E08E3553BBD9  5.4640 0.1%  15 0.3643 2.47 SELECT customer

# MISC 0xMISC       312.9235 3.5% 11083 0.0282  0.0 <32 ITEMS>

说明:Rank:按出现的次数排序的序号

query ID:某个类的语句的唯一标识码

response:该sql总的占用时间及全部SQL占用的时间的百分比

calls:该语句调用的次数

R/call:该语句平均的响应时间

V/M:the variance-to-mean ratio of response time

item:the distilled query

具体SQL部分

# Query 1: 7.93 QPS, 74.76x concurrency, ID 0x255C57D761A899A9 at byte 7875016

# Scores: V/M = 0.89

# Time range: 起始时间到结束时间

# Attribute  pct  total   min   max   avg   95% stddev median

# ============ === ======= ======= ======= ======= ======= ======= =======

# Count     0   164

# Exec time   8  765s   2ms   14s   5s   11s   4s   4s

# Lock time   0  13ms  20us  159us  76us  113us  24us  73us

# Rows sent   0   164    1    1    1    1    0    1

# Rows examine 45 480.47k  2.93k  2.93k  2.93k  2.93k    0  2.93k

# Rows affecte  0    0    0    0    0    0    0    0

# Bytes sent   0 11.85k   74   74   74   74    0   74

# Query size   0 14.73k   89   95  91.99  92.72  2.15  88.31


pt-query-digest使用

1.直接分析慢日志:pt-query-digest slow.log

2.利用show processlist获取:pt-query-digest-processlist h=host1

3.利用tcpdump获取

tcpdump -s 65535 -x -nn -q -ttt -i any -c 1000 pory 3306> mysql.tcp.txt

pt-query-digest-type tcpdump mysql.tcp.txt


pt-query-digest分析重点:数量最多;并发度最高;占用总时间多的


译者介绍:家华,从事mysqlDBA的工作,记录自己对mysql的一些总结

你可能感兴趣的:(mysql线上SQL捕获和分析)