mysql日志分析

硅谷探秘者 Md 数据库 1258 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。


评论区
请写下您的评论...
暂无评论...
猜你喜欢
数据库 1183 开启和设置二进制切换二进制相关参数二进制恢复数据库上一篇文章介绍了普通查询和慢查询等参考:mysql,本篇主要介绍二进制。一、什么是二进制  二进制主要记
数据库基础 3444 mysql年月秒格式化DATE_FORMATSELECTDATE_FORMAT(NOW(),'%Y-%m-%d%H:%i:%s')
框架 2641 log4j.properties配置1.完整示例:##屏蔽com.mchange.v2包下面的debug,info,warn信息##log4j.logger.xxx=error意为屏蔽xxx包下
框架 1267 logback-spring.xmllogback-spring.xml?xmlversion="1.0"encoding="UTF-8"?configuration!--输出路径
框架 2015 ?xmlversion="1.0"encoding="UTF-8"?!DOCTYPElog4j:configurationPUBLIC"-//log4j/log4jConfiguration//EN""log4j.dtd"log4j:configuration!--输出到控制台--appendername="consoleAppender"class="org.apache.log4j.Conso
框架 3686 springaop实现操作记录此次的目的是实现对controller中的方法执行情况进行记录,记录的有方法执行时间,操作人,请求的路径,方法的入参,模块,功能等。并实现利用注解的方式实现对被操作
框架,springboot 54 一、需求:二、logback-spring.xml配置文件详情三、application.yml中添加多环境配置四、测试配置是否成功五、配置不同级别的输出到不同文件一、需求: 使用
java虚拟机(jvm) 4355 java异常捕获思考问题:调用下面的方法别会返和输出回什么?packagecom.itdragon.controller;importorg.junit.Test
归档
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 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。