mysql查看实时语句和慢sql

查看实时语句

Mysql除了手动执行的语句,还有很多在后台由其他模块执行的语句,按理来说,那些由其他模块执行的语句是不能实时查看的,因为这个资源消耗特别的大,但是当我们实在需要查看实时sql语句的时候也不是做不到,需要手动开启一个日志开关general_log

首先登陆mysql,然后执行show variables like "general_log%";,看一下反馈的结果,如下:

1
2
3
4
5
6
7
8
mysql> show variables like "general_log%";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| general_log | OFF |
| general_log_file | |
+------------------+-------+
2 rows in set (0.04 sec)

发现这个Value是off,那么就说明实时记录general_log没有开启,如果我们要开启它很简单,如下:

1
2
3
mysql> set global log_output = file;
mysql> set global general_log = 'ON';
mysql> set global general_log_file = '/tmp/mysql/general_log.log';

可见我们不仅打开了general_log的开关,而且设置日志输出方式为文件(如果设置log_output=table的话,则日志结果会记录到名为gengera_log的表中,这表的默认引擎都是CSV)。同时规定它的保存位置是/tmp/mysql/general_log.log

但是这个是临时方法,如果mysql重启了那么就会失效,如果想要永久有效的话,就要编辑my.cnf,添加下面两句话:

1
2
general_log = 1
general_log_file = /tmp/mysql/general_sql.log

这里要注意!开启general_log会影响性能,谨慎使用!正式系统用完要关闭!!!关闭的语句SET GLOBAL general_log = 'OFF';

查看慢sql

慢sql的意思就是那些执行很慢的sql,这些sql拖慢进程的执行效率而且有很大的优化空间。默认的来说,执行时间超过1秒就算慢sql了,在mysql里输入show variables like 'long%',就会看到如下的内容:

1
2
3
4
5
6
7
mysql> show variables like 'long%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

这个long_query_time是可以更改的,这里是1,那就是代表查询时间大于(不是大于等于)1秒的都是记录到日志,最大值是10。如果写的是0,那么就是输出所有的语句。

这里多说一句,使用命令set global long_query_time=4修改慢查询阈值为4秒后,需要重新连接或新开一个会话才能看到修改值。你用show variables like 'long_query_time'查看是当前会话的变量值,你也可以不用重新连接会话,而是用show global variables like 'long_query_time';

那么记录这些慢日志的地方在哪呢?使用show variables like '%slow_query_log%';看看:

1
2
3
4
5
6
7
8
mysql> show variables  like '%slow_query_log%';
+---------------------+-----------------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /tmp/mysql/DB-Server-slow.log |
+---------------------+-----------------------------------------------+
2 rows in set (0.00 sec)

这里说明慢日志的地址是/tmp/mysql/DB-Server-slow.log,但是慢日志记录的功能没有启动。如果要启动,语句是:set global slow_query_log=1;,跟上面开启实时日志general_log一样,这个方法仅仅是一个临时方法,重启了mysql就会失效,如果要长期生效,还是在my.cnf文件里添加如下两句话:

1
2
slow_query_log =1
slow_query_log_file=/tmp/mysql/DB-Server-slow.log

慢日志还有一个系统变量叫log-queries-not-using-indexes,它的意思是未使用索引的查询也被记录到慢查询日志中,哪怕他可能执行的非常快(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scan的sql也会被记录到慢查询日志。如下:

1
2
3
4
5
6
7
8
9
10
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)

如果你想自己试试慢sql是否被记录,那么可以使用select sleep(5);这样的语句,执行效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select sleep(5) ;
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
1 row in set (5.00 sec)

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 |
+---------------------+---------------------------+------------+-----------+-----------+---------------+----+----------------+-----------+-----------+-----------------+-----------+
| 2018-01-30 21:45:23 | root[root] @ localhost [] | 00:00:05 | 00:00:00 | 1 | 0 | | 0 | 0 | 1 | select sleep(5) | 2 |
+---------------------+---------------------------+------------+-----------+-----------+---------------+----+----------------+-----------+-----------+-----------------+-----------+
1 rows in set (0.00 sec)

参考资料

http://www.cnblogs.com/kerrycode/p/5593204.html
https://www.cnblogs.com/qmfsun/p/4844472.html
http://www.cnblogs.com/jasondan/p/3491258.html

库里三分

-------------This article is over!Thanks for reading!-------------
感谢您请我喝咖啡!(o´ω`o)
0%