LATEST DETECTED DEADLOCK

大家好!
针对6月2日 LOANDB CPU高负载问题分析
            6月2日上午10点5分,发现Loandb的数据库的CPU负载非常高,CPU的IDEL值几乎接近为零。期初认为是业务方进行后台管理操作导致,在与开发联系后关闭管理后台的应用后数据库的CPU负载依然非常高。
    后来在查看MYSQL innodb的数据库引擎状态信息日志中发现了问题的根本原因。  12点左右,耿会生从业务部门了解到,业务部门推送营销短信给到之前积压放款的借款人,借款人集中登陆网站办理业务,
  导致数据库负载激增。

日志信息

------------------------
LATEST DETECTED DEADLOCK
------------------------
2017-06-02 10:56:41 7f9dba9b7700
*** (1) TRANSACTION:
TRANSACTION 415399551, ACTIVE 7 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1184, 3 row lock(s), undo log entries 1
MySQL thread id 40456, OS thread handle 0x7f9dce1b7700, query id 369288 10.18.13.27 loanuser updating
 
UPDATE PUB_SEQUENCE SET seq_no = (CASE WHEN (POWER(10,seq_length)-seq_no=1) THEN POWER(10,seq_length-1) ELSE seq_no + 1 END) WHERE seq_type = NAME_CONST(‘in_type‘,_utf8‘serialNo10‘ COLLATE ‘utf8_general_ci‘)
 
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 229 page no 3 n bits 72 index `PRIMARY` of table `loandb`.`pub_sequence` trx table locks 2 total table locks 74 trx id 415399551 lock_mode X locks rec but not gap waiting lock hold time 7 wait time before grant 0
 
*** (2) TRANSACTION:
TRANSACTION 415387082, ACTIVE 46 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 2
MySQL thread id 32752, OS thread handle 0x7f9dba9b7700, query id 381564 10.18.13.27 loanuser update
 
insert into usr_contactperson
 ( UCF_CONTACTNO,
 UCF_PERSONNO, 
 UCF_CONTACTTYPE, 
 UCF_PERSONNAME, 
 UCF_MOBILE, 
 UCF_CREATETIME, 
 UCF_USERNO, 
 UCF_SOURCEORGANIZATIONNO, 
 UCF_SOURCEPRODUCT, 
 UCF_CHANNEL )
 values ( ‘xxx‘, 
 ‘xxx‘, 
 ‘xxx‘, 
 ‘xxx, 
‘xxx‘, 
‘xxx‘,
 ‘xxx‘, 
‘xxx‘, 
 ‘xx‘,
 ‘xx‘ )
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 229 page no 3 n bits 72 index `PRIMARY` of table `loandb`.`pub_sequence` trx table locks 2 total table locks 74 trx id 415387082 lock_mode X locks rec but not gap lock hold time 46 wait time before grant 46
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2156 page no 19447 n bits 168 index `UNIQUE_PERSONNO_CONTACTTYPE_INDEX` of table `loandb`.`usr_contactperson` trx table locks 2 total table locks 5 trx id 415387082 lock mode S waiting lock hold time 0 wait time before grant 0
*** WE ROLL BACK TRANSACTION (2)

2           问题分析
如何产生死锁
借助日志的信息我们清楚的了解到,事务TRANSACTION 415387082首先持有了`loandb`.`pub_sequence`表的行级排他锁(HOLDS THE LOCK(S));
事务TRANSACTION 415399551中又恰巧执行一个Update操作需要申请获取这个锁资源,(WAITING FOR THIS LOCK TO BE GRANTED);
由于第一个事务站着锁资源没有释放,第二个事务又无法获取所资源,所以导致死锁的产生。
 
定位问题
从日志中的Update操作我们可以知道,第二个事务需要获取的是seq_type =  NAME_CONST(‘in_type‘,_utf8‘serialNo10‘ COLLATE ‘utf8_general_ci‘)的行级排他锁;
UPDATE PUB_SEQUENCE SET seq_no = (CASE WHEN (POWER(10,seq_length)-seq_no=1) THEN POWER(10,seq_length-1) ELSE seq_no + 1 END) WHERE seq_type = NAME_CONST(‘in_type‘,_utf8‘serialNo10‘ COLLATE ‘utf8_general_ci‘);
所以问题就应该是出在与seq_type为serialNo10的相关业务上。所以我们需要对seq_type为serialNo10的相关业务代码进行优化和处理。
查看PUB_SEQUENCE表的信息

MariaDB [loandb]> select * from PUB_SEQUENCE;
+------------+----------------+------------+
| seq_type | seq_no | seq_length |
+------------+----------------+------------+
| serialNo10 | 1002153435 | 10 |
| serialNo14 | 10000004741308 | 14 |
| serialNo6 | 100114 | 6 |
+------------+----------------+------------+
3 rows in set (0.00 sec)

