`
Donald_Draper
  • 浏览: 950972 次
社区版块
存档分类
最新评论

MySQL慢日志

阅读更多
The Slow Query Log:https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
Selecting General Query and Slow Query Log Output Destinations:https://dev.mysql.com/doc/refman/5.7/en/log-destinations.html
MySQL慢查询日志总结:http://www.cnblogs.com/kerrycode/p/5593204.html
MYSQL开启慢查询日志实施:http://www.cnblogs.com/wangtao_20/archive/2013/09/06/3304645.html
引言:
    慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值long_query_time的SQL语句,SQL执行时间超过long_query_timeL,则将记录到慢查询日志中。long_query_time的默认值为10,意思是执行时间10s以上的语句,将会被记录慢查询日志中。long_query_time精确到毫秒,即可配置1.005,这种形式的阀值。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数或通过配置文件(my.cnf),当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。就启动慢查询日志的方法而言,建议用手动来设置,不建议用配置文件,手动设置的话,不用重启就能起效,而配置文件方式需要重启,同时我们一般会在开发环境中,来调优,到正式就不用了,所以我们用手动设置方法。慢查询日志支持将日志记录写入文件(FILE),也支持将日志记录写入数据库表(TABLE)。
今天我们就来看手动方式启动慢查询日志功能:
查看慢查询日志是否开启
mysql> show variables like '%slow_query%';
    -> ;
+---------------------------+---------------------------------+
| Variable_name             | Value                           |
+---------------------------+---------------------------------+
| slow_query_log            | OFF                             |
| slow_query_log_file       | /mysqldata/Donald_Draper-slow.log |
+---------------------------+---------------------------------+
2 rows in set


slow_query_log控制慢查询日志,slow_query_log_file为慢查询日志文件,一般为hostname-slow.log,主要这个文件mysql必须有权限读写。

开启慢查询日志功能

mysql> set global slow_query_log = 1;
Query OK, 0 rows affected

mysql> show variables like '%slow_query%';
+---------------------+---------------------------------+
| Variable_name       | Value                           |
+---------------------+---------------------------------+
| slow_query_log      | ON                              |
| slow_query_log_file | /mysqldata/Donald_Draper-slow.log |
+---------------------+---------------------------------+
2 rows in set

已开启

再来查看慢查询响应时间阀值long_query_time
mysql> show variables like '%query_time%';
+------------------------------+---------------------------------+
| Variable_name                | Value                           |
+------------------------------+---------------------------------+
| long_query_time              | 10.000000                       |
+------------------------------+---------------------------------+
1 rows in set

long_query_time的默认值为10,意思是执行时间10s以上的语句,将会被记录慢查询日志中。
long_query_time精确到毫秒,即可配置1.005,这种形式的阀值。

修改慢查询响应时间阀值long_query_time为1秒
mysql> set global  long_query_time = 1;
Query OK, 0 rows affected

mysql> show variables like '%query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set


查看修改后响应时间阀值long_query_time,
注意:这个时候不能在用上面的命令show variables like '%query_time%',这个命令执行后还是原来的值,这个可能是mysql使用的缓存,我们用show global variables like '%query_time%'命令来查看

mysql> show global variables like '%query_time%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set

mysql> 


来看慢查询日志默认输出的格式:


mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set

mysql> 

log_output有两种方式,一种为FILE,及记录中日志中,一种为TABLE,将慢日志记录在
mysql.slow_log表中。

先来看第一种方式:
执行查询,查看慢查询日志文件:
Donald_Draper:~ #tail -f Donald_Draper-slow.log 
# Time: 170518 14:29:14
# User@Host: donald[123456] @  [192.168.31.153]  Id:    16
# Query_time: 0.009314  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
use test;
SET timestamp=1495088954;
# administrator command: Init DB;
# Time: 170518 14:29:15
# User@Host: donald[123456] @  [192.168.31.153]  Id:    16
# Query_time: 0.665908  Lock_time: 0.000156 Rows_sent: 69  Rows_examined: 69
SET timestamp=1495088955;
SHOW FULL TABLES WHERE Table_type != 'VIEW';
# Time: 170518 14:29:28
# User@Host: donald[123456] @  [192.168.31.153]  Id:    17
# Query_time: 0.033067  Lock_time: 0.000183 Rows_sent: 1  Rows_examined: 1
SET timestamp=1495088968;
SHOW TABLE STATUS LIKE 'message_info';
# User@Host: donald[123456] @  [192.168.31.153]  Id:    17
# Query_time: 0.048564  Lock_time: 0.000116 Rows_sent: 1000  Rows_examined: 1000
SET timestamp=1495088968;
SELECT * FROM `message_info` LIMIT 0, 1000;
# Time: 170518 14:32:28
# User@Host: donald[123456] @  [192.168.31.153]  Id:    10
# Query_time: 106.102272  Lock_time: 0.000191 Rows_sent: 1  Rows_examined: 8494928
SET timestamp=1495089148;
select count(*) from message_info;


我们取一条来看
# Time: 170518 14:32:28 发生时间
# User@Host: donald[123456] @  [192.168.31.153]  Id:    10  访问信息
# 查询时间              锁住时间           
# Query_time: 106.102272  Lock_time: 0.000191 Rows_sent: 1  Rows_examined: 8494928
SET timestamp=1495089148;
#执行慢查询语句
select count(*) from message_info;


再来看第二种慢日志输出方式-TABLE:

修改慢日志输出方式log_output为TABLE
mysql> set global  log_output = 'TABLE';
Query OK, 0 rows affected

mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | TABLE |
+---------------+-------+
1 row in set

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 |
+---------------------+-----------------------------------+------------+-----------+-----------+---------------+------------------+----------------+-----------+-----------+------------------------------------------+-----------+
| 2017-05-18 14:42:01 | donald[123456] @  [192.168.31.153] | 00:00:00   | 00:00:00  |        12 |            12 | mysql            |              0 |         0 |         1 | SHOW COLUMNS FROM `mysql`.`slow_log`     |        19 |
| 2017-05-18 14:42:30 | donald[123456] @  [192.168.31.153] | 00:00:37   | 00:00:00  |         1 |       1260746 | test |              0 |         0 |         1 | select count(*) from company_info |        10 |
| 2017-05-18 14:42:45 | donald[123456] @  [192.168.31.153] | 00:00:00   | 00:00:00  |         2 |             2 | mysql            |              0 |         0 |         1 | SELECT * FROM `slow_log` LIMIT 0, 1000   |        19 |
+---------------------+-----------------------------------+------------+-----------+-----------+---------------+------------------+----------------+-----------+-----------+------------------------------------------+-----------+
3 rows in set

mysql> 


我们也可以配置log_queries参数来设置将没有使用索引的语句记录在
慢日志中

查看log_queries_not_using_indexes

mysql> show variables like '%log_queries%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF   |
+-------------------------------+-------+
1 row in set


开启记录没有使用索引的语句功能

mysql>  set global log_queries_not_using_indexes = 1;
Query OK, 0 rows affected

mysql> show variables like '%log_queries%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON    |
+-------------------------------+-------+
1 row in set


在开启记录没有使用索引的语句功能情况下,我们可以通过log_throttle_queries_not_using_indexes
控制每秒中允许记录没有使用索引的语句数量,默认为0,即不限制,如果不限制的情况,太多这样的日志产生将会影响mysql的性能。

mysql> show variables like '%log_throttle%';
+----------------------------------------+-------+
| Variable_name                          | Value |
+----------------------------------------+-------+
| log_throttle_queries_not_using_indexes | 0     |
+----------------------------------------+-------+
1 row in set


直接通过慢日志文件和慢日志表的方式还不能清晰便捷的分析慢查询语句的具体慢的原因,我们可以通过MySQL提供的慢日志分析工具mysqldumpslow来分析慢日志文件。

Donald_Draper:~ # 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  只显示最前面n个慢查询
  -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

实例:查询语句的排序方式为,平均查询时间,平均锁住时间,查询时间,锁住时间
Donald_Draper:~ # mysqldumpslow -s at al t l c -t 6 /mysqldata/Donald_Draper-slow.log 

Reading mysql slow query log from al t l c /mysqldata/Donald_Draper-slow.log
Count: 1  Time=173.86s (173s)  Lock=0.00s (0s)  Rows=1.0 (1), donald[123456]@[192.168.31.153]
  select count(*) from message_info

Count: 1  Time=106.10s (106s)  Lock=0.00s (0s)  Rows=1.0 (1), donald[123456]@[192.168.31.153]
  select count(*) from company_info

Count: 1  Time=0.67s (0s)  Lock=0.00s (0s)  Rows=69.0 (69), donald[123456]@[192.168.31.153]
  SHOW FULL TABLES WHERE Table_type != 'S'

Count: 1  Time=0.05s (0s)  Lock=0.00s (0s)  Rows=1000.0 (1000), donald[123456]@[192.168.31.153]
  SELECT * FROM `company_info` LIMIT N, N

Count: 1  Time=0.03s (0s)  Lock=0.00s (0s)  Rows=1.0 (1), donald[123456]@[192.168.31.153]
  SHOW TABLE STATUS LIKE 'S'

Count: 1  Time=0.01s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), donald[123456]@[192.168.31.153]


当输出结果的比较多时,我们可以使用管线,结合more或grep,查找需要的信息:
Donald_Draper:~ # mysqldumpslow -s at al t l c -t 6 /mysqldata/Donald_Draper-slow.log | more/grep


或者用流导向,将排序后的结果导入文件在查看:
Donald_Draper:~ # mysqldumpslow -s at al t l c -t 6 /mysqldata/Donald_Draper-slow.log > mysql-slow-log-sort.txt


     本篇文章中我们手动设置的所有变量的作用域可为全局和会话,并且可以动态生效。我们设置的都是全局的,由于这些都是手动设置,动态生效,数据库重启时,将会失效,如果不想失效可以写在配置文件中。

[mysqld]
slow_query_log = 1
slow_query_log_file = /mysqldata/Donald_Draper-slow.log
long_query_time = 1 
log_output=FILE
log-queries-not-using-indexes = 1
log_throttle_queries_not_using_indexes = 10
0
1
分享到:
评论

相关推荐

    mysql慢日志查询

    mysql慢日志查询,介绍查询mysql中哪些是慢查询的内容

    cpp-Slowquery图形化显示MySQL慢日志工具

    Slowquery图形化显示MySQL慢日志工具

    mysql慢日志分析工具mysqlsla

    内涵 mysqlsla-2.03.tar.tar 包 mysqlsla之linux安装及使用.docx man_mysqlsla.txt

    mysql慢日志导入数据库表中

    mysql的慢sql日志是text形式,查看起来太费劲,写了个shell把这个日志录入表里去,再设定时任务,这样查看起来非常方便,随时掌握mysql的性能,在mysql8环境开发的,其它版本没试过

    MySQL的慢日志线上问题及优化方案

    MySQL 慢日志(slow log)是 MySQL DBA 及其他开发、运维人员需经常关注的一类信息。使用慢日志可找出执行时间较长或未走索引等 SQL 语句,为进行系统调优提供依据。 本文将结合一个线上案例,分析如何正确设置 ...

    利用MYSQLDUMPSLOW进行慢日志分析

    在慢日志文件比较大的时候,用文件查看命令去分析MYSQL慢日志文件,看起来就会比较费劲,也不能快速的统计出需要优化的SQL语句。 使用mysqldumpslow就可以相对快速地进行筛选出需要优化的SQL语句,是手工进行数据库...

    详解mysql慢日志查询

    慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句。例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志中. 慢查询...

    MySQL慢查询日志

    MySQL慢查询日志

    mysql慢查询日志的使用

    mysql慢查询日志的使用

    根据mysql慢日志监控SQL语句执行效率

    根据mysql慢日志监控SQL语句执行效率 启用MySQL的log-slow-queries(慢查询记录)。 在Linux环境下先要找到my.cnf文件(一般在/etc/mysql/),然后可能会发现该文件修改后无法保存,原因是你没有相应的权限,可以从属性...

    五种MySql日志分析工具比拼

    五种MySql日志分析工具比拼,可以帮助你对mysql进行优化,分析

    Mysql慢查询日志查看

    Mysql慢查询日志查看 文档有慢查询详细内容介绍和查看方法 我自己收藏的一个文档 共享了希望对大家有所帮助

    Mysql慢查询日志

    Mysql慢查询日志概念常用参数查询与设定查询慢查询记录数mysqldumpslow工具 概念 Mysql的慢查询是一种日志, 主要用于记录 Mysql中响应时间超过设定的阀值的语句. 常用参数 类型 说明 默认值 slow_query_log ...

    MySQL慢日志实践小结

    主要介绍了MySQL慢日志实践小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    慢日志发送邮件脚本

    慢日志发送邮件脚本 filedir="/data/mysql/tmp/sqlcount.xls" tmpfile="/tmp/sqlcount.xls" #echo '<html><body>;">' > ${tmpfile} echo '<html><body>;font-size:12px;">' > ${tmpfile} echo '...

    lepus(天兔)监控MySQL主从复制延迟,慢查询

    lepus监控完整版,SQL server MYSQL redis 系统资源 oracle

    Mysql慢查询日志_1--如何开启慢查询日志

    Windows下开启MySQL慢查询的方法

    mysql 慢查日志实时解析工具

    我们知道mysql慢日志解析工具有很多种,比如我们常用的mysqldumpslow、pt-query-digest等,这些都是比较有效的解析工具,今天介绍的是基于go写的一款实时解析日志工具

Global site tag (gtag.js) - Google Analytics