【巡检问题分析与最佳实践】PolarDB 死锁问题

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 死锁是关系型数据库系统中最为常见的错误,出现在不同事务中同时对某些数据访问加锁时都要等待对方请求中的数据而无法获取锁,数据库系统会自动牺牲回滚代价最小的事务,从而导致对应的写请求失败,更严重的情况是在大量死锁发生时,会导致数据库系统效率低下,堆积进程大量堆积引发性能问题。

往期分享

RDS MySQL

RDS MySQL 实例空间问题

RDS MySQL 内存使用问题

RDS MySQL 活跃线程数高问题

RDS MySQL 慢SQL问题

RDS MySQL 实例IO高问题

RDS MySQL 小版本升级最佳实践

RDS PostgreSQL

RDS PostgreSQL 实例IO高问题

RDS PostgreSQL 慢SQL问题

RDS PostgreSQL CPU高问题

RDS SQL Server

RDS SQL Server 磁盘IO吞吐高问题

RDS SQL Server CPU高问题

RDS SQL Server 空间使用问题

PolarDB

PolarDB MySQL CPU高问题

PolarDB 流量 & 代理问题

Redis

Redis 流控问题

Redis 内存高问题

Redis CPU高问题

MongoDB

MongoDB 内存高问题

MongoDB 磁盘IO高问题

MongoDB 空间使用问题

背景

死锁是关系型数据库系统中最为常见的错误,出现在不同事务中同时对某些数据访问加锁时都要等待对方请求中的数据而无法获取锁,数据库系统会自动牺牲回滚代价最小的事务,从而导致对应的写请求失败,更严重的情况是在大量死锁发生时,会导致数据库系统效率低下,堆积进程大量堆积引发性能问题。

一般来说,死锁都是由于逻辑加锁的顺序导致的,也就是我们常说的 ABA死锁,举例:

tran_A 与 tran_B两个请求分别持有对方所需要的第二次update的行锁,就形成了死锁:


此时业务会收到报错信息类似:

Error : Deadlock found when trying to get lock; try restarting transaction

观察数据库内信息:

show engine innodb status\G;------------------------LATEST DETECTED DEADLOCK
------------------------2020-12-0116:43:280x7fe8a0277700***(1) TRANSACTION:TRANSACTION 370942954, ACTIVE 9 sec starting index read
mysql tables in use 1, locked 1LOCK WAIT 3 lock struct(s), heap size 1136,2 row lock(s), undo log entries 1MySQL thread id 25713, OS thread handle 140637097146112, query id 237499106.11.34.226 luhuo_h updating
update sbtest1 set c='tran2_tran1'where id=1***(1) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 354 page no 4 n bits 144 index PRIMARY of table `sbtest`.`sbtest1` trx id 370942954 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 6; compact format; info bits 00: len 4; hex 80000001;asc;;1: len 6; hex 0000161c23e9;asc     # ;;2: len 7; hex 23000000151374;asc #     t;;3: len 4; hex 80c52f66;asc/f;;4: len 30; hex 7472616e3120202020202020202020202020202020202020202020202020;asc tran1                         ;(total 120 bytes);5: len 30; hex 32323139353230373034382d37303131363035323132332d373431343033;asc22195207048-70116052123-741403;(total 60 bytes);***(2) TRANSACTION:TRANSACTION 370942953, ACTIVE 15 sec starting index read
mysql tables in use 1, locked 13 lock struct(s), heap size 1136,2 row lock(s), undo log entries 1MySQL thread id 25568, OS thread handle 140637096081152, query id 237597106.11.34.226 luhuo_h updating
update sbtest1 set c='tran1_tran2'where id=2***(2) HOLDS THE LOCK(S):RECORD LOCKS space id 354 page no 4 n bits 144 index PRIMARY of table `sbtest`.`sbtest1` trx id 370942953 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 6; compact format; info bits 00: len 4; hex 80000001;asc;;1: len 6; hex 0000161c23e9;asc     # ;;2: len 7; hex 23000000151374;asc #     t;;3: len 4; hex 80c52f66;asc/f;;4: len 30; hex 7472616e3120202020202020202020202020202020202020202020202020;asc tran1                         ;(total 120 bytes);5: len 30; hex 32323139353230373034382d37303131363035323132332d373431343033;asc22195207048-70116052123-741403;(total 60 bytes);***(2) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 354 page no 4 n bits 144 index PRIMARY of table `sbtest`.`sbtest1` trx id 370942953 lock_mode X locks rec but not gap waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 6; compact format; info bits 00: len 4; hex 80000002;asc;;1: len 6; hex 0000161c23ea;asc     # ;;2: len 7; hex 24000000191844;asc $     D;;3: len 4; hex 8021f170;asc! p;;4: len 30; hex 7472616e3220202020202020202020202020202020202020202020202020;asc tran2                         ;(total 120 bytes);5: len 30; hex 32383733333830323932332d31303534383839343634312d313138363735;asc28733802923-10548894641-118675;(total 60 bytes);*** WE ROLL BACK TRANSACTION (2)

但是引擎层打印出的太过于晦涩,难以定位问题,本文主要描述以云上已有工具进行业务逻辑的定位方法

另外,本文说的死锁是指deadlock,而非事务锁造成的阻塞(block),要区分排查。

定位

基础分析

通过实例控制台->一键诊断->锁分析入口进入,选择立即诊断,如果实例存在死锁,会在【发现死锁】列出现 【是】。

