宝塔mysql慢⽇志_MySQL慢查询⽇志总结
慢查询⽇志概念
MySQL的慢查询⽇志是MySQL提供的⼀种⽇志记录,它⽤来记录在MySQL中响应时间超过阀值的语句,具体指运⾏时间超过
long_query_time值的SQL,则会被记录到慢查询⽇志中。long_query_time的默认值为10,意思是运⾏10S以上的语句。默认情况
下,Mysql数据库并不启动慢查询⽇志,需要我们⼿动来设置这个参数,当然,如果不是调优需要的话,⼀般不建议启动该参数,因为开启慢查询⽇志会或多或少带来⼀定的性能影响。慢查询⽇志⽀持将⽇志记录写⼊⽂件,也⽀持将⽇志记录写⼊数据库表。
慢查询⽇志相关参数
MySQL 慢查询的相关参数解释:slow_query_log :是否开启慢查询⽇志,1表⽰开启,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重启后则会失效。如果要永久⽣效,就必须修改配置⽂件myf(其它系统变量也是如此)
修改myf⽂件,增加或修改参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器,如下所⽰:
slow_query_log =1slow_query_log_file=/usr/local/mysql/data/localhost-slow.logmysql> 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.00sec)
mysql>
#慢查询的参数slow_query_log_file ,它指定慢查询⽇志⽂件的存放路径,系统默认会给⼀个缺省的⽂
件host_name-slow.log
那么开启了慢查询⽇志后,什么样的SQL才会记录到慢查询⽇志⾥⾯呢? 这个是由参数long_query_time控制,默认情况下
long_query_time的值为10秒,可以使⽤命令修改,也可以在myf参数⾥⾯修改。关于运⾏时间正好等于long_query_time的情况,并不会被记录下来。也就是说,在mysql源码⾥是判断⼤于long_query_time,⽽⾮⼤于等于。从MySQL 5.1开始,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的值还是10,难道没有修改到呢?注意:使⽤命令 set global long_query_time=4修改后,需要重新连接或新开⼀个会话才能看到修改值。你⽤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.00sec)
mysql>mysql> show global variables like 'long_query_time';+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 4.000000 |
+-----------------+----------+
1 row in set (0.00sec)
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>
系统变量log-queries-not-using-indexes:未使⽤索引的查询也被记录到慢查询⽇志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使⽤full index scan的sql也会被记录到慢查询⽇志。
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和ALTER TABLE等记⼊慢查询⽇志mysql> show variables like 'log_slow_admin_statements';+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| log_slow_admin_statements | OFF |
+---------------------------+-------+
1 row in set (0.00sec)
mysql>
另外,如果你想查询有多少条慢查询记录,可以使⽤系统变量。
mysql> show global status like '%slow_queries%';+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 0 |
+---------------+-------+
1 row in set (0.00sec)
mysql>
⽇志分析⼯具mysqldumpslow
在实际⽣产环境中,如果要⼿⼯分析⽇志,查、分析SQL,显然是个体⼒活,MySQL提供了⽇志分析⼯具mysqldumpslow 查看mysqldumpslow的帮助信息:
1 [root@localhost~]# mysqldumpslow --help
2 Usage: mysqldumpslow [ ] [ ]3
4 Parse and summarize the MySQL slow query log. Options are5
6 --verbose verbose
7 --debug debug
8 --help write thistext to standard output9
10 -v verbose11 -d debug12 -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
13 al: average locktime14 ar: average rows sent15 at: average query time16 c: count17 l: locktime18 r: rows sent19 t: query time20 -r reverse the sort order (largest last instead of first)21 -t NUM just show the top n queries22 -a don't abstract all numbers to N and strings to'S'23 -n NUM abstractnumbers with at least n digits within names24 -g PATTERN grep: only consider stmts that include this string
25 -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),26 default is '*', i.e. match all27 -i NAME name of server instance (if usingmysql.server startup script)28 -l don't subtract lock time from total time
mysqldumpslow --help
-s, 是表⽰按照何种⽅式排序
c: 访问计数
l: 锁定时间
r: 返回记录
t: 查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
-t, 是top n的意思,即为返回前⾯多少条的数据;
-g, 后边可以写⼀个正则匹配模式,⼤⼩写不敏感的;
⽐如:mysql下载什么版本的
得到返回记录集最多的10个SQL。
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log
得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log
得到按照时间排序的前10条⾥⾯含有左连接的查询语句。
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。