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

  • 相关阅读:
    【spring配置】——spring整合Quartz定时器
    Dubbo服务集群,常见容错机制:failover ,failsafe,failfase ,failback,forking
    dubbo 配置文件详解
    Windows 下Nexus搭建Maven私服
    linux下配置java环境
    nexus-2.11.4-01-bundle.tar.gz 下载地址
    XShell 连接 vm虚拟机中的redhat Linux系统
    APIO 2017 游记
    洛谷 P3128 [USACO15DEC]最大流Max Flow
    洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)
  • 原文地址:https://www.cnblogs.com/lirun/p/14954638.html
Copyright © 2011-2022 走看看