查看PUB_SEQUENCE表的索引信息

show index from PUB_SEQUENCE;
+--------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| pub_sequence | 0 | PRIMARY | 1 | seq_type | A | 3 | NULL | NULL | | BTREE | | |
+--------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

CPU高负载
由于PUB_SEQUENCE表被锁住,导致大量的修改PUB_SEQUENCE表的请求被堵塞,这些被堵塞的进程快速在系统中累计,造成数据的CPU高负载。
3           解决问题
和研发同事沟通后,为了减少死锁产生,进行了紧急修复,将原来放在事务中的修改pub_sequence请求,从事务中拿出,减少了所产生的机率。没有了死锁,大量的业务请求有效的获取和释放相应的资源,数据库的CPU负载很快降到合理的区间范围。
业务方调整后,CPU的负载。

建议

从上线流程上,增加sql语句审核环节;
     不断优化慢SQL语句;
     业务部门搞活动要提前通知,提前准备;
     硬件设备性能要有冗余;

时间: 2024-10-25 04:50:12

LATEST DETECTED DEADLOCK的相关文章

mysql之show engine innodb status解读(转)

add by zhj: 我第一次知道这个命令是线上服务出了问题,然后同事用这个命令去查看死锁.但用这个命令看死锁有一定的局限性,它只能看到最后一次死锁, 而且只能看到死锁环中的两个事务所执行的最后一条语句(即被死锁卡住的那条语句),看不到整个死锁环,也看到不整个事务的语句.但是即使这亲,对我 们来说也非常有用,因为一般来说,数据库同时存在多个死锁环的可能性比较小,而且有了死锁环中的事务的最后一条语句,我们找到整个死锁环不是太难. "show engine innodb status"这

MySQL 死锁与日志二三事

最近线上 MySQL 接连发生了几起数据异常,都是在凌晨爆发,由于业务场景属于典型的数据仓库型应用,白天压力较小无法复现.甚至有些异常还比较诡异,最后 root cause 分析颇费周折.那实际业务当中咱们如何能快速的定位线上 MySQL 问题,修复异常呢?下文我会根据两个实际 case,分享下相关的经验与方法. 1.Case1:部分数据更新失败 某天渠道同学反馈某报表极个别渠道数据为 0,大部分渠道数据正常.这个数据是由一个统计程序每天凌晨例行更新的,按理来说,要么全部正常,要么全部失败,那会

MySQL 死锁日志分析

------------------------ LATEST DETECTED DEADLOCK ------------------------ 140824  1:01:24 *** (1) TRANSACTION: TRANSACTION 110E, ACTIVE 73 sec starting index read   ## 事务ID=110E,活跃了73s mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap

mysql锁

锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著

MySQL详解--锁

来源:http://blog.csdn.net/xifeijian/article/details/20313977#t4 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制的特点,常见的锁

mysql之show engine innodb status解读

注:以下内容为根据<高性能mysql第三版>和<mysql技术内幕innodb存储引擎>的innodb status部分的个人理解,如果有错误,还望指正!! innodb存储引擎在show engine innodb status(老版本对应的是show innodb status)输出中,显示除了大量的内部信息,它输出就是一个单独的字符串,没有行和列,内容分为很多小段,每一段对应innodb存储引擎不同部分的信息,其中有一些信息对于innodb开发者来说非常有用,但是,许多信息,

[MySQL Reference Manual]14 InnoDB存储引擎

14 InnoDB存储引擎 14 InnoDB存储引擎... 1 14.1 InnoDB说明... 5 14.1.1 InnoDB作为默认存储引擎... 5 14.1.1.1 存储引擎的趋势... 5 14.1.1.2 InnoDB变成默认存储引擎之后... 5 14.1.1.3 InnoDB表好处... 6 14.1.1.4 InnoDB表最佳实践... 6 14.1.1.5 InnoDB表提升... 6 14.1.1.6 InnoDB作为默认存储引擎测试... 6 14.1.1.7 验证In

[转载] 数据库分析手记 —— InnoDB锁机制分析

作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过本文可以帮助大家了解InnoDB锁的基本原理,常见的冲突.死锁,以及对InnoDB事务日志信息的解读. 1. 索引基本原理 InnoDB主要使用行级锁(row lock),其行锁是通过在索引项上加锁而实现的,如果MySQL的执行计划没有用到索引,那么行锁也就无意义了,所以了解锁之前需要了

innodb next-key lock引发的死锁

innodb的事务隔离级别是可重复读级别且innodb_locks_unsafe_for_binlog禁用,也就是说允许next-key lock CREATE TABLE `LockTest` (   `order_id` varchar(20) NOT NULL,   `id` bigint(20) NOT NULL AUTO_INCREMENT,   PRIMARY KEY (`id`),   KEY `idx_order_id` (`order_id`) ) ENGINE=InnoDB