实时监控MySQL慢查询

2023-11-08

背景

为了优化SQL,我们首先需要发现有问题的SQL语句,网上诸多教程都在教你使用诸如mysqldumpslowpt-query-digest这类工具分析MySQL慢查询日志。然而这一系列的工具都存在一个致命的缺陷,无法实时监控。

而说起实时监控,有经验的小伙伴可能都会想到 mysqld_exporter + prometheus + grafana 的组合,再结合Grafana官网提供的MySQL 模板,便可以实时监控Mysql的多项指标,如下图所示:

请添加图片描述

然而,该方案仅能让我们知道什么时候发生了慢查询,却无法直接看出发生慢查询的SQL语句是什么。于是乎便有了该篇博文的诞生。

本小节我们将使用 promtail + loki + grafana 来实现MySQL慢查询的可视化。直接将慢查询的SQL语句显示在grafana中,如下图所示:

请添加图片描述

实现步骤

1. 启用MySQL的慢查询日志

在MySQL中开启慢查询日志的方法有很多种,这里我们以在my.cnf配置文件中开启为例,找到my.cnf文件,添加以下配置:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2

其中,slow_query_log表示开启慢查询日志功能,slow_query_log_file表示慢查询日志文件的路径,long_query_time表示查询执行时间超过多少秒才被记录到慢查询日志中。

2. 采集MySQL的慢查询日志

市面上的日志采集工具同样很多,如Logstash、Fluentd等,你可以使用你喜欢的日志采集工具,本文中使用grafana官方提供的 promtail,其部署脚本如下:

docker-compose.yaml

version: "3"
services:
  promtail:
    image: grafana/promtail:2.7.0
    volumes:
      - /var/log/mysql:/var/log/mysql
      - /etc/promtail/promtail-config.yaml:/etc/promtail/promtail-config.yaml
    command: -config.file=/etc/promtail/promtail-config.yaml

