Graylog采集MySQL慢日志实战

embedded/2025/1/22 13:19:39/

文章目录

  • 前言
  • 一、MySQL慢日志
    • 0. 慢查询相关语句
    • 1. 检查MySQL是否开启慢日志及慢查询保存位置
    • 2. 检查慢查询阈值
    • 3. 未使用索引是否开启记录慢查询日志
    • 4. 查看mysql.slow_log表结构及字段含义
    • 5. 慢查询记录两种情况示例
  • 二、graylog采集慢查询日志
    • 1. 采集思路
    • 2. 创建Sidecar配置
    • 3. 绑定该配置到对应机器的sidecar并重启sidecar
    • 4. 查看采集到的日志并解析关键字段


前言

在完整的日志系统中,数据库的慢日志是采集中必不可少的一部分,当数据库开启mysql慢日志记录时,研发人员可以通过graylog-sidecar采集到的慢日志进行查看分析,更好的优化mysql语句,提高效率。


一、MySQL慢日志

数据库部署不再过多描述,感兴趣的可以查看我数据库专栏文章

0. 慢查询相关语句

SQL含义备注
show variables like ‘slow_query_log’;是否开启慢查询记录ON 表示开启;OFF 表示关闭
show variables like ‘slow_query_log_file’;慢查询存储位置默认位置/自定义位置
show variables like ‘long_query_time’;慢查询阈值默认值是 10s,使用慢查询则一定需要更改
show variables like ‘log_queries_not_using_indexes’;未使用索引的查询也被记录到慢查询日志中OFF 表示关闭,通常不会被开启
show variables like ‘log_output’;慢查询日志存储方式默认值是 FILE,表示将日志存入文件;
修改为 TABLE,表示将日志存入数据库(mysql.slow_log 表)
show global status like ‘Slow_queries’;查看有多少条慢查询记录/

1. 检查MySQL是否开启慢日志及慢查询保存位置

当slow_query_log字段的值为ON时,则表示开启了慢日志

# 查看慢日志记录途径
mysql> show variables  like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.00 sec)mysql> show variables like 'slow%';
+---------------------+-------------------------------------------------+
| Variable_name       | Value                                           |
+---------------------+-------------------------------------------------+
| slow_launch_time    | 2                                               |
| slow_query_log      | ON                                              |
| slow_query_log_file | /export/servers/data/my3306/log/mysqld-slow.log |
+---------------------+-------------------------------------------------+
3 rows in set (0.01 sec)

2. 检查慢查询阈值

超过2秒则记录到慢日志中

mysql> show variables like 'long%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 2.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

3. 未使用索引是否开启记录慢查询日志

如果需要则开启,默认是关闭状态

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

mysqlslow_log_70">4. 查看mysql.slow_log表结构及字段含义

mysql> SELECT COLUMN_NAME                                          AS '字段名',->        DATA_TYPE                                            AS `数据类型`,->        CHARACTER_MAXIMUM_LENGTH                             AS `字符长度`,->        NUMERIC_PRECISION                                    AS `数字长度`,->        NUMERIC_SCALE                                        AS `小数位数`,->        IS_NULLABLE                                          AS `是否允许非空`,->        CASE WHEN EXTRA = 'auto_increment' THEN 1 ELSE 0 END AS `是否自增`,->        COLUMN_DEFAULT                                       AS `默认值`,->        COLUMN_COMMENT                                       AS `备注`-> FROM information_schema.COLUMNS-> WHERE TABLE_SCHEMA = 'mysql'->   AND TABLE_NAME = 'slow_log';
+----------------+--------------+--------------+--------------+--------------+--------------------+--------------+----------------------+--------+
| 字段名         | 数据类型     | 字符长度     | 数字长度     | 小数位数     | 是否允许非空       | 是否自增     | 默认值               | 备注   |
+----------------+--------------+--------------+--------------+--------------+--------------------+--------------+----------------------+--------+
| start_time     | timestamp    |         NULL |         NULL |         NULL | NO                 |            0 | CURRENT_TIMESTAMP(6) |        |
| user_host      | mediumtext   |     16777215 |         NULL |         NULL | NO                 |            0 | NULL                 |        |
| query_time     | time         |         NULL |         NULL |         NULL | NO                 |            0 | NULL                 |        |
| lock_time      | time         |         NULL |         NULL |         NULL | NO                 |            0 | NULL                 |        |
| rows_sent      | int          |         NULL |           10 |            0 | NO                 |            0 | NULL                 |        |
| rows_examined  | int          |         NULL |           10 |            0 | NO                 |            0 | NULL                 |        |
| db             | varchar      |          512 |         NULL |         NULL | NO                 |            0 | NULL                 |        |
| last_insert_id | int          |         NULL |           10 |            0 | NO                 |            0 | NULL                 |        |
| insert_id      | int          |         NULL |           10 |            0 | NO                 |            0 | NULL                 |        |
| server_id      | int          |         NULL |           10 |            0 | NO                 |            0 | NULL                 |        |
| sql_text       | mediumblob   |     16777215 |         NULL |         NULL | NO                 |            0 | NULL                 |        |
| thread_id      | bigint       |         NULL |           20 |            0 | NO                 |            0 | NULL                 |        |
+----------------+--------------+--------------+--------------+--------------+--------------------+--------------+----------------------+--------+
12 rows in set (0.00 sec)

