mysql排插问题_MySQL一次数据插入故障记录

某天突然收到报警,数据库大量事务等待,进到数据库后发线大量的插入操作被阻塞,且都是同一个表的。

通过 show engine innodb status 发现插入操作都是在等待索引 idx_create_time(create_time) 的 insert intention lock(跟 gap 锁互斥),由于某些原因数据库是 RR 隔离级别。

RECORD LOCKS space id 764 page no 471030 n bits 968 index idx_create_time of table `fbs_fdc`.`fbs_sync_logs_taojj_goods` trx id 7007107746 lock_mode X insert intention waiting

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

0: len 8; hex 73757072656d756d; asc supremum;;

1

2

3

RECORDLOCKSspaceid764pageno471030nbits968indexidx_create_timeoftable`fbs_fdc`.`fbs_sync_logs_taojj_goods`trxid7007107746lock_modeXinsertintentionwaiting

Recordlock,heapno1PHYSICALRECORD:n_fields1;compactformat;infobits0

0:len8;hex73757072656d756d;ascsupremum;;

当时查了半天,也没有发现跟这个表相关的其他操作。后面解决方案很狗血,下面再说。

后来查故障问题的时候,首先看了这个故障时间点跟这个表相关的操作。先发现了大量了 insert 操作(达到了数据库默认的 50s 锁超时),如下图。

1b2b7fa08f5ff50e0bacf1814e75a6ac.png

所以确定了 insert 肯定都是在等待锁,到底在等待什么锁呢?当时把跟这个表相关的所有语句都 kill 了,但是有遗漏,就是已经执行完但事务还没有提交的 SQL。

然后从第一条 insert 报错的时间往后查找记录,此时就发现了重要线索:

adcddd99e2341fd145b09cef9841ed74.png

在同一个线程 ID 下先开启了事务,然后对 DELEET 操作做了一个执行计划,并且事务没有提交(另外一个同事在 workbench 工具做的,忘记提交事务)。并且从时间上来看,这个操作刚刚执行完,insert 就开始报错了,所以基本肯定是事务没有提交导致的了。

接着就是复现问题了,发现对 DELETE 语句做 EXPLAIN 含有子查询时,子查询是加锁的(没有子查询的没有锁),我们看一下这条语句具体加什么锁:

explain

DELETE

FROM fbs_fdc.fbs_sync_logs_taojj_goods

WHERE id<(

SELECT min_id

FROM(

SELECT MIN(id) min_id

FROM fbs_fdc.fbs_sync_logs_taojj_goods

WHERE create_time>=(UNIX_TIMESTAMP(DATE_ADD(NOW(), INTERVAL - 10 DAY)))) tmp)

1

2

3

4

5

6

7

8

9

explain

DELETE

FROMfbs_fdc.fbs_sync_logs_taojj_goods

WHEREid<(

SELECTmin_id

FROM(

SELECTMIN(id)min_id

FROMfbs_fdc.fbs_sync_logs_taojj_goods

WHEREcreate_time>=(UNIX_TIMESTAMP(DATE_ADD(NOW(),INTERVAL-10DAY))))tmp)

看子查询可以知道,由于 create_time 字段是有索引的(上面锁等待里面 idx_create_time 索引),并且条件是查大于当前时间减去 10 天的时间,由于是 RR 隔离级别,所以对大于这个时间的记录都加了记录锁 + Gap锁,且 Gap 锁住了 (表最大记录, supremum]。所以导致其他记录都插入时,由于时间字段时单调递增的,所以都被这个 (表最大记录, supremum] 区间锁住了。如果插入的记录时间是小于 (UNIX_TIMESTAMP(DATE_ADD(NOW(), INTERVAL – 10 DAY)))) 这个区间的话,就不会有问题了,因为没有被 Gap 锁住。

对于上面的 EXPLAIN 来说,锁的信息并不是那么明显。如下所示:

---TRANSACTION 7063564148, ACTIVE 22 sec

962 lock struct(s), heap size 221392, 1076484 row lock(s)

MySQL thread id 151743704, OS thread handle 47149846046464, query id 16175417511 10.16.3.169 user_admin

1

2

3

---TRANSACTION7063564148,ACTIVE22sec

962lockstruct(s),heapsize221392,1076484rowlock(s)

MySQLthreadid151743704,OSthreadhandle47149846046464,queryid1617541751110.16.3.169user_admin

可以看到非常多的行锁。

知道了这些信息之后,再来说当时是怎么解决的。我同事在开启的哪个事务里面执行了一个 rename table 操作,把表重命名了,然后重新创建了一张一样的表就好了。因为是在同一个事务里面执行的 EXPLAIN DELETE,所以 rename table 不需要等待锁。如果在其他事务的话,rename table 也应该被阻塞了。

如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯净pe工具_微PE工具箱2.0

