2011年3月30日星期三

查看 MySQL 慢日誌

使用 MySQL自带命令 mysqldumpslow 查看


OPTIONS

  • -s ORDER ORDER, 主要有 c, t, l, r 和 ac, at, al, ar, 分别是按照 query次数, 时间, lock的时间和返回的记录数来排序, 前面加了a时倒序.

  • -t NUM top NUM, 即为返回前面多少条的数据.

  • -g PATTERN grep: 后边可以写一个正则匹配模式, 大小写不敏感



[bash]
#查看访问次数最多的 20 个 sql 语句
[root@localhost ~]# mysqldumpslow -s c -t 20 /usr/local/mysql/var/mysql_slow_query.log
#查看返回记录集最多的 20 个 sql
[root@localhost ~]# mysqldumpslow -s r -t 20 /usr/local/mysql/var/mysql_slow_query.log
#按照时间返回前 10 条里面含有左连接的 sql 语句
[root@localhost ~]# mysqldumpslow -t 10 -s t -g "LEFT JOIN" /usr/local/mysql/var/mysql_slow_query.log
[/bash]

mysqlsla 分析 MySQL 慢查询日志



  • mysqlsla -lt slow /usr/local/mysql/var/mysql_slow_query.log slow log

  • mysqlsla -lt general /usr/local/mysql/var/mysql_query.log general log

  • mysqlbinlog /usr/local/mysql/var/mysql-bin.000001 | mysqlsla -lt binary - binary log


  • mysqlsla(现已不在维护)是第三方提供的perl脚本, 不过它功能强悍, 可以分析包括慢查询在内的多种格式的日志.
    [bash]
    [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz
    [root@localhost tmp]# tar zxf mysqlsla-2.03.tar.gz
    [root@localhost tmp]# cd mysqlsla-2.03
    [root@localhost mysqlsla-2.03]# perl Makefile.PL
    [root@localhost mysqlsla-2.03]# make
    [root@localhost mysqlsla-2.03]# make install
    [/bash]
    安装完成后, mysqlsla 会加入到 /usr/bin 目录.

    mysqlsla 会自动判断日志类型, 缺省会打印出前十条结果, 可以通过类似--top 100的参数来修改, 如果觉得每次输入麻烦, 还可以建立一个配置文件 ~/.mysqlsla, 在文件里写上:
    [bash]
    top=100
    [/bash]
    这样就不用每次都手动输入参数了.
    [bash]
    [root@localhost mysqlsla-2.03]# mysqlsla -lt slow /usr/local/mysql/var/mysql_slow_query.log
    [/bash]

    返回结果:
    [text gutter="0"]
    Report for slow logs: /usr/local/mysql/var/mysql_slow_query.log
    4 queries total, 2 unique
    Sorted by 't_sum'
    Grand Totals: Time 11 s, Lock 0 s, Rows sent 712.40k, Rows Examined 712.40k


    ______________________________________________________________________ 001 ___
    Count : 3 (75.00%)
    Time : 8 s total, 2.666667 s avg, 2 s to 4 s max (72.73%)
    Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%)
    Rows sent : 178.10k avg, 178.10k to 178.10k max (75.00%)
    Rows examined : 178.10k avg, 178.10k to 178.10k max (75.00%)
    Database : test
    Users :
    root@localhost : 66.67% (2) of query, 75.00% (3) of all users
    root1@localhost : 33.33% (1) of query, 25.00% (1) of all users

    Query abstract:
    SELECT * FROM test_1;

    Query sample:
    select * from test_1;

    ______________________________________________________________________ 002 ___
    Count : 1 (25.00%)
    Time : 3 s total, 3 s avg, 3 s to 3 s max (27.27%)
    Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%)
    Rows sent : 178.10k avg, 178.10k to 178.10k max (25.00%)
    Rows examined : 178.10k avg, 178.10k to 178.10k max (25.00%)
    Database :
    Users :
    root@localhost : 100.00% (1) of query, 75.00% (3) of all users

    Query abstract:
    SELECT * FROM test_2;

    Query sample:
    select * from test_2;
    [/text]

    釋意:

    • queries total 总查询次数

    • unique 去除重复后的 sql 数量.

    • Sorted by 输出报表的内容排序.

    • Grand Totals slow sql统计信息包括: 总执行时间, 等待锁时间, 结果行总数, 扫描行总数.

    • Count slow sql 的执行次数及占总的 slow log 数量的百分比.

    • Time 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总 slow sql 时间的百分比.

    • Lock Time 等待锁的时间.

    • Rows sent 结果行统计数量, 包括平均, 最小, 最大数量.

    • Rows examined 扫描的行数量.

    • Database 属于哪个数据库

    • Users username@hostname 占到所有用户执行该句 sql 百分比及占到所有用户执行的所有 SQL 的百分比.

    • Query abstract 精简后的sql语句



    几个常用OPTION, 其他可查看官网文档

    • --log-type=TYPE LOGS or -lt TYPE LOGS TYPE LOGS 可为 slow, general, binary, msl or udl. 官方文档说是没有指定时, 会根据给定的日志文件自动检测, 但测试时失败, so, 最好指定该参数.
      msl 是指 microslow patched 的慢日志.
      udl 用户自定义的日志.
      binary 因为 mysqlsla 不能直接解析 MySQL 的 binary log, 所以需先用 mysqlbinlog命令将其解析为文本,. mysqlbinlog 带有 --short-form参数时, 则 LOG TYPE 需指定为 udl. 命令可类似于如下:
      [bash]
      mysqlbinlog /usr/local/mysql/var/mysql-bin.000001 | mysqlsla -lt binary -
      mysqlbinlog --short-form /usr/local/mysql/var/mysql-bin.000001 | mysqlsla -lt udl -
      [/bash]

    • --explain or -ex explain 每句 SQL, 默认没有启用

    • --databases=dbname1,dbnam2[,...] or -db dbname1,dbnam2[,...] or -D dbname1,dbnam2[,...]用于 --explain

    • --flush-qc 强制刷新查询缓存, 默认没有启用

    • --grep="PATTERN" 只解析满足条件的 SQL

    • --meta-filter="CONDTIONS" or -mf "CONDTIONS" CONDITIONS 格式为[meta][op][value],多个条件时, 中间以,分割.
      [meta] 查看这里
      [op] >, < or =. 當 [meta] 是基於字符串時 , [op] 只能是 =.
      [value] 數字 or 字符串.

    • --reports=REPORTS or -R REPORTS, 默認是 standard, REPORTS 可以是以,為分割的列表. 可選選項:standard, time-all, print-unique, print-all, dump




    NOTE


    • MySQL 5.1.21 及以后版本可通过 set [session|global] long_query_time=0.01 等来设置记录执行时间超过 0.01秒 以上的 sql 语句.v5.1.21 之前的版本最小值只能到达 1s, 这时候可用 microslow patch(msl patch ) 补丁来完成这一工作.

1 条评论: