运维案例
阻塞问题
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