记一次小失误导致的大事件,Mysql SQL Error: 0, SQLState: null 排查过程

soゝso 2019-08-18 12:17:49 302

本站一直依赖收录都是持续的。最近抽风了,一直没收录。一个星期就几十甚至没有,以前都是每天都有不少,有的时候一天几百上千。查看了接口平台。一堆错误。

SQL Error: 0, SQLState: null
SQL Error: 0, SQLState: null
SQL Error: 0, SQLState: null
SQL Error: 0, SQLState: null
SQL Error: 0, SQLState: null
SQL Error: 0, SQLState: null
SQL Error: 0, SQLState: null

全是SQL Error: 0, SQLState: null错误。

开始排查

1.检查数据库

开始看了下  RDS  数据库。这里说明下,本站是有几个数据库的,几个  RDS  ,年费用一万多。我看了下数据库的性能数据。


CPU4核的,但是都过度使用了,最大已经100%了。我先排查下是不是接口暴露了,被人  DDOS  方式获取数据了?(因为之前有出现过类似事情)

查看了接口Nginx日志,排除了接口被攻击的可能性,通过sojson.com Nginx只看到了大量的百度爬虫超时。

为了让百度爬虫爬到数据,我先把一个任务程序停了,然后把数据库重启了下,结果出现了新的异常,其实是属于一类。那么只能继续排查了。

Unable to acquire JDBC Connection
Unable to acquire JDBC Connection
Unable to acquire JDBC Connection

分析查看连接数和IOPS都过度使用,应该是有执行SQL占着链接没释放,一般是大查询和复杂查询,或者是有SQL条件有问题,如搜索没带条件,导致全表查询,随即排除了这些问题。

随后把SQL记录打开,然后锁定了一条SQL 。

//伪SQL
select xxxx from table  where table.check_time= ?

条件是传了,我把这条  SQL  复制出来放到DataGrip中执行一下,发现超时了,因为表很大,瞬间明白了,这个字段忘记加索引了。其实之前是有索引的,上次数据库被我家小黑客捣乱删除了表(120万数据),后来恢复了。导致部分字段有后遗症。

对check_time增加索引后再看性能分析表:


发现恢复了。

总结经验

我项目是用的Springboot 2.x ,数据库是  Mysql  ,连接池默认是 HikariPool ,我也尝试换成了原来的Springboot 1.x 的  druid  数据库连接池。结果没用,不是连接池的问题(其实主要是我对HikariPool不熟悉,既然Springboot2.x换成了HikariPool,肯定是没问题的,只是我不熟悉,怕我配置有问题,所以换成了我一个稍微熟悉的来排查问题)。

排查问题点,着重找连接时间长,也就是占用着数据库连接不放回连接池的操作(  SQL  ),这样的SQL往往有几种。

1.常见的就是大数据查询(一次吞吐数据特别大)。

解决方案:

用多次查询代替、读写分离、分表等替代,或者增量查询结合NoSQL处理。

2.复杂查询,复杂查询比如说各种函数统计、聚合、计算等等,或者是表关联特别多。

解决方案:

综合考虑业务,耦合度降低点,分析SQL执行时间,对SQL进行优化,适当加索引,关联多的情况下,先把大表条件检索完毕后再去Join其他表,总之简化查询逻辑,或者加入  NoSQL  中间件处理。

3.高频查询,其实和第一次的效果差不多,就是导致连接数供不应求。

解决方案:

这个可以在数据库性能允许的情况下增加连接池链接。如果不能有效解决,综合考虑数据查询实时性、重复率等等适当加一些Cache来解决,如果不能解决,还是考虑NoSQL。如果是条件检索导致查询慢,可以尝试分析SQL后添加对应影响性能的字段索引,增加读写分离,多实例读,或者分表,分表要注意尽量有业务逻辑的分表。比如按时间,按业务类型等等。

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/341.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

相关文章
MySQL数据库存储过程字符集问题,乱码的解决办法
Java生成验证码合集()简单版
多说迁移,Java开发模仿自主实现评论(
关于微信weixin.com,价值3000万域名腾讯仲裁“0元”得手实际分析
IE、Firefox对同域名访问并发限制,及解决优化方案
SQL Server 对JSON的支持
为什么undefined、NaN和Infinity可以被赋值,而null不可以?
基于Centos7以上的JAVA相关配置(
Websocket()~ Spring Websocket Session共享解决思路
Shiro教程()Shiro 是什么?Shiro的简单介绍。
最新文章
阿里云和腾讯云哪个好? 25
2019年9月16日新浪短链API已经恢复使用,新浪短链服务官方已经宣布停用。本站已经攻克 779
2019年 中秋节、国庆节放假通知来了,拼假攻略 174
记一次小失误导致的大事件,Mysql SQL Error: 0, SQLState: null 排查过程 302
Springboot Maven 增加本地依赖包,Springboot Maven打包本地包 161
Java 获取图片属性、获取图片EXIF属性操作方法[metadata-extractor] 84
又拍云(Upyun)CDN、云存储刷新链接缓存,API实例讲解 115
Linux Centos 使用 Redis service 启动,Redis service 脚本编写 168
恭喜SOJSON获得阿里云618“上云接力赛”第一名,获得代金券6.18万 404
Springboot 集成Freemarker 自定义标签解决方案 1227
最热文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 183744
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 160477
Elasticsearch教程(四) elasticsearch head 插件安装和使用 142410
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 99967
Elasticsearch教程(六) elasticsearch Client创建 82997
Elasticsearch教程(一),全程直播(小白级别) 80337
Elasticsearch教程(二),IK分词器安装 78325
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 77539
Elasticsearch教程(五) elasticsearch Mapping的创建 71837
免费天气API,天气JSON API,不限次数获取十五天的天气预报 70870

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

正在加载... ...