锁分析

PolarDB MySQL的一键诊断融合了DAS部分功能,您可以通过其中的锁分析直观地查看和分析数据库最近一次发生的死锁。

功能简介

锁分析功能支持对数据库实例进行多维度的死锁分析、事务阻塞分析、元数据锁等待分析。

重要

全量死锁分析其他锁分析功能需要满足以下条件:

  1. 数据库实例为PolarDB MySQL

  2. 要开通DAS经济版或DAS企业版。DAS经济版和DAS企业版支持的地域请参见各个版本支持的数据库和地域。开通DAS经济或企业版请参见企业版

  • 最近死锁分析:DAS基于SHOW ENGINE INNODB STATUS返回的最近一次死锁日志进行分析。如果发生过多次死锁,DAS只会对最近一次死锁进行分析。

  • 全量死锁分析:DAS定时对错误日志进行分析,解析其中的死锁信息,并进行全面的死锁分析。同时,DAS支持查看指定时间范围内的死锁趋势以及各个死锁的详细信息。

  • 其他锁分析:DAS根据information_schemaperformance_schema相关数据,实时分析数据库实例当前会话中的元数据锁和事务阻塞情况。

    • 元数据锁分析:DAS根据information_schema.processlist等的数据,推导锁等待关系,并生成相应的关系图。

    • 事务阻塞分析:DAS根据information_schema.processlistinformation_schema.innodb_trx,以及information_schema.innodb_lock_waits(MySQL 5.65.7使用该数据)和performance_schema.data_lock_waits(MySQL 8.0使用该数据)分析事务阻塞关系,并生成相应的关系图。

      说明

      事务阻塞分析功能不支持PolarDB MySQL 5.6实例。

数据库实例参数限制

目标数据库必须设置相应的参数后,才能使用锁分析的对应功能。

锁分析功能

涉及的数据库实例参数

最近死锁分析

开启innodb_deadlock_detect参数。

全量死锁分析

  • 开启innodb_deadlock_detect参数。

  • 开启innodb_print_all_deadlocks参数,且设置log_error_verbosity=3

其他锁分析中的事务阻塞分析

对于PolarDB MySQL 8.0实例,需要开启performance_schema参数。

修改数据库实例参数:

PolarDB MySQL请参见设置集群参数和节点参数

操作步骤

  1. 登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。

  2. 在左侧导航栏中,选择诊断与优化 > 一键诊断

  3. 单击锁分析页签。

  4. 锁分析页面,从当前节点列表中,选择目标实例ID后,单击立即诊断

  5. 在新生成的死锁诊断列表右侧,单击详情栏中的查看详情

    说明

    仅当发现死锁时,才可以单击查看详情

  6. 锁分析对话框中,查看死锁诊断结果的详情列表,您也可以单击查看死锁日志,查看最近一次的死锁日志详情。

常见问题

Q:为什么执行UPDATE语句时会出现死锁,应如何及解决?

A:若两个事务分别持有对应记录的排他锁(X锁),并同时尝试获取对方持有的锁,则会形成循环等待进而导致死锁。例如:

  • 事务1:UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; 尝试获取用户A(id=1)账户的排他锁,

  • 事务2:UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;尝试获取用户B(id=2)账户的排他锁。

说明

此时,两个事务分别持有了不同记录上的排他锁(X锁)。在此过程中,事务1尝试获取user_id=2记录上的排他锁(X锁),由于事务2已经持有了该记录上的排他锁(X锁),因此事务1需要等待。事务2尝试获取user_id=1记录上的排他锁(X锁),由于事务1已经持有了该记录上的排他锁(X锁),因此事务2也需要等待。如此形成了一个循环等待的情况,即死锁。

解决方案:您可以考虑将所有事务按照相同的顺序来更新记录,例如总是先更新ID较小的记录,也可以将多个更新操作合并为一个批量更新,减少锁的竞争。