(特殊时期&#xff0c;在家时间多一些&#xff0c;突然想到多年的公众号&#xff0c;重启试试&#xff0c;嗯就先每一天推荐一个软件吧)微PE工具箱(WinPE)是一款非常好用的PE系统(独立的预安装环境)&#xff0c;非常纯净&#xff0c;是装机维护得力的助手。安装简单&#xff0c…

sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例

文本将对在spring Boot构建的Web应用中&#xff0c;基于MySQL数据库的几种数据库连接方式进行介绍。包括JDBC、JPA、MyBatis、多数据源和事务。JDBC 连接数据库1、属性配置文件(application.properties)spring.datasource.urljdbc:mysql://localhost:3306/testspring.datasourc…

二分查找递归与非递归的时间比较_我们说一说Python的查找算法!

相信大家在面试开发岗和算法岗时&#xff0c;评委最喜欢问的就是&#xff1a;您能给我说一下查找和排序算法有哪些&#xff1f;今天咱们就说一说Python中最常用的查找算法&#xff0c;下期我们再推出排序算法。首先要明白查找是查什么&#xff1f;我们希望能给定一个值&#xf…

jsf 自定义属性_如何在JSF中实现自定义密码强度指示器

jsf 自定义属性使用JavaScript验证密码强度是一项常见任务。 在本文中&#xff0c;我将展示如何向基于JSF的Web应用程序添加密码强度指示器。 的 PrimeFaces中的密码组件已经具有密码强度的反馈指示符&#xff0c;但是它有两个主要缺点&#xff1a; 反馈指示器没有响应&#…

OAuth 2.0 Java指南:5分钟保护您的应用程序安全

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 现代应用程序依赖于用户身份验证&#xff0c;但是它可能给Java开发人员带来困难的挑战&#xff0c;以及一系列特定于框…

flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

作者&#xff1a;SHERlocked93转发链接&#xff1a;https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q前言相比于早些年前后端代码紧密耦合、后端工程师还得写前端代码的时代&#xff0c;如今已发展到前后端分离&#xff0c;这种开发方式大大提升了前后端项目的可维护性与开发…

成为Java流大师–第1部分:创建流

在许多情况下&#xff0c;声明性代码&#xff08;例如&#xff0c;具有Streams的功能组合&#xff09;可提供出色的代码指标。 通过本动手实验文章系列进行编码&#xff0c;并成为Java Streams的主教练&#xff0c;从而成为一名更好的Java程序员。 Streams的整个想法是代表一个…

java 6 基础教程_Java小白入门教程(6)——循环语句

提纲&#xff1a;1、循环结构2、while循环3、do-while循环4、for循环5、break语句6、continue语句7、循环嵌套8、作业一、循环结构1.1 概念条件满足&#xff0c;某些代码会被反复多次的执行。条件不成立了&#xff0c;循环结束。0-n次。1.2 为什么使用循环开发中可能会把某些代…

事件触发控制_SystemVerilog线程控制与通信

01线程控制1.概述线程&#xff0c;即独立运行的程序&#xff1b;线程需要被触发执行&#xff0c;可以结束或者不结束&#xff1b;在module中的initial和always&#xff0c;都可以看作独立的线程&#xff0c;他们在仿真0时刻开始&#xff0c;而选择结束或者不结束&#xff1b;在…

java必读书籍_最佳5本Java性能调优书籍–精选,必读

java必读书籍为什么Java开发人员应该阅读有关性能调优的书&#xff1f; 当我很久以前第一次面对这个问题时&#xff0c;我以为以后会做&#xff0c;但是我很长一段时间都没有回过头来。 仅当我在用Java编写的任务关键型服务器端财务应用程序中遇到严重的性能和可伸缩性问题时&a…

成为Java流大师–第4部分:数据库流

SQL一直是一种声明性语言&#xff0c;而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式&#xff0c;并学习如何使用Java流对RDBMS数据库执行声明性查询&#xff0c;而无需编写任何SQL代码。 您会发现&#xff0c;Java流和SQL命令的动词之间有着惊人…

unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至&#xff0c;Java 9中将移除 Sun.misc.UnsafeOracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难&#xff0c;有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件&#xff0c;而且还可以用于加载资源&#xff0c;例如属性文件&#xff0c;图像&#xff0c;图标&#xff0c;缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容&#xff0c;误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09;例如&#xff1a; 给…

使用测微计收集应用程序指标

什么是千分尺&#xff1f; 千分尺是一个简单的外观&#xff0c;用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持&#xff0c;包括Atlas&#xff0c;Datadog&#xff0c;Elastic&#xff0c;JMX等。…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c;我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理数据的分步过程。 在此示例中&#xff0c;我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中&#xff0c;这个问题被提及的比例是相当高的&#xff0c;这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数&#xff1f;“我应该选择几个分区&#xff1f;”——如果你在Kaf…