iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql死锁和分库分表问题详解
  • 872
分享到

mysql死锁和分库分表问题详解

mysql死锁的例子mysql死锁的原因和处理方法mysql 2022-06-01 08:06:20 872人浏览 安东尼
摘要

记录生产Mysql的问题点。 业务场景与问题描述 请求一个外部接口时,每天的请求量在900万左右。 分为请求项目和回执这两个项目。请求是用来调用外部接口,回执是接收发送的接口。 在发送请求前会先插入数据库。 在请求

记录生产Mysql的问题点。

业务场景与问题描述

请求一个外部接口时,每天的请求量在900万左右。

分为请求项目和回执这两个项目。请求是用来调用外部接口,回执是接收发送的接口。

在发送请求前会先插入数据库

在请求后,如果接口返回调用失败,会更新数据库状态为失败。

如果发送成功,则会等待上游给出回执消息后,然后更新数据库状态。

而在生产运行过程中,半年出现过两次mysql导致的MQ消费者堆积的问题。

问题分析

记录两次不同的原因导致的生产问题及原因分析。

mysql死锁问题

查看mq聚合平台TPS
上生产发现mq数据一直堆积,且不断上升。而TPS仅为30左右,一直上不去。

这就会使mq消费变慢了,导致不断堆积。具体什么原因导致mq一直堆积,需要继续排查。

查看生产服务器日志

查看生产服务器日志,发现有报错dead Lock的错误。


error response from MysqlConnection [node=24, id=277499, threadId=2735941, state=borrowed, closed=false, autocommit=true, host=10.1.10.74, port=3306, database=sep_4, localPort=27744, isClose:false, toBeClose:false, MySQLVersion:5.7.25], err: Deadlock found when trying to get lock; try restarting transaction, code: 1213

具体的sql如下:


update stage set status = 'success',reply_time = '2021-03-07 10:40:11'  where code = '000123' and create_time > '2021-03-03 00:00:00';

也就是说在执行服务时出现了死的情况。

具体有多少条以及耗时,在生产服务器看着不直观,于是就让dba将慢sql的语句和耗时查出来。

查出后发现最长的慢sql的耗时长达7780ms。

仔细查看会发现,sql会发现相同的id一个在执行中,一个在Lock Wait状态。

而这慢sql中有大量的Lock Wait状态。

什么原因导致的死锁

mysql使用的数据库引擎时InnoDB。先了解下什么是死锁:

所谓死锁: 是指两个或两个以上的进程在执行过程中,
因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.

通过上面的排查可以看出,出现死锁的问题就是:

在执行sql更新一条数据时,会将这一行数据锁定,执行完成后会释放行锁,而没有执行的sql处于Lock Wait状态。

而程序中导致此原因在于,在发送前后和回执时,频繁操作数据库,可能会出现同时操作同一条数据的情况。

所以在执行中就出现了锁等待的情况。

分库分表未带分片键

首先告警的是stage_prod库的CPU飙到了85%。

数据库线程数是否被打满

经过查看数据库连接情况可知,数据库连接数并没有被占满。

查出慢sql和耗时

查出的问题sql:


update stage set status = 'success',reply_time = '2021-03-07 10:40:11'  where create_time > '2021-03-03 00:00:00';

查看sql会发现,这条sql竟然没有带分片键code字段。而这条sql是回执时执行的。

排查生产服务器日志

代码中有做判断,如果code值不为空,sql会带上code的值。那么没带上,就需要查看为何没有带上。

查看代码会发现,code是从Redis中获取的,是在发送时set到redis中的。但是没有set进去就很奇怪了。

初步怀疑是redis问题,然后就与redis维护的平台沟通,发现果真是因为redis故障导致的问题。

为什么不带分片键CPU就会飙升

首先公司用的是hotdb分库分表,因为每天的入库量是在900万左右,一个表是上亿条数据。

如果只是单纯用索引,是无法满足要求的。

分库分表hotdb,根据code值做hash分片,做了64个分片。也就是说64个数据库,分布在8台服务器上的16个实例里面。

这样可以避免各分片数据不均,理论上避免了过度集中在某个分片上。

而如果不带分片键code的sql,所有的dml操作全部下发到所有的底层库上进行执行,相当于遍历了一遍库。

这样就可能会导致CPU直接飙到99%,甚至直接导致服务器直接崩掉,这样操作是很可怕的。

解决办法

应急处理:先停掉几台服务减少数据库操作

数据持续堆积,会影响数据处理速度。那么,就要先降低操作的速度,最快速的办法就是停服务,减少数据库的操作频率。

减少数据库操作避免数据库死锁

死锁一般时由于程序上没有控制好dml操作的提交,没有及时提交.

减少重复操作同一条数据。在批量操作时减少每批dml数,保证快速提交,避免长事务,避免重复提交dml。

那么怎样减少操作呢?

合并sql

将发送前插入和发送失败时更新,直接合并到一条sql,这样就可以避免多次操作同一条数据的情况。

批量执行时减少长事务和条数

执行时发现,每次批量执行20条sql,比一次性执行200条的效率更快。

所以尽可能避免这种问题。

每条sql必须带分库分表分片键

原则就是不能因为一条数据就拖累整个数据库的操作速度。

分片键必须带上,如果不带分片键,就抛错。

增加时间区间开闭区间

用code来做分片键,用createTime做分区。那么在保证code存在的情况下,可以写上开闭区间,可以提高执行效率。

更优解:sql顺序执行

这种方案可以通过把将要执行的sql统一发到一个mq来消费执行,这样可以保证sql顺序执行,从而避免死锁的产生。

但是这个需要根据业务场景来区分。

复盘

