线上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的一些总结