xml地图|网站地图|网站标签 [设为首页] [加入收藏]

您的位置:亚洲必赢 > 计算机尝试 > MySQL慢查询日志总结

MySQL慢查询日志总结

发布时间:2019-05-24 06:44编辑:计算机尝试浏览(108)

    慢查询日志概念

    MySQL慢查询日志总计,MySQL慢日志总括

    慢查询日志概念

         MySQL的慢查询日志是MySQL提供的1种日志记录,它用来记录在MySQL中一呼百应时间抢先阀值的说话,具体指运维时刻超越long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的暗中认可值为十,意思是运营10S以上的口舌。暗中同意意况下,Mysql数据库并不运行慢查询日志,供给大家手动来设置那些参数,当然,假设不是调优供给的话,一般不建议运转该参数,因为打开慢查询日志会或多或少带来一定的习性影响。慢查询日志帮助将日志记录写入文件,也支撑将日志记录写入数据库表。

     

    官方文书档案,关于慢查询的日志介绍如下(部分材料,具体参照他事他说加以调查官方相关链接):

    The slow query log consists of SQL statements that took more than long_query_time seconds to execute and required at least min_examined_row_limit rows to be examined. The minimum and default values of long_query_time are 0 and 10, respectively. The value can be specified to a resolution of microseconds. For logging to a file, times are written including the microseconds part. For logging to tables, only integer times are written; the microseconds part is ignored.

    By default, administrative statements are not logged, nor are queries that do not use indexes for lookups. This behavior can be changed usinglog_slow_admin_statements and log_queries_not_using_indexes, as described later.

     

    慢查询日志相关参数

    MySQL 慢查询的连锁参数解释:

    slow_query_log    :是或不是展开慢查询日志,1象征开启,0象征关闭。

    log-slow-queries  :旧版(伍.陆之下版本)MySQL数据库慢查询日志存款和储蓄路线。能够不安装该参数,系统则会私下认可给3个缺省的文书host_name-slow.log

    slow-query-log-file:新版(5.陆及以上版本)MySQL数据库慢查询日志存储路线。能够不安装该参数,系统则会暗中同意给三个缺省的公文host_name-slow.log

    long_query_time :慢查询阈值,当查问时间多于设定的阈值时,记录日志。

    log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选用)。

    log_output:日志存储形式。log_output='FILE'代表将日志存入文件,默许值是'FILE'。log_output='TABLE'表示将日志存入数据库,那样日志新闻就能够被写入到mysql.slow_log表中。MySQL数据库协理同时二种日志存款和储蓄格局,配置的时候以逗号隔绝就能够,如:log_output='FILE,TABLE'。日志记录到系统的专项使用日志表中,要比记录到文件开销越来越多的系统财富,因而对于要求启用慢查询日志,又须要能够赢得更加高的体系性情,那么建议事先记录到文件。

     

     

    慢查询日志配置

    暗中认可情状下slow_query_log的值为OFF,表示慢查询日志是禁止使用的,能够通过安装slow_query_log的值来开启,如下所示:

    mysql> show variables  like '%slow_query_log%';
    
     --------------------- ----------------------------------------------- 
    
    | Variable_name       | Value                                         |
    
     --------------------- ----------------------------------------------- 
    
    | slow_query_log      | OFF                                           |
    
    | slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
    
     --------------------- ----------------------------------------------- 
    
    2 rows in set (0.00 sec)
    
     
    
    mysql> set global slow_query_log=1;
    
    Query OK, 0 rows affected (0.09 sec)
    
     
    
    mysql> show variables like '%slow_query_log%';
    
     --------------------- ----------------------------------------------- 
    
    | Variable_name       | Value                                         |
    
     --------------------- ----------------------------------------------- 
    
    | slow_query_log      | ON                                            |
    
    | slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
    
     --------------------- ----------------------------------------------- 
    
    2 rows in set (0.00 sec)
    
     
    
    mysql> 
    

     

    使用set global slow_query_log=1开启了慢查询日志只对方今数据库生效,假使MySQL重启后则会失灵。倘诺要永世生效,就亟须修改配置文件my.cnf(其余系统变量也是这么)。举例如下所示:

    mysql> show variables like 'slow_query%';
    
     --------------------- ----------------------------------------------- 
    
    | Variable_name       | Value                                         |
    
     --------------------- ----------------------------------------------- 
    
    | slow_query_log      | OFF                                           |
    
    | slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
    
     --------------------- ----------------------------------------------- 
    
    2 rows in set (0.01 sec)
    
     
    
    mysql> 
    

     

    修改my.cnf文件,扩大或改变参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器,如下所示

    slow_MySQL慢查询日志总结。query_log =1

    slow_query_log_file=/tmp/mysql_slow.log

    mysql> show variables like 'slow_query%';
    
     --------------------- --------------------- 
    
    | Variable_name       | Value               |
    
     --------------------- --------------------- 
    
    | slow_query_log      | ON                  |
    
    | slow_query_log_file | /tmp/mysql_slow.log |
    
     --------------------- --------------------- 
    
    2 rows in set (0.00 sec)
    
     
    
    mysql> 
    

    至于慢查询的参数slow_query_log_file ,它内定慢查询日志文件的寄放路径,系统私下认可会给贰个缺省的文书host_name-slow.log(假使没有一些名参数slow_query_log_file的话)

    mysql> show variables like 'slow_query_log_file';
    
     --------------------- ----------------------------------------------- 
    
    | Variable_name       | Value                                         |
    
     --------------------- ----------------------------------------------- 
    
    | slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
    
     --------------------- ----------------------------------------------- 
    
    1 row in set (0.00 sec)
    

     

    那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? 这一个是由参数long_query_time调节,暗中同意情状下long_query_time的值为10秒,能够利用命令修改,也得以在my.cnf参数里面修改。关于运维时刻刚刚等于long_query_time的情景,并不会被记录下来。也正是说,在mysql源码里是推断大于long_query_time,而非大于等于。从MySQL 5.一上马,long_query_time开端以阿秒记录SQL语句运转时刻,从前仅用秒为单位记录。假如记录到表里面,只会记录整数部分,不会记录飞秒部分。

    mysql> show variables like 'long_query_time%';
    
     ----------------- ----------- 
    
    | Variable_name   | Value     |
    
     ----------------- ----------- 
    
    | long_query_time | 10.000000 |
    
     ----------------- ----------- 
    
    1 row in set (0.00 sec)
    
     
    
    mysql> set global long_query_time=4;
    
    Query OK, 0 rows affected (0.00 sec)
    
     
    
    mysql> show variables like 'long_query_time';
    
     ----------------- ----------- 
    
    | Variable_name   | Value     |
    
     ----------------- ----------- 
    
    | long_query_time | 10.000000 |
    
     ----------------- ----------- 
    
    1 row in set (0.00 sec)
    

     

    如上所示,小编修改了变量long_query_time,可是查询变量long_query_time的值照旧十,难道未有改动到吗?注意:使用命令 set global long_query_time=四修改后,必要再行连接或新开3个会话本事观看修改值。你用show variables like 'long_query_time'查看是时下对话的变量值,你也得以不用再行连接会话,而是用show global variables like 'long_query_time'; 如下所示:

    在MySQL里面实行上面SQL语句,然后我们去反省对应的慢查询日志,就能够意识周围上面那样的新闻。

    mysql> select sleep(3);
    
     ---------- 
    
    | sleep(3) |
    
     ---------- 
    
    |        0 |
    
     ---------- 
    
    1 row in set (3.00 sec)
    
     
    
    [[email protected] ~]# more /tmp/mysql_slow.log
    
    /usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:
    
    Tcp port: 0  Unix socket: (null)
    
    Time                 Id Command    Argument
    
    /usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:
    
    Tcp port: 0  Unix socket: (null)
    
    Time                 Id Command    Argument
    
    # Time: 160616 17:24:35
    
    # User@Host: root[root] @ localhost []  Id:     5
    
    # Query_time: 3.002615  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
    
    SET timestamp=1466069075;
    
    select sleep(3);
    

     

    log_output 参数是点名日志的囤积形式。log_output='FILE'代表将日志存入文件,暗中同意值是'FILE'。log_output='TABLE'表示将日志存入数据库,那样日志音讯就能够被写入到mysql.slow_log表中。MySQL数据库支持同时二种日志存款和储蓄格局,配置的时候以逗号隔开分离就能够,如:log_output='FILE,TABLE'。日志记录到系统的专项使用日志表中,要比记录到文件成本越来越多的系统财富,由此对于必要启用慢查询日志,又须要可以取得更高的种类特性,那么建议事先记录到文件。

    mysql> show variables like '%log_output%';
    
     --------------- ------- 
    
    | Variable_name | Value |
    
     --------------- ------- 
    
    | log_output    | FILE  |
    
     --------------- ------- 
    
    1 row in set (0.00 sec)
    
     
    
    mysql> set global log_output='TABLE';
    
    Query OK, 0 rows affected (0.00 sec)
    
     
    
    mysql> show variables like '%log_output%';
    
     --------------- ------- 
    
    | Variable_name | Value |
    
     --------------- ------- 
    
    | log_output    | TABLE |
    
     --------------- ------- 
    
    1 row in set (0.00 sec)
    
     
    
    mysql> select sleep(5) ;
    
     ---------- 
    
    | sleep(5) |
    
     ---------- 
    
    |        0 |
    
     ---------- 
    
    1 row in set (5.00 sec)
    
     
    
    mysql> 
    
     
    
    mysql> select * from mysql.slow_log;
    
     --------------------- --------------------------- ------------ ----------- ----------- --------------- ---- ---------------- ----------- ----------- ----------------- ----------- 
    
    | start_time          | user_host                 | query_time | lock_time | rows_sent | rows_examined | db | last_insert_id | insert_id | server_id | sql_text        | thread_id |
    
     --------------------- --------------------------- ------------ ----------- ----------- --------------- ---- ---------------- ----------- ----------- ----------------- ----------- 
    
    | 2016-06-16 17:37:53 | root[root] @ localhost [] | 00:00:03   | 00:00:00  |         1 |             0 |    |              0 |         0 |         1 | select sleep(3) |         5 |
    
    | 2016-06-16 21:45:23 | root[root] @ localhost [] | 00:00:05   | 00:00:00  |         1 |             0 |    |              0 |         0 |         1 | select sleep(5) |         2 |
    
     --------------------- --------------------------- ------------ ----------- ----------- --------------- ---- ---------------- ----------- ----------- ----------------- ----------- 
    
    2 rows in set (0.00 sec)
    
     
    
    mysql> 
    

     

    系统变量log-queries-not-using-indexes:未使用索引的查询也被记录到慢查询日志中(可选择)。假如调优的话,提议拉开那么些选项。别的,开启了这一个参数,其实采用full index scan的sql也会被记录到慢查询日志。

    This option does not necessarily mean that no index is used. For example, a query that uses a full index scan uses an index but would be logged because the index would not limit the number of rows.

    mysql> show variables like 'log_queries_not_using_indexes';
    
     ------------------------------- ------- 
    
    | Variable_name                 | Value |
    
     ------------------------------- ------- 
    
    | log_queries_not_using_indexes | OFF   |
    
     ------------------------------- ------- 
    
    1 row in set (0.00 sec)
    
     
    
    mysql> set global log_queries_not_using_indexes=1;
    
    Query OK, 0 rows affected (0.00 sec)
    
     
    
    mysql> show variables like 'log_queries_not_using_indexes';
    
     ------------------------------- ------- 
    
    | Variable_name                 | Value |
    
     ------------------------------- ------- 
    
    | log_queries_not_using_indexes | ON    |
    
     ------------------------------- ------- 
    
    1 row in set (0.00 sec)
    
     
    
    mysql> 
    

    系统变量log_slow_admin_statements表示是还是不是将慢管理语句比方ANALYZE TABLE和ALTE大切诺基 TABLE等记入慢查询日志

    mysql> show variables like 'log_slow_admin_statements';
    
     --------------------------- ------- 
    
    | Variable_name             | Value |
    
     --------------------------- ------- 
    
    | log_slow_admin_statements | OFF   |
    
     --------------------------- ------- 
    
    1 row in set (0.00 sec)
    
     
    
    mysql> 
    

     

    系统变量log_slow_slave_statements 表示

    By default, a replication slave does not write replicated queries to the slow query log. To change this, use thelog_slow_slave_statements system variable.

    When the slow query log is enabled, this variable enables logging for queries that have taken more than long_query_time seconds to execute on the slave. This variable was added in MySQL 5.7.1. Setting this variable has no immediate effect. The state of the variable applies on all subsequent START SLAVE statements.

     

    参数--log-short-format

    The server writes less information to the slow query log if you use the --log-short-format option.

    Command-Line Format --log-short-format
    Permitted Values Type boolean
    Default FALSE

     

    其余,若是您想询问有微微条慢查询记录,能够利用系统变量。

    mysql> show global status like '%Slow_queries%';
    
     --------------- ------- 
    
    | Variable_name | Value |
    
     --------------- ------- 
    
    | Slow_queries  | 2104  |
    
     --------------- ------- 
    
    1 row in set (0.00 sec)
    
     
    
    mysql> 
    

     

    日志分析工具mysqldumpslow

    在生养条件中,若是要手工业剖析日志,查找、深入分析SQL,明显是个体力活,MySQL提供了日记深入分析工具mysqldumpslow

    翻看mysqldumpslow的增派新闻:

    [[email protected] ~]# 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: 访问计数
    l: 锁定时间
    r: 返回记录
    t: 查询时间
    al:平均锁定时间
    ar:平均返回记录数
    at:平均查询时间
    

    -t, 是top n的乐趣,即为重临后面多少条的数目;

    -g, 前边能够写三个正则匹配格局,大小写不灵活的;

    比如

    赢得再次回到记录集最多的十一个SQL。

    mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

    收获访问次数最多的13个SQL

    mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

    获得遵照时间排序的前十条里面包括左连接的询问语句。

    mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

    别的提议在使用那个命令时组合 | 和more 使用 ,不然有十分的大几率出现刷屏的事态。

    mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more

     

    参考资料:

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的1种日志记录,它用来记录在MySQL中1呼百应时间超过阀值...

          MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中1呼百应时间超过阀值的说话,具体指运转时刻超越long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的暗中同意值为十,意思是运营拾S以上的口舌。默许景况下,Mysql数据库并不运维慢查询日志,需求大家手动来设置这几个参数,当然,借使不是调优须求的话,一般不建议运营该参数,因为打开慢查询日志会或多或少带来一定的质量影响。慢查询日志援助将日志记录写入文件,也支撑将日志记录写入数据库表。

    慢查询日志相关参数

    MySQL 慢查询的有关参数解释:slow_query_log :是或不是开启慢查询日志,一意味开启,0意味关闭。

    slow_query_log    :是否开启慢查询日志,1表示开启,0表示关闭。
    log-slow-queries  :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
    slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
    long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。
    log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。
    log_output:日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据
    库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需
    要能够获得更高的系统性能,那么建议优先记录到文件。
    

    慢查询日志配置

    暗许情状下slow_query_log的值为OFF,表示慢查询日志是禁止使用的,能够由此设置slow_query_log的值来拉开,如下所示:

    mysql> show variables like '%slow_query_log%';
     --------------------- ------------------------------------------ 
    | Variable_name       | Value                                    |
     --------------------- ------------------------------------------ 
    | slow_query_log      | OFF                                      |
    | slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
     --------------------- ------------------------------------------ 
    2 rows in set (0.00 sec)
    
    mysql> set global slow_query_log=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show variables like '%slow_query_log%';
     --------------------- ------------------------------------------ 
    | Variable_name       | Value                                    |
     --------------------- ------------------------------------------ 
    | slow_query_log      | ON                                       |
    | slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
     --------------------- ------------------------------------------ 
    2 rows in set (0.00 sec)
    #使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)
    

    修改my.cnf文件,扩大或改换参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器,如下所示:

    slow_query_log =1
    slow_query_log_file=/usr/local/mysql/data/localhost-slow.log
    
    mysql> show variables like 'slow_query%';
     --------------------- --------------------- 
    | Variable_name       | Value               |
     --------------------- --------------------- 
    | slow_query_log      | ON                  |
    | slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
     --------------------- --------------------- 
    2 rows in set (0.00 sec)
    
    mysql> 
    #慢查询的参数slow_query_log_file ,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件host_name-slow.log
    

          那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? 这么些是由参数long_query_time调节,暗中认可景况下long_query_time的值为10秒,能够应用命令修改,也能够在my.cnf参数里面修改。关于运行时刻刚刚等于long_query_time的情形,并不会被记录下来。也正是说,在mysql源码里是剖断大于long_query_time,而非大于等于。从MySQL 5.壹上马,long_query_time伊始以微秒记录SQL语句运维时刻,以前仅用秒为单位记录。借使记录到表里面,只会记录整数部分,不会记录阿秒部分。

    mysql> show variables like 'long_query_time';
     ----------------- ----------- 
    | Variable_name   | Value     |
     ----------------- ----------- 
    | long_query_time | 10.000000 |
     ----------------- ----------- 
    1 row in set (0.00 sec)
    
    mysql> 
    mysql> set global long_query_time=4;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show variables like 'long_query_time';
     ----------------- ----------- 
    | Variable_name   | Value     |
     ----------------- ----------- 
    | long_query_time | 10.000000 |
     ----------------- ----------- 
    1 row in set (0.00 sec)
    
    mysql> 
    

         如上所示,小编修改了变量long_query_time,可是查询变量long_query_time的值照旧⑩,难道未有改造到吗?注意:使用命令 set global long_query_time=四修改后,供给再行连接或新开二个会话手艺来看修改值。你用show variables like 'long_query_time'查看是这段时间对话的变量值,你也得以毫无再行连接会话,而是用show global variables like 'long_query_time'; 如下所示:  

    mysql> show variables like 'long_query_time';
     ----------------- ----------- 
    | Variable_name   | Value     |
     ----------------- ----------- 
    | long_query_time | 10.000000 |
     ----------------- ----------- 
    1 row in set (0.00 sec)
    
    mysql> 
    mysql> show global variables like 'long_query_time';
     ----------------- ---------- 
    | Variable_name   | Value    |
     ----------------- ---------- 
    | long_query_time | 4.000000 |
     ----------------- ---------- 
    1 row in set (0.00 sec)
    
    mysql> 
    

    log_output 参数是点名日志的蕴藏情势。log_output='FILE'表示将日志存入文件,暗中认可值是'FILE'。log_output='TABLE'表示将日志存入数据库,那样日志音信就能够被写入到mysql.slow_log表中。MySQL数据库援助相同的时候二种日志存储情势,配置的时候以逗号隔断就可以,如:log_output='FILE,TABLE'。日志记录到系统的专项使用日志表中,要比记录到文件花费越来越多的系统财富,由此对此急需启用慢查询日志,又须要能够赢得更加高的系统天性,那么提出优先记录到文件.

    mysql> show variables like '%log_output%';
     --------------- ------- 
    | Variable_name | Value |
     --------------- ------- 
    | log_output    | TABLE |
     --------------- ------- 
    1 row in set (0.00 sec)
    
    mysql> 
    

    本文由亚洲必赢发布于计算机尝试,转载请注明出处:MySQL慢查询日志总结

    关键词: 必赢棋牌

上一篇:细细探究MySQL

下一篇:没有了