案例分享-导致MySQL崩溃的SQL语句
背景
周一刚上班一个开发小哥火急火燎的过来找我,黑龙江某客户私有化环境的服务过一阵就报数据库连接失败,不知道是什么原因导致的,我以为是客户调整了网络,但是客户说并没有做任何调整,我使用ping测试也看不出什么问题,于是猜测是业务代码导致,我就问他最近是否有发布,他说上周的确发了一个版本,他也怀疑过是代码的问题,所以组织组内成员对发布的代码已经review了好几遍,并没有发现可疑点。
排查
[DruidPooledStatement.java:379] - CommunicationsException, druid version 1.2.8, jdbcUrl : jdbc:mysql://xxx:3306/db_xxx?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull&autoReconnect=true, testWhileIdle true, idle millis 9950, minIdle 1, poolingCount 5, timeBetweenEvictionRunsMillis 60000, lastValidIdleMillis 9950, driver com.mysql.cj.jdbc.Driver, exceptionSorter com.alibaba.druid.pool.vendor.MySqlExceptionSorter
2024-11-05 10:35:19.671 [inter-listener-threadPool7] [] ERROR [DruidPooledStatement.java:379] - CommunicationsException, druid version 1.2.8, jdbcUrl : jdbc:mysql://xxx:3306/db_xxx?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull&autoReconnect=true, testWhileIdle true, idle millis 8464, minIdle 1, poolingCount 5, timeBetweenEvictionRunsMillis 60000, lastValidIdleMillis 8464, driver com.mysql.cj.jdbc.Driver, exceptionSorter com.alibaba.druid.pool.vendor.MySqlExceptionSorter
2024-11-05 10:35:19.672 [inter-listener-threadPool7] [] ERROR [JdbcUtils.java:89] - close connection error
java.sql.SQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
Communications link failure,多么熟悉的异常信息,老司机都知道这大概率就是网络问题,奈何找不到任何网络出问题的蛛丝马迹,所以尝试换个思路,从MySQL自身的日志碰碰运气,果不其然,MySQL的error日志中显示有条读取JSON的sql导致其退出,一起看下现场
复现
如我所料,只要执行日志中的sql就会让MySQL意外退出,紧接着重新启动,此时应用程序就会报Communications link failure,这条sql究竟有什么魔力居然可以让大名鼎鼎的MySQL瞬间崩塌,好奇心刹那涌上心头,接下来我们剥茧抽丝。
剥茧抽丝
从MySQL的日志中可以看到“This could be because you hit a bug”,怎么会呢?系统中对于JSON的操作语句很早就存在,如果是存在bug那早就暴露了,也不会等到今天,那会是什么原因呢?
从MySQL日志的错误栈可以看到大概是JSON解析失败了,过往经验告诉我引起JSON解析失败的原因无外乎格式不正确,那我就看下那行数据的extdata是否正确。
乍一看好像没啥问题,这本来也不是一个必填字段,空着就空着吧,其实不然,通过和其他数据对比,发现这其实是空串,并不是NULL,对NULL执行->>'$.'不会引起MySQL崩溃,而空串会。
到这也就可以解释“系统中对于JSON的操作语句很早就存在,如果是存在bug那早就暴露了,也不会等到今天才爆发,那会是什么原因呢?”,这次上线的代码对这个字段有写入空串的情况。
但是也引发我的另一个疑问,为什么其他环境没有问题?
我就不卖关子了,是因为其他环境的MySQL版本较高,这个环境使用的是5.7.20版本,我在翻看MySQL更新日志的时候发现5.7.22中确实提到修复了老版本的一个JSON函数导致MySQL退出的bug
遗憾的是“Bug #22253965”在网络上已经搜索不到具体的内容了,一位国外开发者针对这个bug为什么找不到的问题在MySQL论坛提出了讨论,也得到了回复,有兴趣的可以移步https://forums.mysql.com/read.php?10,667824,667824#msg-667824。
解决方案
升级,升级,升级。
事后思考
时刻关注软件的更新列表很重要,不要因为它的广泛使用就忽视升级,虽然升级过程可能像飞行中换引擎一样充满挑战,但这是让它保持最佳状态的关键步骤呢!
推荐阅读
https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-22.html#mysqld-5-7-22-bug
案例分享-导致MySQL崩溃的SQL语句的更多相关文章
- 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- mysql(数据库,sql语句,普通查询)
第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...
- MySQL 常用的sql语句小结(待续)
mysql 常用的sql语句 1.查看数据库各个表中的记录数 USE information_schema; SELECT table_name,table_rows FROM tables WHER ...
- mysql使用基础 sql语句(一)
csdn博文地址:mysql使用基础 sql语句(一) 点击进入 命令行输入mysql -u root -p,回车再输入密码,进入mysql. 终端命令以分号作为一条语句的结束,可分为多行输入,只需 ...
- 监控mysql执行的sql语句
linux平台 监控mysql执行的sql语句 为了做好配合开发做性能和功能测试,方便监控正在执行的sql语句, 可以在/etc/mysqld中添加如下: log =/usr/local/mys ...
- 性能调优案例分享:Mysql的cpu过高
性能调优案例分享:Mysql的cpu过高 问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...
- MySQL的常用SQL语句.md
修改密码 这是常见的大家一般都要用的 首先 安装成功了打开cmd --> mysql -u root -p -->输入你的密码 修改mysql root用户密码 格式 ...
- mysql统计类似SQL语句查询次数
mysql统计类似SQL语句查询次数 vc-mysql-sniffer 工具抓取的sql分析. 1.先用shell脚本把所有enter符号替换为null,再根据语句前后的字符分隔语句 grep -Ev ...
- MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause
MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause 201 ...
随机推荐
- java_String方法大全
1 String a = "abcdefg"; 2 3 String a = new String(); 4 String a = new String("abcdefg ...
- 互联工厂数据交换标准:IPC-CFX
大家好,我是Edison. 全球电子制造主要集中在中国,面向未来工业4.0.中国制造2025的战略转型升级,互联互通是基础.数据是核心,如何从用户角度来定义设备加工数据的内容完整性.有效性.可扩展性将 ...
- Vue elementui 进度条随机颜色
项目要求显示进度条,而且进度条的颜色不能重复,所以就有了随机进度条的想法. 实现的最终效果: <el-table-column header-align="center" a ...
- 手写一个Promise.all
Promise.all 特性: 1. 按顺序返回结果数组; 2. 当所有promise完成才返回; 3. 返回第一个报错的promise的信息; 直接上代码: Promise._all = funct ...
- CSS & JS Effect – Hero Banner Swiper
效果 重点 1. 一张图片, 一个 content 定位居中作为一个 slide 2. slider 用了 JavaScript Library – Swiper 3. 当 slide active ...
- CSS – Selector
前言 这篇记入一些我常用到. 以前写的笔记 css 选择器 (学习笔记) Whatever (*) * {} By Id (#) #id {} By Class (.) .class-name {} ...
- ASP.NET Core – Work with X509
前言 这篇主要是说如何用 ASP.NET Core 读写系统里的证书 Store 和创建一个证书, 还有使用证书做加密, 解密, 签名. 主要参考: C#数字证书编程总结 (读写证书 Store) E ...
- 十三,Spring Boot 中注入 Servlet,Filter,Listener
十三,Spring Boot 中注入 Servlet,Filter,Listener @ 目录 十三,Spring Boot 中注入 Servlet,Filter,Listener 1. 基本介绍 2 ...
- 【QT性能优化】QT性能优化之QT6框架高性能图形视图框架快速展示百万图元大规模场景
QT性能优化之QT6框架高性能图形视图框架快速展示百万图元大规模场景 简介: 本文展示了使用QT图形视图框架在一个场景中绘制出百万个图元的程序的效果以及源代码:本文还介绍了QT图形视图框架的一些实用功 ...
- Foxmail 设置个人签名的方法
事件起因: 在foxmail设置一个好看的个人签名 具体设置过程: 打开Foxmail - 右上角设置 -写邮件 签名的设置 字体格式:等线 10px 黑色 内容: 名字 | 名字英文 职位 个人邮箱 ...