zoukankan      html  css  js  c++  java
  • mysql慢查询日志总结

    查看慢查询是否开启:

    mysql>show variables like '%slow_query_log%';

    Variable_name       Value

    slow_query_log       on

    slow_query_log_file  日志路径

    显示为on,已开启,并且下面写出了日志文件的路径。
    直接cat对应文件即可查看mysql慢查询日志或者通过以下命令查询

    tail -f 实际日志路径

    慢查询主要体现在慢上,通常意义上来讲,只要返回时间大于 >1 sec上的查询都可以称为慢查询。慢查询会导致CPU,内存消耗过高。数据库服务器压力陡然过大,那么大部分情况来讲,肯定是由某些慢查询导致的。

    查看慢查询设置时间,默认是10秒,可以设置

    mysql>show variables like '%long_query_time%';

    Variable_name       Value

    long_query_time     1.000000

    查看慢查询日志中多少sql超过1秒

    mysql>SHOW GLOBAL STATUS LIKE '%Slow_queries%'; 

    Variable_name       Value

    Slow_queries         21640

    如何开启慢查询功能
    方法一:在服务器上找到mysql的配置文件my.cnf , 然后在[mysqld]里追加一下内容,这样会一直生效,需要重启mysql服务。

    vim my.cnf
    [mysqld]
    slow_query_log = ON
    #定义慢查询日志的路径
    slow_query_log_file = 以实际日志路径为准
    #定义查过多少秒的查询算是慢查询,这里定义的是1秒,5.6版本之后允许设置少于1秒,例如0.1秒
    long_query_time = 1
    #用来设置是否记录没有使用索引的查询到慢查询记录,默认关闭,看需求开启,会产生很多日志,可动态修改
    #log-queries-not-using-indexes
    管理指令也会被记录到慢查询。比如OPTIMEZE TABLE, ALTER TABLE,默认关闭,看需求开启,会产生很多日志,可动态修改
    #log-slow-admin-statements

    方法二:动态设置,不需要重启mysql,不过重启后会失效

    #开启慢查询功能,1是开启,0是关闭
    mysql> set global slow_query_log=1;
    #定义查过多少秒的查询算是慢查询,这里定义的是1秒,5.6版本之后允许设置少于1秒,例如0.1秒
    mysql> set global long_query_time=1;
    #定义慢查询日志的路径
    mysql> set global slow_query_log_file='日志文件路径';
    #关闭功能:
    set global slow_query_log=0;
    #设置慢查询记录到表中
    set global log_output='TABLE';

    慢查询日志记录内容定义,通过命令查看:tail -f 日志文件路径

    # Time: 110107 16:22:11
    # User@Host: root[root] @ localhost []
    # Query_time: 9.869362 Lock_time: 0.000035 Rows_sent: 1 Rows_examined: 6261774
    SET timestamp=1294388531;
    select count(*) from user;

    第一行:SQL查询执行的时间

    第二行:执行SQL查询的连接信息,用户和连接IP

    第三行:记录了一些比较有用的信息,如下解析:
    - Query_time,这条SQL执行的时间,越长则越慢
    - Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
    - Rows_sent,查询返回的行数
    - Rows_examined,查询检查的行数,越长就越费时间
    第四行:设置时间戳,没有实际意义,只是和第一行对应执行时间。
    第五行及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长

    慢查询日志记录分析方法

    日志记录可能有很多条,需要做统计分析。

    方法一:使用mysql程序自带的mysqldumpslow命令分析

    例如:mysqldumpslow -s c -t 10 日志文件路径

    这会输出记录次数最多的10条SQL语句,得出的结果和上面一般慢查询记录的格式没什么区别。

    参数解析:
    -s:是表示按照何种方式排序,子参数如下:
        c、t、l、r:分别是按照记录次数、时间、查询时间、返回的记录数来排序,
        ac、at、al、ar:表示相应的倒叙;
    -t:返回前面多少条的数据,这里意思就是返回10条数据了(也可以说是前十)
    -g:后边可以写一个正则匹配模式,大小写不敏感的,比如:
        /path/mysqldumpslow -s r -t 10 日志文件路径,得到返回记录集最多的10个查询。
        /path/mysqldumpslow -s t -t 10 -g "left join" 日志文件路径,得到按照时间排序的前10条里面含有左连接的查询语句。

    方法二:使用pt(Percona Toolkit)工具的pt-query-digest进行统计分析。
    这个是由Percona公司出品的一个用perl编写的脚本,只有安装上pt工具集才会存在,有兴趣的朋友就要先安装pt工具了。直接分析慢查询文件,执行如下:

    pt-query-digest 日志文件路径 >t.txt

    因为记录里还是可能有很多sql在,看起来还是费劲,所以建议输出到文件来看。

    额外说明:

    1、个别情况下,mysql慢查询记录可能达不到目的。

    那是因为mysql的慢查询记录机制导致,因为mysql只是把在引擎阶段的慢查询记录到慢日志,其他例如网络延迟(如:跨机房),IO传输延时(如:读写频繁),客户端延迟(如:jdbc高负载),还有个别内部资源锁等待,可能导致增加的查询延时,但又不一定记录在慢日志的。

    所以很可能就出现一种诡异的情况,明明查询确实很慢,但是mysql的慢日志就是没有记录下来。这个时候就要我们的思路更广阔一些了。

    2、如果慢查询日志还是解决不了问题的话,就建议开查询日志general-log来跟踪sql了。
    大体和上面操作差不多,先查看当前状态
    show variables like 'general%';
    可以在my.cnf里添加
    general-log = 1开启(0关闭)
    log = /log/mysql_query.log路径
    也可以设置变量那样更改
    set global general_log=1开启(0关闭)

    参考资料:https://blog.csdn.net/Mr_lisj/article/details/93867681

  • 相关阅读:
    LeetCode Count of Range Sum
    LeetCode 158. Read N Characters Given Read4 II
    LeetCode 157. Read N Characters Given Read4
    LeetCode 317. Shortest Distance from All Buildings
    LeetCode Smallest Rectangle Enclosing Black Pixels
    LeetCode 315. Count of Smaller Numbers After Self
    LeetCode 332. Reconstruct Itinerary
    LeetCode 310. Minimum Height Trees
    LeetCode 163. Missing Ranges
    LeetCode Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/lirun/p/14954638.html
Copyright © 2011-2022 走看看