一个程序入库出现死锁问题的排查

某虚拟化部署的服务群,发现其中一个程序在写数据库时,经常有死锁现象,一旦出现,持续时间长达数分钟。当时没时间排查,一直到年底才解决。后面又忙,直到月底才有点时间总结。抛开起初没找到问题的时间外,花了几天解决了问题,虽然没有很难的技术问题,但过程还是值得记录的。本文从后来者角度总结一下解决问题的过程,不涉及代码。

由于本文没有技术含量,请谨慎按需阅读。

起因

从前2个月开始,就收到反馈,数据上传不及时。具体表现是我负责的一个用Golang语言写的数据入库程序断续出现死锁,提示信息如下:

Error 1205: Lock wait timeout exceeded; try restarting transaction

因为有很多个服务连接同一数据库,无法定位到具体原因,排查不到问题。

排查及解决

问题定位

本节根据时间顺序结合排查结果描述解决过程。

经查,在该服务群部署之初,数据库日志就显示有几个警告,如[Warning] [MY-010055] [Server] IP address '192.18.18.168' could not be resolved: Temporary failure in name resolution。至今也有,所以应该不是关键问题。

在出现死锁时,登录mysql,使用select * from processlist where command!='Sleep';查看进程列表,发现我写的程序里的几条插入sql语句明显卡在那里,除此外,还有外部IP进行的select操作,还有本服务器上几个进程进行的select和update操作。

拿其它地方的服务器配置和程序版本来做对比,内存、CPU方面相差不多,自己所了解到的连接数据库的程序版本是一样的,所用的docker镜像ID也是一样的。

此时,问题排查卡住了,接着忙于其它项目,一直到年底。

元旦收假第一天上班,业主上报到领导处,上峰过问,所以必须解决。

我写的程序是入库,还有另外程序是读库传输。于是打电话咨询相关开发人员,但由于刚接不久,问不到问题。

又回到数据库列锁问题上。以个从能力水平,看不到问题,于是联系DBA寻求帮忙,DBA提到一个概念:间隙锁。上网查了一下,的确有这个概念,大意是如果有select操作,数据库会将邻近的数据记录锁住,防止幻读情况出现。前面提到,出现死锁时,数据库有insert、update、select操作,而且极可能是相同的表——因为不同程序,是通过数据库做数据中转站的。此外,DBA还说,如果在select或update过程耗时,那么极可能出现死锁,解决办法是加索引,将耗时降低。

解决方法

于是联系相关开发人员,得到程序会在某个时候进行update操作,观察其语句,是使用一个大ID和和小ID进行update的,其中匹配大ID的数据记录有数十至数百条不等(小ID只匹配一条),而update操作只是更新其中一条数据记录。但是,对大ID没有做索引。

基本定位到问题了。本来想让相关程序的开发人员进行加索引的,但个人推不动,于是直接上手到生产环境上的数据库加索引。先停止我写的程序——因为这个程序是直接写库的,再登录数据库,找到对应的表,建索引。示例语句如下:

show index from foobar;
CREATE INDEX idx_foobar_my_id_dataid_state ON laneheartbeat (my_id, dataid, state);

其中一张表数据量大,建立索引大概耗时几分钟,当时就慌了,以为出事故了,还好一切正常。

接着重启程序,观察日志,入库正常。后面观察了3天日志,都没有出现exceeded。问题基本解决。

接着在其它服务集机器上对数据库的表都建立相同的索引。

反馈

后来了解到,在数据表建立索引的事,其实相关开发人员已经做了测试验证,性能的确提升了很多,可能担心影响,没继续进行。只是个人没想到问题的原因,没问别人,别人也没共享信息。经此事后,也加强了这方面问题的排查和知识的积累。

因为问题直接表现在我负责的程序,也因为数据库方面的确不行,所以花了几天时间。但对业主来说,从问题产生到解决,已经用了近3个月了。

小结

回顾发现,本文遇到的问题,就是数据库的索引正确建立,导致操作耗时,加上多个程序同时操作数据库,因间隙锁机制,出现死锁。建立索引即可解决。

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

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

相关文章

机器学习复习(3)——分类神经网络与drop out

完整的神经网络 以分类任务为例,神经网络一般包括backbone和head(计算机视觉领域) 下面的BasicBlock不是一个标准的backbone,标准的应该是复杂的CNNs构成的 Classfier是一个标准的head,其中output_dim表示分类类别,一般写作num…

嵌入式——模拟/数字转换器(ADC)补充

目录 一、ADC简介 二、ADC功能 1.电压输入范围 2.输入通道 3. 转换顺序 (1)规则序列 (2) 注入序列 4.触发源 5. 转换时间 (1) ADC时钟 (2) 采样时间 6. 数据寄存器 &am…

leetcode2670找出不同元素数目差数组

题目链接 2670. 找出不同元素数目差数组 - 力扣(LeetCode) 解题思路 暴力破解 class Solution:def distinctDifferenceArray(self, nums: List[int]) -> List[int]:mapbefore [1] * len(nums)tmp [nums[0]]for i in range(1,len(nums)):if nums…

jquery的9大选择器

1. 基本选择器  基本选择器是JQuery最常用的选择器,也是最简单的选择器,它通过元素id、class和标签名来查找DOM元素(在网页中id只能使用一次,class允许重复使用)。所谓的网页中id只能使用一次的意思是说,一…

抗体亲和力成熟制备高亲和力抗体-泰克生物