mysql死锁问题,要尽可能避免频繁操作同一条数据,也要避免长事务;
针对分库分表问题,一定要带上分片键;
监控机制不可少;

总结

到此这篇关于mysql死锁和分库分表问题的文章就介绍到这了,更多相关mysql死锁和分库分表内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

您可能感兴趣的文档:

--结束END--

本文标题: mysql死锁和分库分表问题详解

本文链接: https://www.lsjlt.com/news/10291.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 死锁问题详解
    目录前言资源可抢占资源和不可抢占资源资源获取死锁资源死锁的条件死锁模型鸵鸟算法死锁检测和恢复从死锁中恢复通过抢占进行恢复通过回滚进行恢复杀死进程恢复死锁避免单个资源的银行家算法破坏死...
    99+
    2024-04-02
  • MySQL死锁问题的分析及解决方法
    这篇文章主要讲解了“MySQL死锁问题的分析及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL死锁问题的分析及解决方法”吧!MySQL死锁问...
    99+
    2024-04-02
  • MySQL数据库之Purge死锁问题的示例分析
    小编给大家分享一下MySQL数据库之Purge死锁问题的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Purge死锁场景说明Purge死锁说明表中存在记录(unique key) 10,20,30,40 (且有 自...
    99+
    2023-05-30
    mysql purge
  • 关于MySQL死锁问题的深入分析
    前言 如果我们的业务处在一个非常初级的阶段,并发程度比较低,那么我们可以几年都遇不到一次死锁问题的发生,反之,我们业务的并发程度非常高,那么时不时爆出的死锁问题肯定让我们非常挠头。不过在死锁问题发生时,很多...
    99+
    2024-04-02
  • MySQL insert死锁问题解决详细记录
    目录Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因MySQL 5.7 的死锁前提示例原因解决方案总结Insert死锁问题剖析 线上有个批量的insert … on duplicate key ...
    99+
    2024-04-02
  • MySQL insert死锁问题解决详细记录
    目录Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因MySQL 5.7 的死锁前提示例原因解决方案总结Insert死锁问题剖析 线上有个批量的insert &hellip...
    99+
    2022-11-13
    mysql insert死锁 mysql死锁排查及解决 MySQL死锁
  • MySQL-分库分表详解(七)
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便问,只要会...
    99+
    2023-09-02
    mysql 数据库
  • Mysql超详细讲解死锁问题的理解
    目录1、什么是死锁?2、Mysql出现死锁的必要条件资源独占条件请求和保持条件不剥夺条件相互获取锁条件3、 Mysql经典死锁案例3.1 建表语句3.2 初始化相关数据3.3 正常转...
    99+
    2024-04-02
  • 【mysql】mysql死锁问题解决方案
    mysql死锁问题解决方案 查询出是被哪个进程给锁住了为什么会产生死锁日志内容:日志解析:找到问题: 解决方案 查询出是被哪个进程给锁住了 执行sql: select ...
    99+
    2023-09-23
    mysql adb 数据库
  • 怎样解决Mysql死锁问题
    怎样解决Mysql死锁问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 show engine in...
    99+
    2024-04-02
  • Mysql如何解决死锁问题
    这篇文章主要为大家展示了“Mysql如何解决死锁问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mysql如何解决死锁问题”这篇文章吧。 ...
    99+
    2024-04-02
  • 如何解决MySQL死锁问题
    这篇文章主要介绍“如何解决MySQL死锁问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何解决MySQL死锁问题”文章能帮助大家解决问题。1、什么是死锁死锁是并...
    99+
    2024-04-02
  • Java死锁问题详解及示例
    目录一、死锁简介二、Java死锁产生的条件可以归纳为以下四个:三、死锁产生的原因四、避免死锁的策略五、代码示例六、诊断死锁七、总结一、死锁简介 在Java程序中,死锁是指两个或多个线...
    99+
    2023-05-18
    Java 死锁 Java死锁示例
  • Java多线程死锁问题详解(wait和notify)
    目录一. synchronnized 的特性1. 互斥性2. 可重入性二. 死锁问题1. 什么是死锁2. 死锁的四个必要条件3. 常见的死锁场景及解决3.1 不可重入造成的死锁3.2...
    99+
    2023-01-05
    Java多线程死锁 java死锁的原因及解决方法 java多线程死锁问题
  • MySql分表、分库、分片和分区知识深入详解
    一、前言 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。 二、分片(类似分库) 分片是把数据库横向扩展(Scal...
    99+
    2024-04-02
  • MySQL分库分表详情
    一、业务场景介绍 假设目前有一个电商系统使用的是MySQL,要设计大数据量存储、高并发、高性能可扩展的方案,数据库中有用户表。用户会非常多,并且要实现高扩展性,你会怎么去设计? OK...
    99+
    2024-04-02
  • 怎么理解MySQL wwwhj8828coml8o88O49999死锁问题
    本篇内容介绍了“怎么理解MySQL wwwhj8828coml8o88O49999死锁问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希...
    99+
    2024-04-02
  • java 中死锁问题的实例详解
    java 中死锁问题的实例详解先看代码在做解释public class DeadLock implements Runnable{ String a; String b; boolean flag; public DeadLock(...
    99+
    2023-05-31
    java 死锁 ava
  • 如何分辨MySQL中的死锁和锁等待
    这篇文章给大家介绍如何分辨MySQL中的死锁和锁等待,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。【数据库版本】MySQL5.7程序报错1205 Lock wat timeout ex...
    99+
    2024-04-02
  • 如何进行Sqlserver死锁问题的分析
    本篇文章为大家展示了如何进行Sqlserver死锁问题的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 问题展现:sqlserve...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作