查看实时语句
Mysql除了手动执行的语句,还有很多在后台由其他模块执行的语句,按理来说,那些由其他模块执行的语句是不能实时查看的,因为这个资源消耗特别的大,但是当我们实在需要查看实时sql语句的时候也不是做不到,需要手动开启一个日志开关general_log
。
首先登陆mysql,然后执行show variables like "general_log%";
,看一下反馈的结果,如下:
1
2
3
4
5
6
7
8mysql> 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
3mysql> 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
2general_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
7mysql> 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
8mysql> 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
2slow_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
10mysql> 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
15mysql> 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