MySQL慢日志分析工具mysqlsla安装及使用指南
MySQL慢日志分析工具mysqlsla安装及使用详细说明
最后更新时间:2013-01-29
• 2013-01-18 首次整理成文档
• 2013-01-29 发布到博客并整理添加了实例及工具对比表
一、MySQL慢日志分析意义
在运营 PHP+MySQL 网站的过程中,可能会遇到网站突然变慢的问题,一般情况下和 MySQL 慢有关系,可以通过开启慢查询来记录超过指定时间的SQL语句,MySQL慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,找到影响效率的SQL语句,然后采取相应的措施进行代码或缓存等优化,从而提高整个系统的性能。
关于MySQL慢查询记录日志启用可以参考这篇文章:《MySQL开启慢查询日志记录 - MySQL优化》
二、常见的5种MySQL日志文件分析工具:
# mysqldumpslow slow_query_9.log (推荐)
[root@monitor opt]# mysqlsla -lt slow slow_query_9.log (强烈推荐)
[root@monitor opt]# php parser.php -slow slow_query_9.log (php强烈推荐)
[root@monitor opt]# ./mysql_explain_slow_log --user=root --password=123456 < slow_query_9.log (不推荐)
[root@monitor opt]# python mysql_filter_slow_log.py --no-duplicates slow_query_9.log (推荐)
以上命令是在CentOS系统下测试
5种MySQL日志文件分析工具对比:
本文主要介绍mysqlsla日志分析工具,这里不再多赘述其他。
三、mysqlsla分析工具安装
mysqlsla工具是hackmysql.com推出的一款日志分析工具(该网站还维护了 mysqlreport, mysqlidxchk 等比较实用的mysql工具)。整体来说,功能非常强大。数据报表,非常有利于分析慢查询的原因,包括执行频率,数据量,查询消耗等。
1、下载 mysqlsla
附官方网站:http://hackmysql.com/mysqlsla
[root@monitor opt]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz
2、解压并进入安装目录
[root@monitor opt]# tar -zxvf mysqlsla-2.03.tar.gz
[root@monitor opt]# cd mysqlsla-2.03
[root@monitor mysqlsla-2.03]# less INSTALL //浏览下安装说明
3、执行perl脚本检查包依赖关系
[root@monitor mysqlsla-2.03]# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for mysqlsla
补充:安装mysqlsla需要perl-DBI和per-DBD-Mysql两模块的支持,centos下安装mysql自动安装了这2个模块。
4、安装mysqlsla
[root@monitor mysqlsla-2.03]#make && make install
常见错误:
1)类似错误:Can't locate ExtUtils/MakeMaker.pm OR Time/HiRes.pm in @INC
可参考这篇文章:《Can't locate ExtUtils/MakeMaker.pm OR Time/HiRes.pm in @INC解决方法》
2)类似错误:Can't locate DBI.pm in @INC (@INC contains: /usr/lib/perl
可参考这篇文章:《Can't locate DBI.pm in @INC (@INC contains: /usr/lib/perl错误解决方法》
四、mysqlsla分析工具使用说明
语法:
Slow log: mysqlsla -lt slow slow.log
General log: mysqlsla -lt general general.log
Binary log: mysqlbinlog bin.log | mysqlsla -lt binary -
这里以slow log为例:
[root@monitor mysqlsla-2.03]# mysqlsla -lt slow /opt/slow.log | more
mysqlsla -lt slow /opt/slow.log | more
Use of uninitialized value $line in pattern match (m//) at /usr/local/bin/mysqlsla line 675, <LOG> line 211.
Use of uninitialized value $line in pattern match (m//) at /usr/local/bin/mysqlsla line 692, <LOG> line 211.
Report for slow logs: /opt/slow.log
35 queries total, 15 unique
Sorted by 't_sum'
Grand Totals: Time 229 s, Lock 0 s, Rows sent 443.57k, Rows Examined 10.11M
______________________________________________________________________ 001 ___
Count : 7 (20.00%)
Time : 42.930986 s total, 6.132998 s avg, 4.046063 s to 10.72709 s max (18.76%)
Lock Time (s) : 354 otal, 51 vg, 38 o 65 ax (15.26%)
Rows sent : 54 avg, 54 to 54 max (0.09%)
Rows examined : 1.58k avg, 222 to 4.57k max (0.11%)
Database : dz_nanchang
Users :
dz_nanchang@ 192.168.1.10 : 42.86% (3) of query, 11.43% (4) of all users
dz_nanchang@ 192.168.1.15 : 42.86% (3) of query, 8.57% (3) of all users
dz_nanchang@ 192.168.1.20 : 14.29% (1) of query, 2.86% (1) of all users
Query abstract:
SET timestamp=N; SELECT t.* FROM pre_forum_thread t WHERE t.fid='S' AND (t.displayorder IN (N2)) ORDER BY displayorder DESC, lastpost DESC LIMIT N;
Query sample:
SET timestamp=1354213966;
SELECT t.* FROM pre_forum_thread t
WHERE t.fid='139' AND (t.displayorder IN (0, 1))
ORDER BY displayorder DESC, lastpost DESC
LIMIT 54;
……………………
……………………
统计结果选项说明:
总查询次数 (queries total), 去重后的sql数量 (unique)
输出报表的内容排序(sorted by)
最重大的慢sql统计信息, 包括 平均执行时间, 等待锁时间, 结果行的总数, 扫描的行总数.
Count, sql的执行次数及占总的slow log数量的百分比.
Time, 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比.
95% of Time, 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间.
Lock Time, 等待锁的时间.
95% of Lock , 95%的慢sql等待锁时间.
Rows sent, 结果行统计数量, 包括平均, 最小, 最大数量.
Rows examined, 扫描的行数量.
Database, 属于哪个数据库
Users, 哪个用户,IP, 占到所有用户执行的sql百分比
Query abstract, 抽象后的sql语句
Query sample, sql语句
mysqlsla常用参数说明:
--log-type (-lt) type logs:
通过这个参数来制定log的类型,主要有slow, general, binary, msl, udl,分析slow log时通过制定为slow.
--sort:
制定使用什么参数来对分析结果进行排序,默认是按照t_sum来进行排序。
t_sum:按总时间排序
c_sum:按总次数排序
c_sum_p: sql语句执行次数占总执行次数的百分比。
--top:
显示sql的数量,默认是10,表示取按规则排序的前多少条
--statement-filter (-sf) [+-][TYPE]:
过滤sql语句的类型,比如select、update、drop.
[TYPE]有SELECT, CREATE, DROP, UPDATE, INSERT,例如"+SELECT,INSERT"。
A +表示正过滤器:只保留SQL语句[TYPE]。A - 表示负的过滤:仅删除SQL语句[TYPE]。如果没有给定, - 是默认的,即不包括。
--databases db:
要处理哪个库的日志
更多参数定制可参考官方:http://hackmysql.com/mysqlsla_documentation
使用举例
1)将慢日志/opt/slow.log中执行时间最长的10条sql显示并写到/opt/slowlog_10.log中。
[root@monitor mysqlsla-2.03]# mysqlsla -lt slow -sf "+select" -top 10 /opt/slow.log >/opt/slowlog_10.log
2)将慢日志/opt/slow.log中数据库为sql_dz的所有select和update的慢sql,显示并将查询次数最多的100条写到/opt/slowlog_su100.log中。
[root@monitor mysqlsla-2.03]#mysqlsla -lt slow -sf "+select,update" -top 100 -sort c_sum -db sql_dz /opt/slow.log >/opt/slowlog_su100.log
3)只取backup库的select语句、按c_sum_p排序的前2条记录
[root@monitor mysqlsla-2.03]#mysqlsla -lt slow -sort c_sum_p -sf "+select" -db backup -top 2 /opt/slow.log
mysqlsla -lt slow -sf "+select,update" -top 100 -sort t_sum -db nn_core slowlog.txt > su200.log但是显示的结果中的database不是nn_core啊 求解答
@lym123
请参阅官方文档:http://hackmysql.com/mysqlsla_documentation#databases