企业级中带你ELK如何实时收集分析Mysql慢查询日志
什么是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慢查询日志的更多相关文章
- 使用ELK收集分析MySQL慢查询日志
参考文档:https://www.cnblogs.com/bixiaoyu/p/9638505.html MySQL开启慢查询不详述 MySQL5.7慢查询日志格式如下 /usr/local/mysq ...
- logstash收集MySQL慢查询日志
#此处以收集mysql慢查询日志为准,根据文件名不同添加不同的字段值input { file { path => "/data/order-slave-slow.log" t ...
- ELK logstash 处理MySQL慢查询日志(初步)
写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数 ...
- 20180530利用Maxwell组件实时监听Mysql的binlog日志
转自:https://blog.csdn.net/qq_30921461/article/details/78320750 http://kafka.apache.org/quickstart htt ...
- 通过Shell和Redis来实现集群业务中日志的实时收集分析
http://www.linuxidc.com/Linux/2013-05/83935.htm
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志<转>
转自 http://blog.csdn.net/jiedushi/article/details/12003171 Fluentd是一个开源收集事件和日志系统,它目前提供150+扩展插件让你存储大数据 ...
- ELK logstash 处理MySQL慢查询日志
在生产环境下,logstash 经常会遇到处理多种格式的日志,不同的日志格式,解析方法不同.下面来说说logstash处理多行日志的例子,对MySQL慢查询日志进行分析,这个经常遇到过,网络上疑问也很 ...
- 通过logstash收集mysql慢查询日志转换为json
input { file { type => "mysql-slow" path => "/var/log/slow_mysqld.log" sta ...
- 日志实时收集之FileBeat+Kafka
之前,我们的某一个业务用于实时日志收集处理的架构大概是这样的: 在日志的产生端(LogServer服务器),都部署了FlumeAgent,实时监控产生的日志,然后发送至Kafka.经过观察,每一个 ...
随机推荐
- Vuex、axios、跨域请求处理和import/export的注意问题
一.Vuex 1.介绍 vuex是一个专门为Vue.js设计的集中式状态管理架构. 对于状态,我们把它理解为在data中需要共享给其他组件使用的部分数据. Vuex和单纯的全局对象有以下不同: 1. ...
- Vs2010项目升级到Vs2015时的一些修改
之前的C++/cli项目, Civil 3D版本为2014, 现在需要升级到2018版, 在升级的过程中遇到了一些问题: 为了备忘, 记录如下: Vcproj文件中进行了一些修改, 为了跟多版本项目的 ...
- FileZilla-01
FileZilla FTP-client可用于通过上传和下载文件和图像来管理WordPress网站. 设置选项: 01.网址:ftp地址(如果网址是http://example.com,则通常是ftp ...
- java编译过程(字节码编译和即时编译)
Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...
- MAGENTO for XAMPP install config -搬家配置与安装配置
MEGENTO . 2.2.3 . 支持 PHP version is 7.0.2|7.0.4|~7.0.6|~7.1.0 虚拟机主机配置 环境扩展配置 其他错误 httpd-conf —— ...
- Kafka遇到30042ms has passed since batch creation plus linger time at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.valueOrError(FutureRecordMetadata.java:94)
问题描述: 运行生产者线程的时候显示如下错误信息: Expiring 1 record(s) for XXX-0: 30042 ms has passed since batch creation p ...
- nginx设置目录浏览及解决中文乱码问题
在Nginx下默认是不允许列出整个目录的.如需开启此功能,先打开nginx.conf文件,在location server 或 http段中加入相关参数. http { include mime.ty ...
- Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- JavaScript数据类型 String字符串类型的属性和方法
属性 字符串String类型的每个实例都有一个length属性,表示字符串中的字符个数.由于字符串是不可变的,所以字符串的长度也不可变 字符串的length属性不会在for/in循环中枚举,也不能通过 ...
- Elasticsearch High Level Rest Client 发起请求的过程分析
本文讨论的是JAVA High Level Rest Client向ElasticSearch6.3.2发送请求(index操作.update.delete--)的一个详细过程的理解,主要涉及到Res ...