zoukankan      html  css  js  c++  java
  • MySQL慢查询开启、日志分析(转)

    说明

    • Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应时间超过阈值的语句
    • 具体指运行时间超过long_query_time值得SQL,则会被记录到慢查询日志中。long_query_time的默认为10,意识是运行10秒以上的语句。
    • 由它来看那些SQL语句超出了我们的最大忍耐值,比如一条SQL执行超过了5秒,我们就算慢查询,我们就可以结合Explain进行分析。

    查看是否开启及如何开启

    默认Mysql没有开启慢查询,需要我们说动设置这个参数。当然,如果不是调优需要的话,一般不建议开启该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志写入文件。

    进入mysql终端查看是否开启(我这里都是自己改过的)

    mysql> show variables like '%slow_query_log%';
    +---------------------+----------------------------+
    | Variable_name       | Value                      |
    +---------------------+----------------------------+
    | slow_query_log      | ON                         |
    | slow_query_log_file | /data/mysql/mysql-slow.log |
    +---------------------+----------------------------+

    上面查询结果第一行,这里是开启的,第二行是默认查询路径文件名。

    mysql> set global slow_query_log = 0|1; //设置开启或者关闭,0为关闭,1为开启

    如果使用set global slow_query_log 命令开启慢查询日志,只对当前数据库生效,如果Mysql重启后则会失效。

    补充:如果通过终端命令设定的话,再查询是看不到修改结果的,需要新开启一个窗口查看即可。

    如果要永久生效,必须修改my.cnf配置文件(其他系统变量也是如此),

    修改my.cnf文件,[mysqld]下增加和修改参数slow_query_log和slow_query_log_file后,然后重启MySQL服务器,也即将如下两行配置进my.cnf文件
    slow_query_log = 1

    slow_query_log_file = /data/mysql/mysql-slow.log

    [mysqld]
    slow_query_log = 1
    long_query_time = 1
    slow_query_log_file = /data/mysql/mysql-slow.log

    关于慢查询的参数slow_query_log_file,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的host_name_show.log(如果没有指定参数slow_query_log_file的话)。

    那么开启了慢日志后,怎么样的SQL才会记录到慢查询当中呢?

    • 这个是由参数long_query_time控制,默认情况下long_query_time的值是10秒。
    • 命令SHOW VARIABLES LIKE 'long_query_time';
    mysql> show variables like 'long_query_time';
    +-----------------+----------+
    | Variable_name   | Value    |
    +-----------------+----------+
    | long_query_time | 10.00000 |
    +-----------------+----------+

    可以使用命令修改,也可以在my.cnf参数里面修改,修改完记得习惯性重启服务。还是那句话,不建议生产环境开启。

    mysql> show variables like 'long_query_time';
    +-----------------+----------+
    | Variable_name   | Value    |
    +-----------------+----------+
    | long_query_time | 1.000000 |
    +-----------------+----------+

    假如SQL运行时间刚好等于long_query_time的情况,并不会被记录下来,也就是说,在Mysql源码里是判断大于long_query_time,而非大于等于。

    Case

    • 查看当前多少秒算慢:SHOW VARIABLES LIKE 'long_query_time%';
    • 设置慢的阙值时间:set global long_query_tim
    • 为什么设置后看不出变化:
    1. 需要重新连接或新开一个回话才能看到修改值; SHOW VARIABLES LIKE 'long_query_time%';
    2. SHOW GLOBAL VARIABLES LIKE 'long_query_time%';

    • 记录慢SQL并后续分析:select sleep(4);

    查看慢查询日志文件

    # cat /data/mysql/mysql-slow.log 
    # 
    # select sleep(5);
    # Time: 2018-01-20T18:10:24.443517Z
    # User@Host: root[root] @ localhost [] Id: 3
    # Query_time: 5.000564 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
    use test_db;   #使用的数据库
    SET timestamp=1524276624;  #时间戳
    select sleep(5); #问题SQL

    以上信息包括实际查询时间5.000564秒,时间戳timestamp=1524276624,还有库test_db,出问题的SQL。

    • 查看当前系统中多少条满记录:show global status like '%Slow_queries%';
    mysql> show global status like '%Slow_queries%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Slow_queries  | 1     |
    +---------------+-------+
    1 row in set (0.03 sec)

    可以作为系统健康检查度来查询。(什么意思:如果系统里面充满了大量的慢SQL,都超过阙值,这时系统就需要及时优化)

    配置版

    show_query_log = 1;
    show_query_log_file=/var/lib/mysql/mysql_slow.log
    log_query_time=3;
    log_output=FILE

    mysqldumpslow用法讲解

    • 在生产环境中,如果要手动分析日志,查找、分析SQL,显然是一个体力活,MySQL提供了日志分析工具mysqldumpslow。

    上面测试的慢查询SQL只有一条,假如在实际的生产环境中,慢查询SQL远远高于测试的数量,十几条甚至几十条,假如几条慢查询出现的频率很高,我们能做到根据轻重优先级来分析并排除那是不是更好?那么就用到了mysqldumpslow

    [root@lig mysql]# mysqldumpslow --help   ----------------------------------------------------//执行命令
    Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
    
    Parse and summarize the MySQL slow query log. Options are
    
      --verbose    verbose
      --debug      debug
      --help       write this text to standard output
    
      -v           verbose
      -d           debug
      -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                    al: average lock time
                    ar: average rows sent
                    at: average query time
                     c: count
                     l: lock time
                     r: rows sent
                     t: query time  
      -r           reverse the sort order (largest last instead of first)
      -t NUM       just show the top n queries
      -a           don't abstract all numbers to N and strings to 'S'
      -n NUM       abstract numbers with at least n digits within names
      -g PATTERN   grep: only consider stmts that include this string
      -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
                   default is '*', i.e. match all
      -i NAME      name of server instance (if using mysql.server startup script)
      -l           don't subtract lock time from total time

    s:是表示按照何种方式排序

    c:访问次数

    i:锁定时间

    r:返回记录

    t:查询时间

    al:平均锁定时间

    ar:平均返回记录数

    at:平均查询时间

    t:即为返回前面多少条数据

    g:后边搭配一个正则匹配模式,大小写不敏感

    mysqldumpslow -s r -t 10 /data/mysql/mysql-slow.log  //得到返回记录集最多的10个SQL
    mysqldumpslow -s c -t 10 /data/mysql/mysql-slow.log //得到访问次数最多的10个SQL 
    mysqldumpslow -s t -t 10 -g "left join" /data/mysql/mysql-slow.log  //得到按照时间排序的前10条里面含有做了连接的查询SQL
    mysqldumpslow -s r -t 10 /data/mysql/mysql-slow.log | more  //另外建议在使用这些命令时结合|
  • 相关阅读:
    如何在 Linux 上用 IP转发使内部网络连接到互联网
    python 基础-文件读写'r' 和 'rb'区别
    处理HTTP状态码
    国内可用免费语料库(已经整理过,凡没有标注不可用的链接均可用)
    java读取大文件
    struts.properties的参数描述
    ResourceBundle使用
    linux定时任务的设置
    杂记
    JAVA动态加载JAR包的实现
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/13234476.html
Copyright © 2011-2022 走看看