mysql案例

本文探讨了数据库运维中遇到的阻塞问题,由于慢SQL导致的链接占用过多,简单kill操作未能有效解决问题,反而加剧了数据库压力。分析了kill操作后客户端重连导致的问题,并提出了使用kill query的改进方案。同时,深入分析了一个具体的死锁案例,涉及两个事务间的锁竞争,详细解释了事务持有的锁类型及等待状态,揭示了死锁产生的原因。为避免类似问题,建议优化SQL和事务处理策略。
摘要由CSDN通过智能技术生成

运维案例

阻塞问题

kill会话

在这里插入图片描述

新上线了业务中含有慢sql,需要紧急添加索引,查询一直在执行,开发沟通后可以kill,但是批量kill后
链接没有释放,并且很快打满链接,数据库瞬间不可用

解决:
紧急重启切换

原因

kill不掉原因:
链接打满,压力过大导致线程无法获取进入innodb的权限,无法进入kill的流程

链接增加原因:
kill后客户端收到错误会重试链接导致链接越来越多

改进:
后续采用kill query的方式。
kill connection很可能导致客户端重试sql

死锁问题
https://www.modb.pro/db/96824
事务一:

REPLACE INTO merchant._mht_trade_request_new (request_id, trans_id,......) VALUES (NEW.request_id, NEW.trans_id, NEW.ref_trans_id, NE

    业务更具条件更新,对mht_trade_request持有排他RECORD LOCKS;

    更新后触发器被触发,再以replace的方式插入_mht_trade_request_new,需要对_mht_trade_request_new持有一个隐式的自增锁;


事务二:

INSERT LOW_PRIORITY IGNORE INTO merchant._mht_trade_request_new (request_id, trans_id, ref_trans_id, ......) SELECT request_id, trans_id, ref_trans_id,

    insert into select from,会先对_mht_trade_request_new加上表级的自增锁;

    新表加锁后,在更具条件中的范围去申请原表mht_trade_request的记录锁;

由于事务1先更新原表mht_trade_request,对更新的记录加上排它锁,触发器还没触发时,事务2开始执行,这个时候事务2现对新表加表锁,当它再去申请对原表加记录级别的共享锁时,发现部分记录被加上了排他锁,所以需要等待。这时事务1触发器触发了,需要对新表获取一个自增锁,造成了回环,产生死锁。
加锁情况

事务一:

    持有:mht_trade_request表记录上的X锁;

    等待:_mht_trade_request_new表上的auto_inc lock;

事务二:

    持有:_mht_trade_request_new表上的auto_inc lock;

    等待:mht_trade_request表记录上的S锁;

加锁分析

https://www.cnblogs.com/LBSer/p/5183300.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值