需要说明的是,目前诊断功能只能拉取最后一次死锁,同样是从innodb status中获取的,如果实例不重启,死锁信息会一直保留最后一组日志,所以需要确认诊断后的日志是不是存量死锁问题,也就是说发现死锁不一定是新出现的死锁。

目前DMS平台正在排期全量死锁记录的功能,到时会有真实的全量死锁信息。

发现死锁后,点击查询详情页,会显示格式化后的死锁信息:


  • Thread id : 线程ID,和洞察中的线程ID对应
  • 涉及表:死锁出现的表,有时可能左右表不一致,是因为事务中请求的表不致的问题
  • 等待锁索引名: DML语句会将锁加在索引行上,所以获取不到的锁一定是在某个索引上
  • 事务SQL : 引发死锁的语句


以上信息是一个简单死锁的基本情况,但是由于MySQL的死锁信息相对简单,如果是一组事务中的几个语句导致加锁顺序不对,在死锁信息中无法定位,如果是简单业务,可以将【事务SQL】给到研发人员进行语句级别的定位,但是由于有些业务逻辑过于复杂,开发也无法确认事务流,此时就需要进一步将整个事务进行定位。


事务流定位

事务流定位的前提条件是在死锁发生前,开启了sql洞察功能,才能对执行过的语句进行定位。

首先可以获取的信息是:

  1. 回滚的事务
  2. 发生死锁的语句
  3. thread_id


  • 错误线程定位

牺牲事务thread_id 为 1622,成功thread id 为1746,先对牺牲事务进行定位:


状态中显示 【失败(1213)】,error 1213就是死锁回滚的code,所以可以定位发生回滚的事务:

默认返回是秒级排序,如果要获取时序的事务流,需要通过 【执行时间(毫秒)】进行排序,注意如果返回语句太多,将无法进行【执行时间(毫秒)】排序,需要继续缩小时间短,减小返回审计数据。

同时知道执行成功的thread id 为1746 ,可以再次进行定位:

分析日志可获取事务时间线:


至此死锁链的事务流已经分析出来,可以交由业务人员进行代码定位了。


注意事项

  • 在查找SQL审计内容时,有可能出现大量的语句导致无法分析,需要不断的缩短时间范围以定位准确区间
  • 需要明确出现的报错语句为error 1213错误才是死锁退出的语句
  • 如果业务无没有开启事务,有可能是在框架中配置的,一般开始语句都是set autocommit=0,有begin开始事务的情况不是很多。
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
3月前
|
关系型数据库 MySQL Serverless
高顿教育:大数据抽数分析业务引入polardb mysql serverless
高顿教育通过使用polardb serverless形态进行数据汇总,然后统一进行数据同步到数仓,业务有明显高低峰期,灵活的弹性伸缩能力,大大降低了客户使用成本。
|
4月前
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
7月前
|
关系型数据库 物联网 PostgreSQL
沉浸式学习PostgreSQL|PolarDB 11: 物联网(IoT)、监控系统、应用日志、用户行为记录等场景 - 时序数据高吞吐存取分析
物联网场景, 通常有大量的传感器(例如水质监控、气象监测、新能源汽车上的大量传感器)不断探测最新数据并上报到数据库. 监控系统, 通常也会有采集程序不断的读取被监控指标(例如CPU、网络数据包转发、磁盘的IOPS和BW占用情况、内存的使用率等等), 同时将监控数据上报到数据库. 应用日志、用户行为日志, 也就有同样的特征, 不断产生并上报到数据库. 以上数据具有时序特征, 对数据库的关键能力要求如下: 数据高速写入 高速按时间区间读取和分析, 目的是发现异常, 分析规律. 尽量节省存储空间
604 1
|
3月前
|
SQL canal 算法
PolarDB-X最佳实践:如何设计一张订单表
本文主要内容是如何使用全局索引与CO_HASH分区算法(CO_HASH),实现高效的多维度查询。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。
|
6月前
|
关系型数据库 定位技术 分布式数据库
沉浸式学习PostgreSQL|PolarDB 18: 通过GIS轨迹相似伴随|时态分析|轨迹驻点识别等技术对拐卖、诱骗场景进行侦查
本文主要教大家怎么用好数据库, 而不是怎么运维管理数据库、怎么开发数据库内核.
1067 1
|
2月前
|
关系型数据库 分布式数据库 PolarDB
电子书阅读分享《PolarDB开发者大会:PolarDB在线数据实时分析加速》
电子书阅读分享《PolarDB开发者大会:PolarDB在线数据实时分析加速》
85 3
|
2月前
|
关系型数据库 分布式数据库 PolarDB
电子书阅读分享《PolarDB开发者大会:PolarDB在线数据实时分析加速》
电子书阅读分享《PolarDB开发者大会:PolarDB在线数据实时分析加速》
76 1
|
2月前
|
关系型数据库 分布式数据库 PolarDB
电子书阅读分享《PolarDB开发者大会:PolarDB在线数据实时分析加速》
电子书阅读分享《PolarDB开发者大会:PolarDB在线数据实时分析加速》
87 1
|
3月前
|
存储 关系型数据库 分布式数据库
阿里云PolarDB解决乐麦多源数据存储性能问题
乐麦通过使用PolarDB数据库,使整个系统之间的数据查询分析更加高效
390 3

相关产品

  • 云原生数据库 PolarDB