数据库有问必答 | 如何定位PolarDB出现死锁的原因?

2022-01-12 00:00:00 功能 事务 定位 死锁 诊断

Q: 如何定位PolarDB出现死锁的原因?

你可以利用DAS的锁分析功能与SQL洞察功能进行死锁定位,详细操作方法和注意事项如下:

  • 背景信息

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

  • 死锁定位

    登录PolarDB控制台,在诊断与优化>一键诊断中选择锁分析,单击立即诊断。如果集群存在死锁,会在发现死锁列出现”是”。目前诊断功能只能拉取后一次死锁,同样是从innodb status中获取的。如果集群不重启,死锁信息会一直保留后一组日志,所以需要确认诊断后的日志是不是存量死锁问题,也就是说发现的死锁不一定是新出现的死锁。发现死锁后,单击查看详情,会显示格式化后的死锁信息。

  • 事物流定位

    事务流定位的前提条件是在死锁发生前,PolarDB控制台已经开启了SQL洞察功能,才能对执行过的语句进行定位。通过死锁定位,可以获取到回滚的事务、发生死锁的语句、thread_id。

注:本文所说的死锁是指deadlock,而非事务锁造成的阻塞(block)。

来源:https://mp.weixin.qq.com/s/ICMVbKM2IW_ioLbb7XVeDg

相关文章