什么是Mysql慢查询日志?

当SQL语句执行时间超过所设定的阈值时,便会记录到指定的日志文件中或者表中,所有记录内容称之为慢查询日志

为什么要收集Mysql慢查询日志?

数据库在运行期间,可能会存在这很多SQL语句标准性的问题,那么我们如何快速的去定位,分析哪些SQL语句需要优化处理,又是哪些SQL语句给业务系统造成影响呢?当我们进行统一的收集分析,这样开发和运维就不会产生矛盾,就不会相互的“撕咬”了;SQL语句执行的时间,对应的语句以及具体的写法一切尽收眼底~

如何收集Mysql慢查询日志或者是说具体思路是什么?

1.首先我们的数据采集者仍然是通过filebeat这个工具,对慢查询日志进行采集;

1.1:开启慢查询日志(永久生效,进入my.cnf配置文件进行修改,重启之后便会生效)

  • slow_query_log=ON( log_slow_queries=ON )  #前者是Mysql5.6之后的开启方法;后者是Mysql5.6之前的开启方法;这里版本采用是5.5版本,故此都生效
  • slow_query_log_file=/dada/mysql/the_slow_query.log    #指定mysql慢查询日志的存储目录位置
  • long_query_time=1     #指定慢查询的时间阈值
  • log_outpu=FILE     #表示慢查询日志存放于指定的文件中

1.2:因为Mysql慢查询的格式多行格式,并且不同mysql版本的慢查询日志格式也不经相同,需要考虑将其“#Time”字段过滤掉并整合成为为一整条完整的日志输出,可以借助filebeat的muitline.negate选项,将慢日志查询日志多行合并到一起,输出为一条日志;

2.在logstash事件配置中,我们将拉取到的日志在此通过file过滤处理(通过grok的match插件将日志分为四种情况,当有多条匹配规则存在,就会依次匹配)根据不同情况(数据库版本不同,慢查询亦不同,有id有user,有id无user,无id有user,无id无user)四种情况进行判断匹配,

[mysql5.6版本my.conf配置]

slow_query_log=ON    #开启慢查询日志
slow_query_log_file=/data/mysql_query.log      #重新定义慢查询日志路径
long_query_time=1   #设定sql语句执行超时时间

[root@test ~]# systemctl restart mysqld

mysql> select sleep(5);    #执行测试语句,验证慢日志输出,只要超过1秒设定的阀值即可

# tail -f /dada/mysql_query.log

配置完慢查询日志路径时,切记不要忘记给予mysql属组属主权限,否则重启mysql服务之后,即使通过sql语句查询到慢查询日志位置,但是也没有生效,报错如下:

【拓展】

MariaDB [(none)]> show variables like "%log_output%";   #查看日志存放方式
MariaDB [(none)]> show global status like "%slow_queries%";    #mysql服务自启动到当前时间点的慢查询次数统计

【filebeat配置】

# vim /usr/local/filebeat/filebeat.yml

filebeat.inputs:    #定义数据的原型
- type: log #定义的数据如如类型是log,为默认值。
enabled: true #启动手工配置filebeat
paths:
- /data/mysql_query.log #这是指定mysql慢查询日志文件的路径
fields:
log_topic: mysqlslowlogs #定义一个新字段log_topic,值为mysql_slowlogs;用于kifka的topic主题
exclude_lines: ['^\# Time'] #支持正则,排除匹配的行,如果有多行,合并成整行过滤;这里过滤掉# Time开头的行
multiline.negate: true #匹配多行时指定正则表达式,这里匹配以# Time或者# User开头的行,Time行要先匹配再过滤
multiline.match: after #定义如何将匹配行组合成时间,在之前或者之后,有 "after"、 "before"两个值。multiline.pattern: '^\# Time|^\# User'

multiline.pattern: '^\# Time|^\# User'