慢日志记录字段含义

字段含义
start_time开始时间
user_host用户名ip
query_time执行时间
lock_time执行获取锁时间
rows_sent获取结果行数
rows_examined扫描数据行数
db数据库实例
last_insert_id最近一次插入操作生成的自动增长ID
insert_id插入的ID,用于记录插入操作所生成的ID,一般用于AUTO_INCREMENT字段
server_id服务器ID,表示执行查询的数据库服务器的标识符
sql_text具体sql
thread_id线程id

5. 慢查询记录两种情况示例

打开慢查询记录即可看到

第一种:慢查询记录中没有use database

# Time: 2025-01-15T15:30:35.791555+08:00
# User@Host: root[root] @ localhost []  Id:     5
# Query_time: 20.008015  Lock_time: 0.000099 Rows_sent: 4  Rows_examined: 4
SET timestamp=1736926235;
SELECT SLEEP(5), id, name,email FROM users WHERE id > 2;

第二种:慢查询记录中有use database

# Time: 2025-01-15T15:36:17.669885+08:00
# User@Host: xx_fast[xxx_fast] @  [192.168.56.101]  Id: 607
# Query_time: 10.622605  Lock_time: 0.000106 Rows_sent: 0  Rows_examined: 19680
use xx_fast;
SET timestamp=1736926577;
SELECT t.idFROM xxl_job_log AS tWHERE t.trigger_code = 200and t.handle_code = 0and t.trigger_time   <=   '2025-01-15 15:26:07.047'and t.executor_address not in (SELECT t2.registry_valueFROM xxl_job_registry AS t2);
日志格式说明:第一行: 记录时间第二行:用户名 、用户的IP信息、线程ID号第三行:执行花费的时间【单位:毫秒】、执行获得锁的时间、获得的结果行数、扫描的数据行数第四行:这SQL执行的时间戳第五行:具体的SQL语句
补充:有时还会多出一行 数据库名称记录

graylog_162">二、graylog采集慢查询日志

1. 采集思路

如下(示例):

根据上边的日志格式可知道一般情况下日志有5-6行的数据,关于use database这一行不一定有。1、MySQL 的慢查询日志多行构成了一条完整的日志,日志收集时要把这些行拼装成一条日志传输与存储,即需要实现多行合并。2、# Time 开头的行可以确定是一定存在的,可以根据该行来处理多行合并问题,不是以# Time开头的都合并到一行。3、一条完整的慢查询日志最终将以# Time开始的行,以SQL语句结尾的行合并为一条完整的慢日志语句。4、因为use database这一行不是所有慢sql都存在,所以不能通过这个来确定SQL对应的数据库名称,慢日志中也没有字段记录DB,因此这里建议创建数据库账号时以数据库名称命名,这样看到账号名就知道是哪个DB了。

2. 创建Sidecar配置

在这里插入图片描述
在这里插入图片描述

配置如下(示例):

# Needed for Graylog
fields_under_root: true
fields.collector_node_id: ${sidecar.nodeName}
fields.gl2_source_collector: ${sidecar.nodeId}
fields.localIp: ${sidecar.nodeName}
filebeat.registry.flush: 60s
filebeat.shutdown_timeout: 10s 
max_procs: 1filebeat.inputs:
- input_type: logpaths:- /export/servers/data/my3306/log/mysqld-slow.logmultiline.pattern: '^# Time'multiline.negate: truemultiline.match: afterfields:app_name: mysql_slow_query_logenvironment: prolog_type: MySQLtype: log
output.logstash:hosts: ["192.168.56.160:5044"]
path:data: /var/lib/graylog-sidecar/collectors/filebeat/datalogs: /var/lib/graylog-sidecar/collectors/filebeat/log

