mysql日志分析

硅谷探秘者 数据库 487 0 0
  • 错误日志
  • 一般查询日志
  • 慢查询日志

官方手册:https://dev.mysql.com/doc/refman/5.7/en/server-logs.html

不管是哪个数据库产品,一定会有日志文件。在MariaDB/MySQL中,主要有5种日志文件:

  • 1.错误日志(error log):记录mysql服务的启停时正确和错误的信息,还记录启动、停止、运行过程中的错误信息。
  • 2.查询日志(general log):记录建立的客户端连接和执行的语句。
  • 3.二进制日志(bin log):记录所有更改数据的语句,可用于数据复制。
  • 4.慢查询日志(slow log):记录所有执行时间超过long_query_time的所有查询或不使用索引的查询。
  • 5.中继日志(relay log):主从复制时使用的日志。

一、错误日志

  错误日志是最重要的日志之一,它记录了MariaDB/MySQL服务启动和停止正确和错误的信息,还记录了mysqld实例运行过程中发生的错误事件信息。
查看错误日志文件位置:

+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| log_error     | /var/log/mysqld.log |
+---------------+---------------------+
1 row in set (0.01 sec)

二、一般查询日志

  查询日志分为一般查询日志和慢查询日志,它们是通过查询是否超出变量 long_query_time 指定时间的值来判定的。在超时时间内完成的查询是一般查询,可以将其记录到一般查询日志中,但是建议关闭这种日志(默认是关闭的),超出时间的查询是慢查询,可以将其记录到慢查询日志中。

  变量 general_log={0|1} 决定是否启用一般查询日志,变量general_log_file=file_name来指定查询日志的路径,不给定路径时默认的文件名以 hostname.log 命名。

和查询日志有关的变量有:

  • long_query_time = 10 # 指定慢查询超时时长,超出此时长的属于慢查询,会记录到慢查询日志中
  • log_output={TABLE|FILE|NONE} # 定义一般查询日志和慢查询日志的输出格式,不指定时默认为file

log_output参数说明

  • TABLE 表示记录日志到表中
  • FILE 表示记录日志到文件中
  • NONE 表示不记录日志。只要这里指定为NONE,即使开启了一般查询日志和慢查询日志,也都不会有任何记录

和一般查询日志相关的变量有:

  • general_log=off # 是否启用一般查询日志,为全局变量,必须在global上修改。
  • sql_log_off=off # 在session级别控制是否启用一般查询日志,默认为off
  • general_log_file=/mydata/data/hostname.log # 默认是库文件路径下主机名加上.log

1.开启一般查询日志

mysql> set @@global.general_log=1;

2.查看一般查询日志文件

show variables like 'general_log_file';

+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log_file | /var/lib/mysql/localhost.log |
+------------------+------------------------------+
1 row in set (0.00 sec)

[root@localhost log]# tail -999f /var/lib/mysql/localhost.log

可以看到所有sql的执行记录。

三、慢查询日志

  查询超出变量 long_query_time 指定时间值的为慢查询。但是查询获取锁(包括锁等待)的时间不计入查询时间内。
  mysql记录慢查询日志是在查询执行完毕且已经完全释放锁之后才记录的,因此慢查询日志记录的顺序和执行的SQL查询语句顺序可能会不一致(例如语句1先执行,查询速度慢,语句2后执行,但查询速度快,则语句2先记录)。

和慢查询有关的变量:

  • long_query_time=10 # 指定慢查询超时时长(默认10秒),超出此时长的属于慢查询
  • log_output={TABLE|FILE|NONE} # 定义一般查询日志和慢查询日志的输出格式,默认为file
  • log_slow_queries={yes|no} # 是否启用慢查询日志,默认不启用
  • slow_query_log={1|ON|0|OFF} # 也是是否启用慢查询日志,此变量和log_slow_queries修改一个另一个同时变化
  • slow_query_log_file=/var/lib/mysql/localhost-slow.log #默认路径为库文件目录下主机名加上-slow.log
  • log_queries_not_using_indexes=OFF # 查询没有使用索引的时候是否也记入慢查询日志

1.查看慢查询日志文件目录

mysql> show variables like 'slow_query_log_file';
+---------------------+-----------------------------------+
| Variable_name       | Value                             |
+---------------------+-----------------------------------+
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
1 row in set (0.00 sec)

2.开启慢日志查询

mysql> set @@global.slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)

3.设置超时时间1秒

mysql> set @@global.long_query_time=1;
Query OK, 0 rows affected (0.00 sec)

执行一个时间超过1秒的sql SELECT SLEEP(2);

4.查看日志

[root@localhost ~]# tail -999f /var/lib/mysql/localhost-slow.log
# Time: 2021-10-12T11:43:00.378305Z
# User@Host: root[root] @  [192.168.183.1]  Id:     5
# Query_time: 2.004286  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1634038980;
SELECT SLEEP(2);

5.使用mysqldumpslow工具查看慢查询日志

[root@localhost ~]# mysqldumpslow /var/lib/mysql/localhost-slow.log

Reading mysql slow query log from /var/lib/mysql/localhost-slow.log
Count: 2  Time=2.00s (4s)  Lock=0.00s (0s)  Rows=1.0 (2), root[root]@[192.168.183.1]
  SELECT N as a,SLEEP(N) as b

Count: 4  Time=2.00s (8s)  Lock=0.00s (0s)  Rows=1.0 (4), root[root]@[192.168.183.1]
  SELECT SLEEP(N)

Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), 0users@0hosts
  # Time: N-N-12T11:N:N.378305Z
  # User@Host: root[root] @  [N.N.N.N]  Id:     N
  # Query_time: N.N  Lock_time: N.N Rows_sent: N  Rows_examined: N
  SET timestamp=N;
  SELECT SLEEP(N)

  该工具归类的时候,默认会将同文本但变量值不同的查询语句视为同一类,并使用N代替其中的数值变量,使用S代替其中的字符串变量。可以使用-a来禁用这种替换。

四、特别注意

  以上通过设置全局变量的方法,只对当前数据库生效,如果MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf。

猜你喜欢
数据库 549 开启和设置二进制切换二进制相关参数二进制恢复数据库上一篇文章介绍了普通查询和慢查询等参考:mysql,本篇主要介绍二进制。一、什么是二进制  二进制主要记
数据库基础 2849 mysql年月秒格式化DATE_FORMATSELECTDATE_FORMAT(NOW(),'%Y-%m-%d%H:%i:%s')
框架 2056 log4j.properties配置1.完整示例:##屏蔽com.mchange.v2包下面的debug,info,warn信息##log4j.logger.xxx=error意为屏蔽xxx包下
框架 533 logback-spring.xmllogback-spring.xml?xmlversion="1.0"encoding="UTF-8"?configuration!--输出路径
框架 1356 ?xmlversion="1.0"encoding="UTF-8"?!DOCTYPElog4j:configurationPUBLIC"-//log4j/log4jConfiguration//EN""log4j.dtd"log4j:configuration!--输出到控制台--appendername="consoleAppender"class="org.apache.log4j.Conso
框架 2978 springaop实现操作记录此次的目的是实现对controller中的方法执行情况进行记录,记录的有方法执行时间,操作人,请求的路径,方法的入参,模块,功能等。并实现利用注解的方式实现对被操作
java虚拟机(jvm) 3840 java异常捕获思考问题:调用下面的方法别会返和输出回什么?packagecom.itdragon.controller;importorg.junit.Test
java虚拟机(jvm) 2697 jvm内存模型(5)堆内存溢出以及1.模拟堆内存溢出代码packagetest;importjava.util.ArrayList;importjava.util.List
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。