processors:             #filebeat对应的消息类型
- drop_fields: #删除无用的字段
fields: ["beat", "input", "source", "offset", "prospector"] filebeat.config.modules: #模块配置,默认情况下会加载modules.d目录中启用的模块
path: ${path.config}/modules.d/*.yml reload.enabled: false #重新加载,为关闭状态
name: 192.168.37.134 #host主机名称,指定本地日志收集的服务器IP即可 output.kafka: #filebeat支持多种输出,如kafka,logstash,elasticsearch等
enabled: true #表示启动该模块
hosts: ["192.168.37.134:9092", "192.168.37.135:9092", "192.168.37.136:9092"] #指定输出数据到kafka集群地址中,加上端口号
version: "0.10"
topic: '%{[fields.log_topic]}' #自动获取日志分类,此处格式为filebeat6.x版本专配
partition.round_robin: #分区
reachable_only: true
worker: 2
required_acks: 1
compression: gzip #压缩格式
max_message_bytes: 10000000 #最大消息字节
logging.level: debug #debug日志级别
filebeat的配置,重点是multiline.negate选项,通过此选项,将mysql慢查询日志多行合并到了一起,输出为一条日志。

[root@test filebeat]# nohup ./filebeat -e -c filebeat.yml &

【Logstash事件配置】

# vim /usr/local/logstash/config/etc/mysql_logs_query.conf

input {
kafka {
bootstrap_servers => "192.168.37.134:9092,192.168.37.135:9092,192.168.37.136:9092"
topics => ["mysqlslowlogs"]
}
} filter {
json {
source => "message"
}
grok {
# 有ID有use
match => [ "message", "^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+(?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\s+Id:\s+%{NUMBER:id}\n# Query_time: %{NUMBER:query_time}\s+Lock_time: %{NUMBER:lock_time}\s+Rows_sent: %{NUMBER:rows_sent}\s+Rows_examined: %{NUMBER:rows_examined}\nuse\s(?<dbname>\w+);\nSET\s+timestamp=%{NUMBER:timestamp_mysql};\n(?<query>[\s\S]*)" ] # 有ID无use
match => [ "message", "^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+(?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\s+Id:\s+%{NUMBER:id}\n# Query_time: %{NUMBER:query_time}\s+Lock_time: %{NUMBER:lock_time}\s+Rows_sent: %{NUMBER:rows_sent}\s+Rows_examined: %{NUMBER:rows_examined}\nSET\s+timestamp=%{NUMBER:timestamp_mysql};\n(?<query>[\s\S]*)" ] # 无ID有use
match => [ "message", "^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+(?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\n# Query_time: %{NUMBER:query_time}\s+Lock_time: %{NUMBER:lock_time}\s+Rows_sent: %{NUMBER:rows_sent}\s+Rows_examined: %{NUMBER:rows_examined}\nuse\s(?<dbname>\w+);\nSET\s+timestamp=%{NUMBER:timestamp_mysql};\n(?<query>[\s\S]*)" ] # 无ID无use
match => [ "message", "^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+(?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\n# Query_time: %{NUMBER:query_time}\s+Lock_time: %{NUMBER:lock_time}\s+Rows_sent: %{NUMBER:rows_sent}\s+Rows_examined: %{NUMBER:rows_examined}\nSET\s+timestamp=%{NUMBER:timestamp_mysql};\n(?<query>[\s\S]*)" ]
} date {
match => ["timestamp_mysql","UNIX"] #这里我们需要对日志输出进行时间格式转换,默认将timestamp_mysql的unix时间格式之后直接赋值给timestamp
target => "@timestamp"
}
mutate {
remove_field => "@version" #版本字段,删除不需要的字段
remove_field => "message" #在上述,我们已经对mysql的慢日志输出分段了,所以message输出已经是多余的了,故此删除
} } output {
elasticsearch {
hosts => ["192.168.37.134:9200","192.168.37.135:9200","192.168.37.136:9200"] #将filebeat采集到的数据输出到ES中
index => "mysql-slowlog-%{+YYYY.MM.dd}" #索引文件名称
} #stdout{
#codec=> rubydebug
#}
}

[root@localhost etc]# nohup /usr/local/logstash/bin/logstash -f  mysql_logs_query.conf &    #后台运行

 ps:可stdount终端输出验证正常

【Kibana登录验证】

企业级中带你ELK如何实时收集分析Mysql慢查询日志的更多相关文章

  1. 使用ELK收集分析MySQL慢查询日志

    参考文档:https://www.cnblogs.com/bixiaoyu/p/9638505.html MySQL开启慢查询不详述 MySQL5.7慢查询日志格式如下 /usr/local/mysq ...

  2. logstash收集MySQL慢查询日志

    #此处以收集mysql慢查询日志为准,根据文件名不同添加不同的字段值input { file { path => "/data/order-slave-slow.log" t ...

  3. ELK logstash 处理MySQL慢查询日志(初步)

    写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数 ...

  4. 20180530利用Maxwell组件实时监听Mysql的binlog日志

    转自:https://blog.csdn.net/qq_30921461/article/details/78320750 http://kafka.apache.org/quickstart htt ...

  5. 通过Shell和Redis来实现集群业务中日志的实时收集分析

    http://www.linuxidc.com/Linux/2013-05/83935.htm

  6. fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志<转>

    转自 http://blog.csdn.net/jiedushi/article/details/12003171 Fluentd是一个开源收集事件和日志系统,它目前提供150+扩展插件让你存储大数据 ...

  7. ELK logstash 处理MySQL慢查询日志

    在生产环境下,logstash 经常会遇到处理多种格式的日志,不同的日志格式,解析方法不同.下面来说说logstash处理多行日志的例子,对MySQL慢查询日志进行分析,这个经常遇到过,网络上疑问也很 ...

  8. 通过logstash收集mysql慢查询日志转换为json

    input { file { type => "mysql-slow" path => "/var/log/slow_mysqld.log" sta ...

  9. 日志实时收集之FileBeat+Kafka

    之前,我们的某一个业务用于实时日志收集处理的架构大概是这样的:   在日志的产生端(LogServer服务器),都部署了FlumeAgent,实时监控产生的日志,然后发送至Kafka.经过观察,每一个 ...

随机推荐

  1. Django 序列化

    序列化 背景 对于Django 的queryset 对象在传递给 前端的时候,前端是无法识别的 因此需要存在一个转换过程将 queryset 对象转换成 字符串前端才可以识别 演示 QuerySet ...

  2. Magento2 API 服务合同设计模式 依赖注入 介绍

    公共接口和API 什么是公共界面? 一个公共接口是一组代码,第三方开发者可以调用,实现或构建一个 插件 .Magento保证在没有重大版本更改的情况下,此代码在后续版本中不会更改. 模块的公共接口 标 ...

  3. virtualbox虚拟机使用的是桥接网络无法连接外网

    virtualbox虚拟机使用的是桥接网络,获取到的DHCP,无法和外界通信 查看路由表发现有两个默认路由,优先级高的路由指向了,仅主机网络的网关 删除第一个默认路由

  4. Help Me Escape ZOJ - 3640

    Background     If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth ...

  5. 深入理解JVM(2)——运行时数据区

    1.运行时数据区 1.1.程序计数器 记录当前线程正在执行的字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空. 1.2.虚拟机栈 每个 Java 方法在执行的同时会创建一个栈 ...

  6. JavaXML整理

    XML 浏览器的入口不同(访问路径),访问的资源也不同. 1.1XML语法 1.文档声明必须为<?xml开头,以?>结束; 2.文档声明必须从文档的0行0列位置开始: 3.文档声明只有属性 ...

  7. Git以及TortoiseGit的下载安装使用

    Git以及TortoiseGit的下载安装使用 下载git 下载地址:https://git-scm.com/然后进行一系列的安装,傻瓜式的操作即可 TortoiseGit Tortoise 英[ˈt ...

  8. shell使用lftp连接ftp和sftp,并可以指定私钥

    lftp连接ftp在脚本中可以 lftp -c "open username:password@host:port; ls /Friso/20180822/click/mobile/SUCC ...

  9. 面试经验合集-Java后端<一>

    面试一:CDKHXJSYJS   时间:2018-12-29 周六 地点:航天科技大厦32楼   一 技术题目 <回忆版> 1.上下转型 2.Java异常:分类.处理.设计 3.二叉排序树 ...

  10. Coursera, Big Data 1, Introduction (week 3)

    什么是分布式文件系统?为什么需要分布式文件系统? 如果文件系统可以管理用网络连接的很多个存储单元,叫分布式文件系统. 分布式文件系统提供了数据可扩展性,容错性,高并发. 这些是传统文件系统不具有的. ...