MySQL查询日志总结

MySQL查询日志介绍html

 

 

MySQL的查询日志记录了全部MySQL数据库请求的信息。不管这些请求是否获得了正确的执行。默认文件名为hostname.log。默认状况下MySQL查询日志是关闭的。生产环境,若是开启MySQL查询日志,对性能仍是有蛮大的影响的。另外不少时候,MySQL慢查询日志基本能够定位那些出现性能问题的SQL,因此MySQL查询日志应用的场景其实很少,有点鸡肋的感受,它跟SQL Server中的profiler有点相似,可是这个不能跟踪某个会话、用户、客户端。它只能对整个数据库进行跟踪。MySQL查询日志自己比较简单,网上介绍的很少,官方资料也就那么短短一篇。mysql

 

 

 

MySQL查询日志配置sql

 

 

MySQL中的参数general_log用来控制开启、关闭MySQL查询日志,参数general_log_file用来控制查询日志的位置。因此若是你要判断MySQL数据库是否开启了查询日志,能够使用下面命令。general_log为ON表示开启查询日志,OFF表示关闭查询日志。shell

 

mysql> show variables like '%general_log%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | OFF                          |
| general_log_file | /var/lib/mysql/DB-Server.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
 
mysql> 

 

 

另外,MySQL的查询日志支持写入文件或写入数据表两种形式,这个由参数log_output控制,以下所示:数据库

 

 

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

 

这三个参数general_log、 general_log_file、 log_output都是动态参数,能够随时动态修改。并发

 

 

一、开启MySQL查询日志工具

 

 

mysql> set global general_log = on;
Query OK, 0 rows affected (0.11 sec)
 
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | ON    |
+---------------+-------+
1 row in set (0.02 sec)
 
mysql> 

 

 

2:关闭MySQL查询日志post

 

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

 

 

 

3:设置日志输出方式为表(若是设置log_output=table的话,则日志结果会记录到名为gengera_log的表中,这表的默认引擎是CSV):性能

 

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.01 sec)
 
mysql> 

 

查看查询日志信息。测试

 

mysql> select * from mysql.general_log;
+---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+
| event_time          | user_host                 | thread_id | server_id | command_type | argument                         |
+---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+
| 2017-07-06 12:32:05 | root[root] @ localhost [] |         1 |         1 | Query        | show variables like 'general%'   |
| 2017-07-06 12:32:28 | root[root] @ localhost [] |         1 |         1 | Query        | show variables like 'log_output' |
| 2017-07-06 12:32:41 | root[root] @ localhost [] |         1 |         1 | Query        | select * from MyDB.test          |
| 2017-07-06 12:34:36 | [root] @ localhost []     |         3 |         1 | Connect      | root@localhost on                |
| 2017-07-06 12:34:36 | root[root] @ localhost [] |         3 |         1 | Query        | KILL QUERY 1                     |
| 2017-07-06 12:34:36 | root[root] @ localhost [] |         3 |         1 | Quit         |                                  |
| 2017-07-06 12:34:51 | root[root] @ localhost [] |         1 |         1 | Query        | select * from mysql.general_log  |
+---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+
7 rows in set (0.02 sec)
 
mysql> 

 

 

4: 查询日志归档

 

 

mysql> system mv /var/lib/mysql/DB-Server.log  /var/lib/mysql/DB-Server.log.20170706

mysql> system mysqladmin flush-logs -p

Enter password:

 

或者你在shell中执行下面命令

 

[root@DB-Server mysql]# mv /var/lib/mysql/DB-Server.log  /var/lib/mysql/DB-Server.log.20170706

[root@DB-Server mysql]# mysqladmin flush-logs -p

Enter password:

 

 

 

5: 修改查询日志名称或位置

 

 

mysql> show variables like 'general_log%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | ON                           |
| general_log_file | /var/lib/mysql/DB-Server.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
 
mysql> set global general_log='OFF';
Query OK, 0 rows affected (0.00 sec)
 
mysql> set global general_log_file='/u02/mysql_log.log';
Query OK, 0 rows affected (0.00 sec)
mysql> set global general_log='ON';
Query OK, 0 rows affected (0.02 sec)

 

 

若是你遇到下面相似问题,这个是由于权限问题致使。

 

mysql> set global general_log_file='/u02/mysql_log.log';

ERROR 1231 (42000): Variable 'general_log_file' can't be set to the value of '/u02/mysql_log.log'

 

将对应目录的owner修改成mysql便可解决问题。以下所示:

 

[root@DB-Server u02]# chown -R mysql:mysql  /u02

 

 

另外,MySQL的查询日志记录了全部MySQL数据库请求的信息。不管这些请求是否获得了正确的执行。这个就是即便我查询一个不存在的表的SQL,查询日志依然会记录。以下测试所示:

 

mysql> select * from MyDB.test1;
ERROR 1146 (42S02): Table 'MyDB.test1' doesn't exist
mysql> select * from MyDB.test2;
+-------+------+
| id    | sex  |
+-------+------+
| 10001 |      |
| 10002 |      |
| 10003 |     |
+-------+------+
3 rows in set (0.07 sec)
 
mysql> select * from MyDB.kkk;
ERROR 1146 (42S02): Table 'MyDB.kkk' doesn't exist
mysql> 

 

 

 

 

 

MySQL查询日志的应用场景

 

 

    存在便是合理,既然MySQL提供了查询日志,那么确定有其应用的地方。好比,我就遇到这样一个例子,前阵子碰到别人问mysqlslap压力测试工具中参数的问题,问题以下: 

 

     -c, --concurrency=name     Number of clients to simulate for query to run.

 

     --number-of-queries=#      Limit each client to this number of queries (this is not exact).

 

   好比我指定:--concurrency=50  --number-of-queries=100, 那么此次测试总的sql执行次数是=100 仍是 50*100=5000 ?

 

咱们不知道--number-of-queries这个参数表明全部客户端的执行次数仍是每个客户端的执行次数,这些英文若是看得不是太明白,那么咱们就动手测试一下,这个时候MySQL查询日志就能发挥其用武之地了。

 

 

[root@DB-Server u02]# mysqlslap -u root -p --concurrency=50 --create-schema='MyDB'  --query='select * from MyDB.test2'  --number-of-queries=100;
 
Enter password: 
 
Benchmark
 
        Average number of seconds to run all queries: 0.023 seconds
 
        Minimum number of seconds to run all queries: 0.023 seconds
 
        Maximum number of seconds to run all queries: 0.023 seconds
 
        Number of clients running queries: 50
 
        Average number of queries per client: 2

 

 

以下所示,咱们能够查到这个SQL总共执行了100次,也就是说number-of-queries表明总共要运行多少次查询。每一个客户运行的查询数量能够用查询总数/并发数来计算。--concurrency  表示并发量,也就是模拟多少个客户端同时执行select。  若是你指定 --number-of-queries=100, --concurrency=50  测试总的SQL执行应该是100

 

 

    

 

 

 

参考资料:

 

https://dev.mysql.com/doc/refman/5.6/en/query-log.html

 

做者: 潇湘隐者

若是你真心以为文章写得不错,并且对你有所帮助,那就不妨小小打赏一下吧,若是囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写做动力!
本文版权归做者全部,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接.
相关文章
相关标签/搜索