首页 > 数据库 >MYSQL 超时问题排查过程

MYSQL 超时问题排查过程

时间:2023-05-25 16:35:34浏览次数:43  
标签:语句 波次 SQL wobshiporder 排查 MYSQL 操作 日志 超时

发现疑点

通过IT的监控发现存在负载(Load)最高了两个SQL如下:

SELECT * FROM `wobshiporder` WHERE `WOBShipOrderID` = ? FOR UPDATE

INSERT INTO `WOBShipOrder` ( `OAID` , `IsDecryptReceiver` …

语句耗时10秒以上。

问题定位

开始分析第一个SQL语句时:选举了一个example

Select * from wobshiporder where WOBShipOrderID = 29430691077040274 for Update

查看explain结果,发现没有查询到数据。

接着根据MYSQL的加锁规则,推导出Insert into WOBShipOrder语句会被前一个For update语句锁住,因为ID基本上是自增的(根据时间生成的),后续插入就可能被间隙锁锁住。

原理分析

这里可以通过实验验证间隙锁对插入语句影响

首先创建一个Test表,开启两个终端:

CREATE TABLE `test` (

`ID` int NOT NULL AUTO_INCREMENT,

`C` varchar(255) DEFAULT NULL,

PRIMARY KEY (`ID`)

) ENGINE=InnoDB;

 

 

问题排查

接着就排查系统使用到select  *from  wobshiporder where WOBShipOrderID = XXX for Update的所有业务代码(其中涉及到复核、取消、修改发货人、解密)等。

通过接口日志、操作日志进一步排除使用这个SQL语句的无关操作,只剩下复核,根据复核代码逻辑,以及验证单条SQL语句执行耗时,发现不是复核本身引起锁超时。一定存在其他操作导致了wobshiporder表被锁住(推测原因:for update间隙锁不会被其他锁住)。

故继续查看出现锁超时前后一分钟的所有业务操作(接口日志、操作日志),发现订单分配操作存在可疑,再结合业务报错的几个时间段,排查前后的操作日志,都存在批量分配的操作,故进一步查看批量分配的逻辑代码,发现此操作是一个大事务(涉及操作几千个订单、生成几千条记录,批量更改几千个订单的状态,故存在锁表)。

问题处理

通过以上步骤明确了具体的业务操作方法,通过分析得知客户勾选批量的波次提交到后台统一分配,故将批量波次按照单个波次进行循环操作(由于每个波次是独立的操作,可以不在一个事务中处理),处理问题的理论是:大事务拆分小事务

标签:语句,波次,SQL,wobshiporder,排查,MYSQL,操作,日志,超时
From: https://www.cnblogs.com/wangchaozhi/p/17431723.html

相关文章

  • MYSQL性能优化-CPU/内存/磁盘
    CPU配置MYSQL的IO线程与CPU核数一致。通过以下命令查看当前配置的配置,默认4#showvariableslike‘%_io_threads’;只能通过修改配置文件来修改以上的配置innodb_read_io_threads=16innodb_read_write_threads=16配置后需要重启MYSQL服务内存超过4G内存则需要CPU支持64位......
  • The MySQL server is running with the --skip-grant-tables option so it cannot exe
     TheMySQLserverisrunningwiththe--skip-grant-tablesoptionsoitcannotexecutethisstatement 默认情况下,启动MySQL数据库实例期间,会读取所有的权限表条目到内存中,后续被缓存到内存中的权限条目作为依据即刻对后续的控制访问生效(传送门)。使用"skip-grant-tab......
  • 【linux】记一次linux开机黑屏卡死排查
    背景:机器:红帽7.6问题:在安装docker后挂载盘后重启黑屏无法启动 排查过程:1、进入单用户模式2、排查发现fstable挂载有误,一个个判断是哪个磁盘挂载有误3、发现挂载没问题,但是一挂载上就无法启动4、尝试修改挂载路径,问题解决 问题根源:原先挂载路径中有程序被设置为开机自......
  • MySQL快速安装配置及相关命令
    安装下载https://dev.mysql.com/downloads/mysql/配置,解压并建立初始化配置文件my.ini,内容如下:[mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=D:\mysql-8.0.32-winx64#设置mysql数据库的数据的存放目录datadir=D:\mysql-8.0.32-winx64\data#允......
  • MySQL——2.数据库的安装及配置(亲测有效)及启动MySQL服务的两种方法
    安装文件的mysql-installer-community-8.0.3.0-rc.msi的链接:https://pan.baidu.com/s/1G-hO_IlhlFqVuhO_mHjKzA密码:emhm目录文章目录一、数据库的安装及配置步骤1.下载后,双击msi文件安装。2.打勾,点击Next3.选择server,点击Next4.点击Execute按钮5.点击Next按钮。6.点击Next按钮。......
  • 腾讯云云服务器Centos系统安装MySQL数据库详细教程
    文章目录一.前言二.教程一.前言      今天是2021年的2月2日,可以说我把一件压在心底很久的一件事做了,今天我用代金卷买了4个月的云服务器,申请了备案,并且配置了MYSQL,有兴趣的可以往下看看,如果是奔着标题来了的,可以直接看下面。      我本身是学c/c++这一类方向的,网......
  • 通过Java代码备份Mysql数据库
    MainpublicclassMain{publicstaticvoidmain(String[]args){//备份数据库BakDb.bakDB();//获取本地备份的sql文件List<String>names=Unitls.sqlFileNameByLocal();//获取最后一个文件名Stringname=names......
  • Mysql:低版本的mysql,5.7-,不知道root密码,如何控制(增、删、改、查)mysql.user:变相跳过mysq
    可以通过直接在mysqld的服务器上,通过os层的文件操作+为mysqld进程发送sighup(-1)信号实现。原理:低版本的mysql,5.7-,其用户账号是通过mysql系统库下的user系统表来控制的;而,mysql.user表是myisam引擎表;所以,我们只要将user.frm\user.MYD\user.MYI这3个相关数据表文件,在o......
  • 关于MYSQL连接后关闭连接问题
    因为创建连接并注册驱动时可能会错先错误,但是链接还是会进行创建 ,如果不判断连接Connection为不为空就关闭的话会引起空指针异常,同理ResultSet、PreparedStatement也是如此。创建顺序是从Connection->Preparedstatment->ResultSet,关闭顺序则是从ResultSet->Preparedstat......
  • docker启动mysql失败
    root@ecs-kc1-small-1-linux:~#dockerrun-p3306:3306mysql:8-oracle2022-03-0513:40:49+00:00[Note][Entrypoint]:EntrypointscriptforMySQLServer8.0.28-1.el8started.2022-03-0513:40:50+00:00[Note][Entrypoint]:Switchingtodedicateduser'mys......