3. 绑定该配置到对应机器的sidecar并重启sidecar

在这里插入图片描述

4. 查看采集到的日志并解析关键字段

在这里插入图片描述
#grok pattern方式配置提取器

#%{SPACE}Time:%{SPACE}%{TIMESTAMP_ISO8601:time}(?:\+%{INT:timezone})?\
#%{SPACE}User@Host:%{SPACE}%{DATA:user}%{SPACE}@%{SPACE}%{DATA:host}%{SPACE}Id:%{SPACE}%{NOTSPACE:thread_id}\
#%{SPACE} Query_time:%{SPACE}%{BASE10NUM:query_time;float}%{SPACE} Lock_time:%{SPACE}%{BASE10NUM:lock_time;float}%{SPACE}Rows_sent:%{SPACE}%{BASE10NUM:rows_sent;long}%{SPACE}Rows_examined:%{SPACE}%{BASE10NUM:rows_examined;long}(?:\nuse %{DATA:db};|())\
SET%{SPACE} timestamp=%{BASE10NUM:exec_timestamp;long};
%{DATA:sql}$

在这里插入图片描述
在这里插入图片描述
最终获取到如下结果
在这里插入图片描述



http://www.ppmy.cn/embedded/156059.html

相关文章

线性代数概述

矩阵与线性代数的关系 矩阵是线性代数的研究对象之一&#xff1a; 矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础&#xff0c;而矩阵运算则简洁地表示和…

基于 Colyseus 的实时消息处理与广播机制

基于 Colyseus 的实时消息处理与广播机制 Colyseus 是一个用于构建实时多人游戏和协作应用的开源框架&#xff0c;基于 Node.js 运行&#xff0c;并使用 WebSocket 进行高效的消息传输。它提供了一套结构化的 API 来管理房间&#xff08;Rooms&#xff09;、客户端&#xff08…

Python与Excel:开启自动化办公新时代

引言 在当今数字化办公的大环境下&#xff0c;日常工作中处理Excel表格的任务愈发频繁且繁杂。传统的手动操作不仅耗时费力&#xff0c;还容易出错。而Python作为一门功能强大且应用广泛的编程语言&#xff0c;为我们实现Excel办公自动化提供了高效的解决方案。借助Python的丰…

MCU、MPU、SOC、ECU、CPU、GPU的区别到底是什么

MCU、MPU、SOC、ECU、CPU、GPU的区别 参数MCUMPUSoCECUCPUGPU处理能力低至中中至高综合&#xff0c;视具体设计而定专用于汽车控制中至高高&#xff08;并行能力强&#xff09;集成度高低高高低&#xff08;需配合主板使用&#xff09;低&#xff08;通常作为外部设备&#xff…

Python3 字典:解锁高效数据存储的钥匙

Python3 字典&#xff1a;解锁高效数据存储的钥匙 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南&#xff0c;旨在帮助读者从基础入门到项目实战&#xff0c;全面提升编程能力。文章结构由 5 个版块组成&#xff0c;内容层层递进&#xff0c;逻辑…

2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?

模型假设仅仅是简单陈述吗&#xff1f;允许AI的使用是否降低了比赛难度&#xff1f;还在依赖机器学习的模型吗&#xff1f;处理题目的方法有哪些&#xff1f;O奖论文的优点在哪里&#xff1f; 本文调研了当年赛题的评委文章和O奖论文&#xff0c;这些问题都会在文章中一一解答…

Elasticsearch——Elasticsearch索引管理实战

摘要 本文主要介绍了 Elasticsearch 中索引与索引模板的实战操作。首先讲解了索引管理&#xff0c;包括禁止自动创建索引、索引的格式、创建索引示例、修改索引示例、打开/关闭索引示例、删除索引、查看索引以及 Kibana 管理索引等内容。接着阐述了索引模板管理&#xff0c;涉…

元素周期表

目前共有118种元素被发现。 一、非金属元素&#xff1a;共有17种 非金属元素&#xff0c;指化学元素中不具有金属特性的元素。 它们在自然界中以多种形态存在&#xff0c;包括固态、液态和气态。 非金属元素的原子通常获得电子以形成阴离子&#xff0c;或者通过共享电子与其他原…