1.什么是抗体亲和力? 抗体亲和力是指抗体与抗原表位或抗原决定簇的结合强度,其实质是一种包含氨基酸间结合力——氢键、疏水性作用力等的非共价作用力。抗体亲和力的强弱取决于抗体与所用抗原表位的配合程度,其决定因素包括接触面积的大小、亲…

Linux实验记录:使用firewalld

前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用 1.1. 认识插槽slot 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示;但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的d…

【buuctf Reverse】Java逆向解密wp

Java逆向解密 https://buuoj.cn/challenges#Java%E9%80%86%E5%90%91%E8%A7%A3%E5%AF%86 附件只有一个Reverse.class 用IntelliJ打开就能看到JAVA源码 这里就是生成flag的地方 int result arr[i] 64 ^ 32; 这个运算的逆运算难搞 注意运算的优先级,先运算在^ 代码…

GO EASY 框架 之 NET 05

目录 1、Overview 2、Agent接口源码 3、收发消息 4、AgentHandle接收函数 5、conns.Conn接口 1、Overview 名称:agent.Agent 网络链接 接口; DESC:网络链接,服务端与客户端通信媒介; 封装:进一步封…

图书管理系统(ArrayList和LinkedList)--versions3.0

目录 一、项目要求: 二、项目环境 三、项目使用的知识点 四、项目代码 五、项目运行结果 六、项目难点分析 图书管理系统--versions1.0: 图书管理系统--versions1.0-CSDN博客文章浏览阅读981次,点赞29次,收藏17次。本文使用…

动态代理IP服务使用优势有哪些?

动态代理IP具备以下使用优势: 1. 频繁更换IP:动态代理IP服务会定期或按需自动更换用户的IP地址,这有助于避免因为单一IP地址频繁访问同一网站而导致的IP被封禁问题,特别适用于网络爬虫、数据抓取和SEO优化等场景。 2. 反反爬策略&…

5G智慧钢铁厂数字孪生三维可视化,推进钢铁新型工业化数字化转型

5G智慧钢铁厂数字孪生三维可视化,推进钢铁新型工业化数字化转型。随着科技的不断发展,数字化转型已经成为钢铁企业转型升级的必经之路。而5G技术的广泛应用,为钢铁企业数字化转型提供了新的机遇。其中,5G智慧钢铁厂数字孪生三维可…

cpu到达100%问题排查

0、背景 首先定位到mysql 的cpu使用率较高 原因是任务域的作业实例补偿定时任务相关sql查询问题,该sql 2min执行一次,一次查询两次,导致cpu飙升,可考虑优化sql,添加以下索引 ALTER TABLE scheduler.tbl_simba_os_sc…

【hive】相关性函数进行相关性分析

文章目录 CORRCOVAR_POPCOVAR_SAMPSTDDEV_POPSTDDEV_SAMP 在Hive SQL中,使用类似的相关性函数进行相关性分析。常见的相关性函数包括CORR、COVAR_POP、COVAR_SAMP、STDDEV_POP、STDDEV_SAMP等。 CORR 举个例子,假设有一个表格sales,其中包含…

StarRocks-3.1.0 单节点部署

1. 相关环境准备 FE: /opt/starrocks BE: /opt/starrocks 安装包下载 wget https://releases.starrocks.io/starrocks/StarRocks-3.1.0.tar.gz解压缩 tar -zxvf StarRocks-3.1.0.tar.gz 安装jdk (v2.5 及以上版本建议安装 JDK 11,我们使用…

搭建WebGL开发环境

前言 本篇文章介绍如何搭建WebGL开发环境 WebGL WebGL的技术规范继承自免费和开源的OpenGL ES标准,从某种意义上说,WebGL就是Web版的OpenGL ES,而OpenGL ES是从OpenGL中派生出来的。他们的应用环境有区别,一般来说:…

C++20 高级编程

文章目录 前言前奏lambda浅谈std::ref的实现浅谈is_same浅谈std::function的实现std::visit 与 std::variant 与运行时多态SFINAE类型内省标签分发 (tag dispatching)编译时多态奇异递归模板模式 (Curiously Recurring Template Pattern,CRTP) 三路比较操作符 (飞船操作符) <…

Django视图函数技巧,从入门到实战

文章目录 Django视图函数1.request对象的方法2.视图函数的常用的返回对象&#xff08;1&#xff09;response对象&#xff08;2&#xff09;JsonResponse对象&#xff08;3&#xff09;redirect() &#xff1a;给浏览器了一个30x的状态码 3.设置响应头和状态码&#xff08;1&am…

Apache Flink文件上传漏洞(CVE-2020-17518)漏洞代码分析

漏洞复现参考如下文章 Apache Flink文件上传漏洞&#xff08;CVE-2020-17518&#xff09;漏洞复现分析_文件上传漏洞复现cve-CSDN博客 分析代码的话&#xff0c;首先找到漏洞修复的邮件 漏洞详情&#xff0c;可以看到漏洞概要&#xff0c;影响的版本&#xff0c;漏洞描述以及…

【Linux笔记】文件描述符与重定向

一、Linux关于文件操作的一些系统调用 1、open和close 我们在C语言阶段已经学过很多文件操作的函数&#xff0c;今天我们要来看看操作系统中对于文件是怎么操作的。 1.1、open与close的用法 C语言的库函数中有很多关于文件操作的接口&#xff0c;包括fopen、fclose、fprint…