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:
BenchmarkAverage number of seconds to run all queries: 0.023 secondsMinimum number of seconds to run all queries: 0.023 secondsMaximum number of seconds to run all queries: 0.023 secondsNumber of clients running queries: 50Average 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. MySQL查询日志总结

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

  3. 2.5.2 MySQL二进制日志介绍

    MySQL二进制日志介绍 什么是 binary log 这个文件记录了mysql数据库所有的DDL和DML(除了数据查询语句 select)语句事件.用来记录数据库中发生的修改情况. 比如:数据的修改 ...

  4. MySQL 慢查询日志介绍

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

  5. mysql查询日志分析_mysql日志分析

    日志文件(log)就是一个跟踪记录的列表,它可以协助我们时刻掌握系统及应用服务的动作状态,在故障排查的时候提供最详细准确地信息,帮助我们快速查找原因,减少我们凭主观的经验去猜测,这样的答案更具有说服力 ...

  6. MySQL相关日志介绍

    1.MySQL中主要日志如下: ① 错误日志(Log Error) ② 查询日志(Query Log) ③ 二进制日志(Binary Log) 2.相关日志的作用: 1) 错误日志(Error Log ...

  7. MySQL查询日志文件位置

    首先登录mysql 1.查找错误日志文件路径 show variables like 'log_error'; 2.查找日志文件路径 show variables like 'general_log_ ...

  8. yii输出mysql查询日志_Yii2框架设置错误日志输出到日志或数据库

    设置Yii的错误日志,可按照设置错误级别输入到日志或数据库中. 对yii\log\FileTarget做了重写. 1.设置common/config/main.php $db = require(__ ...

  9. mysql日志查询指令_MySQL查询日志总结

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

最新文章

  1. django 学习 (一)
  2. 奈飞文化手册_奈飞文化手册学习笔记
  3. 【AI视野·今日Robot 机器人论文速览 第十七期】Thu, 1 Jul 2021
  4. Postman 报错SSL Error: Self signed certificate Disable SSL Verification
  5. 2019年知乎已发布两款App:短视频“即影”和男生种草“CHAO”
  6. fasterrcnn论文_【每周CV论文推荐】 深度学习人脸检测入门必读文章
  7. 廖雪峰python学习笔记之Web开发
  8. android获取路由器ip地址吗,查看路由器IP地址方法(管理后台地址)
  9. 浅谈数字音频处理的新技术
  10. 美国黄岩超级计算机,飓风预测 揭秘最快气候研究“黄石”超算
  11. Java并发的一些总结(面试须知)
  12. Swift 语言概览
  13. 用c++语言编写的小程序,利用C++编写一些有趣的小程序
  14. UltraEdit mac版破解方法
  15. 与计算机有关的技能,计算机类
  16. 从零开始前端学习[38]:html5中的弹性布局一(移动端响应式实现各种布局,极其重要)
  17. python汉字转拼音首字母_python获取一组汉字拼音首字母的方法
  18. docker容器使用docker-squash压缩体积
  19. 深度神经网络模型压缩和加速
  20. 类脑计算机研制,我国科学家开发出新型类脑芯片

热门文章

  1. 微服务架构 — 服务治理 — 服务监控与告警、服务日志与审计
  2. Go 语言编程 — reflect 反射机制
  3. 两个蓝牙模块配对的方法
  4. vue-cli3.0控制台体验
  5. python基础知识8——常见内置模块
  6. vsftpd类似wu-ftpd分类(Class)的配置-给不同网段的人以不同的上传权限-对虚拟用户进行访问IP限制...
  7. DNS域名服务器双master+ntp时间服务器双主+keepalived企业高可用方案 附脚本
  8. 【JS】两种计时器/定时器
  9. 向 Internet Explorer 添加 Google 搜索
  10. 《精通Nginx》——2.3 使用include文件