mysql 慢日志报警_一则MySQL慢日志监控误报的问题分析
之前因为各种原因,有些报警没有引起重视,最近放假马上排除了一些潜在的人为原因,发现数据库的慢日志报警有些奇怪,主要表现是慢日志报警不属实,收到报警的即时通信提醒后,隔一会去数据库里面去排查,发现慢日志的性能似乎没有那么差(我设置的一个阈值是60)。
排查过几次代码层面的逻辑,没有发现明显的问题,几次下来,问题依旧,这可激发了修正的念头,决定认真看看到底是什么原因。
后端使用的是基于ORM的模式,数据都存储在模型MySQL_slowlog_sql_history对应的表中。
代码层面是类似如下的逻辑:
MySQL_slowlog_sql_history.objects.filter(create_time__gt='2020-01-29 11:00:00',Query_time_pct_95__gt=60)
传入的时间是动态的,然后阈值取60秒,按照预期如果报警出来就肯定是有问题的。
为了进一步验证,我把阈值时间修改为600,竟然还是报出错误,执行7~8秒的慢查询照样会报出来。
我使用debug的方式得到了ORM解析得到的SQL:
SELECT...`mysql_slowlog_sql_history`.`create_time`, `mysql_slowlog_sql_history`.`memo` FROM `mysql_slowlog_sql_history` WHERE (`mysql_slowlog_sql_history`.`create_time` > '2020-01-29 11:00:00' AND `mysql_slowlog_sql_history`.`Query_time_pct_95` > '600') LIMIT 21; args=(u'2020-01-29 11:00:00', u'600')
看SQL没问题啊。
我自己在客户端执行,确实是好好的,只过滤出了600秒以上的结果。
select ip_addr,db_port from mysql_slowlog_sql_history where create_time>'2020-01-29 00:00:00' and Query_time_pct_95 > 600;
对着这个结果我开始反思,到底是什么原因呢?
我看着模型的字段定义开始有所悟,然后快速验证了一番。
为了方便说明,我创建了一个测试表test_dummy.
create table test_dummy(id int primary key auto_increment,Query_time_pct_95 varchar(100));
初始化几条数据。
mysql> insert into test_dummy(Query_time_pct_95 ) values('8.83736'),('7.70056'),('5.09871'),('4.32582');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from test_dummy;
+----+-------------------+
| id | Query_time_pct_95 |
| 1 | 8.83736 |
| 4 | 7.70056 |
| 7 | 5.09871 |
| 10 | 4.32582 |
4 rows in set (0.00 sec)
然后使用如下的两条语句来进行对比测试。
mysql> select *from test_dummy where Query_time_pct_95>600;
Empty set (0.00 sec)
mysql> select *from test_dummy where Query_time_pct_95>'600';
| 1 | 8.837364 |
| 2 | 7.700558 |
2 rows in set (0.00 sec)
可以看到,使用了整型数值的时候,没有返回结果,而使用了字符类型的时候,匹配的结果是按照最左匹配的模式来进行过滤的,也就意味着在数据库层面对于浮点数的处理还是差别很大的。
所以这个问题的快速修复方式就是在数据库层面修改数据表的类型为float,而在精度损失方面这块的影响是可以忽略不计的。
再次验证,这个问题就没有再次出现。
mysql 慢日志报警_一则MySQL慢日志监控误报的问题分析相关推荐
- 简单分析MySQL 一则慢日志监控误报问题
这篇文章主要介绍了MySQL 一则慢日志监控误报的问题分析与解决,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下 之前因为各种原因,有些报警没有引起重视,最近放假马上排除了一些潜在的人为原 ...
- mysql临时开启二进制_关于MySQL二进制日志Binlog的认识
MySQL的二进制日志可以说或是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是失误安全型的. 在 ...
- liunx导出mysql慢查询日志查看_查看 MySQL 慢查询日志文件-问答-阿里云开发者社区-阿里云...
查看 MySQL 是否启用了慢 SQL 查询: 查看慢 SQL 日志是否启用. mysql> show variables like 'log_slow_queries'; +--------- ...
- mysql运维机制_《MySQL运维内参》节选 | InnoDB日志管理机制(一)
引 子 InnoDB 存储引擎是支持事务ACID特性的,它是以二十多年前IBM的一篇著名文章<ARIES:A Transaction Recovery Method Supporting Fin ...
- mysql数据库重做日志文件_数据库:mysql:重做日志文件(redo log file)
一.重做日志缓冲(redo log buffer) 1. log block 在InnoDB存储引擎中,重做日志都是以512字节进行存储的.这意味着重做日志缓存.重做日志文件都是以块(block)的方 ...
- mysql 关闭日志命令_关闭MySQL日志
关闭日志以前首先先要删除日志. 执行: /usr/local/mysql/bin/mysql -u root –p (一定要按照这个执行,否则容易出unknown terminal type mast ...
- 查看mysql错误日志命令_查看mysql错误日志
错误日志:记录启动.运行或停止mysqld时出现的问题. 错误日志是一个文本文件. 错误日志记录了MySQL Server每次启动和关闭的详细信息以及运行过程中所有较为严重的警告和错误信息. 可以用- ...
- mysql slave是什么_是mysql作用
php连接mysql数据库基础 bool define ( string name, mixed value [, bool case_insensitive] )define函数作用是定义常量 de ...
- mysql添加函数库_创建mysql函数
如何使用MySQL提升权限 前不久网上公开了一个MySQL Func的漏洞,讲的是使用MySQL创建一个自定义的函数,然后通过这个函数来攻击服务器.最早看到相关的报道是在o-otik上,但是公布的是针 ...
最新文章
- C++实现遍历链表一次求出中间的节点
- 大话中文文本分类之textCNN
- Linux基金会宣布将为GraphQL成立基金会
- java面试难吗_面试两个月,整理了今年的最新java面试题,你看行吗?
- matlab radn,如何用matlab编写randn函数?
- jakarta ee_Jakarta EE,EE4J和Java EE之间的关系
- Android架构师谈:View-Pager-性能优化之-无限循环
- [XHTML Tutorial] 走向XHTML标准 (4)(XHTML Syntax)
- 2015.11.18——Lua中文教程
- HTML项目源码:医疗药品商城模板
- 李力,王飞跃丨地面交通控制的百年回顾和未来展望
- SpringMVC 406状态码
- 朱晔的互联网架构实践心得S2E7:漫谈平台架构的工作(基础架构、基础服务、基础平台、基础中间件等等)
- 基于node连接广工大服务器获取信息
- Elasticsearch中间隔查询slop原理
- 从贝叶斯滤波到无迹卡尔曼滤波
- UOS服务器操作系统部署EKL
- 华为云容器镜像服务 SWR 加速镜像的拉取和推送
- 【图像加密】基于matlab GUI Logistic混沌图像加密与解密【含Matlab源码 1216期】
- 映驰科技发布域控DCU3.0,加速赋能L3跨域融合落地