MySQL查询日志介绍

MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。默认文件名为hostname.log。默认情况下MySQL查询日志是关闭的。生产环境,如果开启MySQL查询日志,对性能还是有蛮大的影响的。另外很多时候,MySQL慢查询日志基本可以定位那些出现性能问题的SQL,所以MySQL查询日志应用的场景其实不多,有点鸡肋的感觉,它跟SQL Server中的profiler有点类似,但是这个不能跟踪某个会话、用户、客户端。它只能对整个数据库进行跟踪。MySQL查询日志本身比较简单,网上介绍的不多,官方资料也就那么短短一篇。

 

 

MySQL查询日志配置

 

 

MySQL中的参数general_log用来控制开启、关闭MySQL查询日志,参数general_log_file用来控制查询日志的位置。所以如果你要判断MySQL数据库是否开启了查询日志,可以使用下面命令。general_log为ON表示开启查询日志,OFF表示关闭查询日志。

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都是动态参数,可以随时动态修改。

1、开启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查询日志

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

MySQL查询日志总结的更多相关文章

  1. MySQL查询日志介绍

    MySQL查询日志介绍 MySQL的查询日志记录了所有MySQL数据库请求的信息.无论这些请求是否得到了正确的执行.默认文件名为hostname.log.默认情况下MySQL查询日志是关闭的.生产环境 ...

  2. pt-query-digest分析mysql查询日志

    [root@hank-yoon log]# pt-query-digest slowq.log # 200ms user time, 10ms system time, 24.39M rss, 205 ...

  3. mysql 查询日志

    1. 登录mysql mysql -u root -p; 2. 查看日志启用情况以及日志所在位置 show variables like 'log_%'; 结果示例如下 3. 找到对应的日志文件,保存 ...

  4. mysql开启查询日志功能

    1.开启查询日志  https://www.cnblogs.com/kerrycode/p/7130403.html MYsql 查询日志配置    mysql> show variables ...

  5. MySQL慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志 ...

  6. mysql慢查询日志分析工具 mysqlsla(转)

    mysql数据库的慢查询日志是非常重要的一项调优辅助日志,但是mysql默认记录的日志格式阅读时不够友好,这是由mysql日志记录规则所决定的,捕获一条就记录一条,虽说记录的信息足够详尽,但如果将浏览 ...

  7. Mysql慢查询和慢查询日志分析

     Mysql慢查询和慢查询日志分析   众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的.下面总结一些使用过或者研究过的经验,从配置以 ...

  8. MYSQL开启慢查询日志实施

    查看当前服务器是否开启慢查询:1.快速办法,运行sql语句show VARIABLES like "%slow%" 2.直接去my.conf中查看.my.conf中的配置(放在[m ...

  9. PHP慢脚本日志和Mysql的慢查询日志

    1.PHP慢脚本日志 间歇性的502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的. 在 PHP-FPM 的子进程数目超过的配置中的数量时候,会出 ...

随机推荐

  1. linq标准查询运算符

    Order By操作 适用场景:对查询出的语句进行排序,比如按时间排序等等. 说明:按指定表达式对集合排序:延迟,:按指定表达式对集合排序:延迟,默认是升序,加上descending表示降序,对应的扩 ...

  2. Deeplearning.ai课程笔记--汇总

    从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...

  3. 每个 Python 程序员都要知道的日志实践

    在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么. 对于系统开发 ...

  4. javase基础回顾(三) 动态代理

    动态代理是大型框架中经常用到的经典的技术之一,博主在理解spring的控制反转(依赖注入)的思想时回头着重复习了一下java的动态代理. 在说动态代理之前我们先简单说一说代理是用来干什么的,用于什么样 ...

  5. 第1章 Linux文件类基础命令

    1. 关于路径和通配符 Linux中分绝对路径和相对路径,绝对路径一定是从/开始写的,相对路径不从根开始写,还可能使用路径符号. 路径展开符号: . :(一个点)表示当前目录 .. :(两个点)表示上 ...

  6. Hyperledger Fabric链码之三

    在<Hyperledger Fabric链码之一>和<Hyperledger Fabric链码之二>中我们介绍了链码的定义,并通过dev网络测试了测试了自己编写的链码程序. 本 ...

  7. 响应者链UIResponder-扩大UIButton的点击范围

    在开发中,我们经常看到有按钮等的点击,会出现响应事件.按钮->view->ViewController->UIWindow->UIApplication,这就形成了一个响应链. ...

  8. 【转】探讨:ASP.NET技术的学习顺序问题

    摘要:很多人对于ASP.NET的入门和学习顺序比较迷茫,今天让我们一起来跟随作者的思路学习探讨ASP.NET的学习顺序问题,希望有所帮助. 如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 ...

  9. oracle表空间大小的限制和DB_BLOCK_SIZE的概念

    之前接触的项目表空间最大也不超过10G,所以导入数据库时一直使用导入本地的oracle数据库文件的方法,即根据dmp文件大小设置一个数据文件,设定表空间最大值. --创建表空间,数据文件为'F:\ap ...

  10. 【微服务No.3】AOP组件ASPectCore简单使用

    介绍: AspectCore是.NET标准的基于AOP的跨平台框架[github解释].主要支持:对方面拦截器,依赖注入集成,Web应用程序,数据验证等的核心支持. 使用实例: 首先安装dll: In ...