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

相关文章

已有 2 条评论
  1. lym123

    mysqlsla -lt slow  -sf "+select,update" -top 100 -sort t_sum -db nn_core slowlog.txt > su200.log但是显示的结果中的database不是nn_core啊   求解答

    lym123
    1. Rinald

      @lym123

      请参阅官方文档:http://hackmysql.com/mysqlsla_documentation#databases

      Rinald

此处评论已关闭