promtail-config.yamlpromtail的配置文件,具体内容如下:

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: mysql-slow
    static_configs:
      - targets:
          - localhost
        labels:
          job: mysql-slow
          __path__: /var/log/mysql/*.log
    pipeline_stages:
      - match:
          selector: '{job="mysql-slow"}'
          stages:
            - multiline:
                firstline: '^(# Time)'
                max_wait_time: 3s

其中,__path__用于指定采集日志的位置;multiline 表示合并多行Mysql慢查询日志为一行,firstline指定了多行日志的起始行

通过运行promtail,日志将被采集并推送到 loki 中进行存储。接下去我们只要将其读取并进行展示即可。

3. 配置Grafana

在Grafana → Explore中,通过查询语句{filename="/var/log/mysql/mysql-slow.log",job="mysql-slow"},便可查询到MySQL慢查询日志,如下图所示:

请添加图片描述

同时,你也可以在DashBoards中直接配置可视化面板,例如:

请添加图片描述

例子中使用到的Loki查询语句如下:

sum(count_over_time({filename="/var/log/mysql/mysql-slow.log",job="mysql-slow"} | pattern "# Time: <time>\n# User@Host: <user>[<root>] @  [<ip>]  Id:   <id>\n# Query_time: <queryTime>  Lock_time: <lockTime> Rows_sent: <rowsSent>  Rows_examined: <rowsExamined>\nSET timestamp=<timestamp>;\n<sql>;"[1m])) by (sql)

其中,pattern 从日志行中提取字段,字段和MySQL慢查询日志的对应关系如下:

# Time: 2023-05-24T08:03:10.794543Z
# User@Host: root[root] @  [192.168.61.1]  Id:   191
# Query_time: 5.001091  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1
SET timestamp=1684915385;
SELECT SLEEP(5);
# Time: <time>
# User@Host: <user>[<root>] @  [<ip>]  Id:   <id>
# Query_time: <queryTime>  Lock_time: <lockTime> Rows_sent: <rowsSent>  Rows_examined: <rowsExamined>
SET timestamp=<timestamp>;
<sql>;

对于出现换行的地方,需要使用\n代替,便得到了我们最终的表达式

# Time: <time>\n# User@Host: <user>[<host>] @  [<ip>]  Id:   <id>\n# Query_time: <queryTime>  Lock_time: <lockTime> Rows_sent: <rowsSent>  Rows_examined: <rowsExamined>\nSET timestamp=<timestamp>;\n<sql>;

按照同样的方式,你可以做出更多的DashBoards面板,这里就不在演示,小伙伴们可根据自己的需求进行定制。

4. 测试

你可以使用线上真实的慢查询SQL语句进行测试,也可以为了方便简单,和小编一样,使用 SLEEP() 阻塞执行的方式进行测试,如下:

SELECT SLEEP(5);

阻塞5秒执行。

小结

到此,我们使用 promtail + loki + grafana 的组合完成了MySQL慢查询的可视化,将慢查询的SQL语句直接显示在grafana中。但我们不应该局限于 promtail + loki + grafana 的组合,而应该扩展思路,既然promtail + loki + grafana 组合可以,那 ElasticSearch + Logstash + Kibana 等其他组合同样可以。只要敢想敢干,路总会有的!加油

参考文档

LogQL: Log query language | Grafana Loki documentation

MySQL Overview | Grafana Labs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实时监控MySQL慢查询 的相关文章

  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 我是否需要在外键上指定 ON DELETE NO ACTION?

    我有以下与 SQL Server 2012 一起使用的 DDL CREATE TABLE Subject SubjectId INT IDENTITY 1 1 NOT NULL Name NVARCHAR 50 Not NULL CONST
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • java将时间按月分段

    java将时间按月分段 返回分段的数组 按照月份分割一段时间 param startTime 开始时间戳 毫秒 param endTime 结束时间戳 毫秒 public static List
  • 关于Element-ui中Table表格无法显示的问题及解决

    Element ui中Table表格无法显示 1 准备工作 2 引用Element ui官方文档中的Table表格代码 3 启动端口 并在浏览器访问 Element ui表格不生效问题 原因是 Element ui中Table表格无法显示
  • linux设备模型之bus,device,driver分析一

    本文系本站原创 欢迎转载 转载请注明出处 http www cnblogs com gdt a20 内核的开发者将总线 设备 驱动这三者用软件思想抽象了出来 巧妙的建立了其间的关系 使之更形象化 结合前面所学的知识 总的来说其三者间的关系为
  • vscode删除缩进多行tab

    shift tab 转载于 https www cnblogs com v5captain p 9160398 html
  • chrome扩展开发(2)- manifest.json文件简述

    一 本文目标 结合具体应用场景 让读者对manifest json文件的写法和主要属性拥有初步认识 二 目标读者 chrome扩展开发的初学者 想要先从宏观上了解一下chrome扩展能干哪些事情 而不是急于写出一个能运行的demo的人 三
  • 密码学 ~ 数字签名

    概念 数字签名 又称公钥数字签名 是只有信息的发送者才能产生的别人无法伪造的一段数字串 这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明 它是一种类似写在纸上的普通的物理签名 但是使用了公钥加密领域的技术来实现的 用于鉴别数字信
  • PyCharm调试代码的时候出现pydev debugger: process xxxx is connecting

    最近在初学python的时候 在使用PyCharm调试代码的时候出现 pydev debugger process xxxx is connecting 和 Process finished with exit code 0 从从其返回的状
  • matlab神经网络训练图解释,matlab实现神经网络算法

    matlab 神经网络 net newff pr 3 2 logsig logsig 创建一个bp神经网络 10 显示训练迭代过程 0 05 学习速率0 05 1e 10 训练精度net trainParam epochs 50000 最大
  • 自定义单选框和多选框

    说明 作为一个Java后端程序员 有时候也需要自己去写些前端代码 所以将工作中用到的一些小知识做记录分享 1 自定义单选框 有图片 先看效果图 再献上完整代码
  • STM32F103ZET6【HAL函开发】STM32CUBEMX------3.USART串口进行数据的接收的发送

    目的 1 开机后 向串口1发送 hello world 2 串口1收到字节指令 0xA1 打开LED1 发送 LED1 Open 3 串口1收到字节指令 0xA2 关闭LED1 发送 LED1 Closed 4 在串口发送过程中 打开LED
  • python3 pip ipython 安装

    1 安装Python3 6 安装准备 mkdir usr local python3 wget no check certificate https www python org ftp python 3 6 0 Python 3 6 0
  • readis windows servrer 搭建与Java客户端的连接

    1 首先下载redis redis 2 0 2 zip 32 bit 解压 从下面地址下 http code google com p servicestack wiki RedisWindowsDownload 看到下面有redis 2
  • 《SegFormer:Simple and Efficient Design for Semantic Segmentation with Transformers》论文笔记

    参考代码 SegFormer 1 概述 介绍 这篇文章提出的分割方法是基于transformer结构构建的 不过这里使用到的transformer是针对分割任务在patch merge self attention和FFN进行了改进 使其更
  • 计算机内存取证之BitLocker恢复密钥提取还原

    BitLocker是微软Windows自带的用于加密磁盘分卷的技术 通常 解开后的加密卷通过Windows自带的命令工具 manage bde 可以查看其恢复密钥串 如下图所示 如图 这里的数字密码下面的一长串字符串即是下面要提取恢复密钥
  • 华为服务器如何设置网站dns,设置为正确的DNS 服务器地址

    设置为正确的DNS 服务器地址 内容精选 换一换 域名的DNS服务器定义了域名用于解析的权威DNS服务器 通过华为云注册成功的域名默认使用华为云DNS进行解析 详细内容 请参见华为云DNS对用户提供域名服务的DNS是什么 若您选择非华为云D
  • UE4缓存路径修改

    最简单的办法就是通过Evenyting搜索 Engine Config BaseEngine ini 找到你要修改的引擎对应文件 将 ENGINEVERSIONAGNOSTICUSERDIR DerivedDataCache修改为 GAME
  • ORA-00257:archiver error解决办法*

    ORA 00257 archiver error解决办法 出现ORA 00257错误 空间不足错误 通过查找资料 绝大部分说这是由于归档日志太多 占用了全部的硬盘剩余空间导致的 通过简单删除日志或加大存储空间就能够解决 一 更改归档模式 目
  • 为什么C++有多种整型?

    C 中有多种整型是为了满足不同的需求 提供更灵活和高效的整数表示方式 不同的整型具有不同的字节大小 范围和精度 可以根据应用的需求选择合适的整型类型 以下是一些原因解释为什么C 有多种整型 内存和性能优化 不同的整型在内存中占用的空间不同
  • 【读点论文】YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors新集合体

    YOLOv7 Trainable bag of freebies sets new state of the art for real time object detectors Abstract YOLOv7在5 FPS到160 FPS的
  • 实时监控MySQL慢查询

    背景 为了优化SQL 我们首先需要发现有问题的SQL语句 网上诸多教程都在教你使用诸如mysqldumpslow pt query digest这类工具分析MySQL慢查询日志 然而这一系列的工具都存在一个致命的缺陷 无法实时监控 而说起实