本文介绍如何使用DAS锁分析功能对数据库进行死锁分析,包括最近死锁分析和全量死锁分析。
文中图片所示中的数据为测试用例数据,实际使用过程中,请以实际数据参数为准,包括线程ID、SQL语句等。
前提条件
-
目标数据库引擎为:
-
最近死锁分析:
-
RDS MySQL
-
自建MySQL
-
PolarDB MySQL版
-
PolarDB-X 2.0
-
-
全量死锁分析:
-
RDS MySQL
-
PolarDB MySQL版
-
-
-
目标数据库实例已接入DAS,并且接入状态显示为接入正常,接入方法详情请参见接入数据库实例。
-
已开通DAS运维服务(原经济版)。
重要-
DAS运维服务(原经济版)目前仅支持部分地域,详情请参见各个版本支持的数据库和地域。
-
开通DAS运维服务(原经济版)请参见管理运维服务(原经济版)。
-
最近死锁分析
-
参数设置:实例需开启
innodb_deadlock_detect参数。说明该参数通常默认为开启状态,可通过执行
SHOW VARIABLES LIKE 'innodb_deadlock_detect'进行确认。需注意,部分类型的实例无法自行调整该参数的设置值。-
修改数据库实例参数:
-
RDS MySQL请参见设置实例参数。
-
PolarDB MySQL版请参见设置集群参数和节点参数。
-
-
-
分析数据:基于
SHOW ENGINE INNODB STATUS返回的最近一次死锁日志进行分析。
如果发生过多次死锁,触发分析时只能分析最近一次死锁,然后保留本次分析得到的死锁相关数据。
操作步骤
登录DAS控制台。
在左侧导航栏中,单击智能运维中心 > 实例监控。
找到目标实例,单击实例ID,进入目标实例详情页。
-
在左侧导航栏中,单击锁分析,在锁分析页面中死锁分析项选择最近死锁分析页签。
-
点击创建分析,发起最近死锁诊断。
诊断完成后,在 最近死锁分析 页签下的结果表格中,可查看诊断生成时间、发生时间及是否发现死锁,单击 查看详情 可查看死锁详细信息。
查看详情
-
选择时间段,查看该时间段内曾经触发过的死锁诊断任务结果。
-
点击最近死锁分析中诊断任务列表详情列中的查看详情。
-
弹出的抽屉页会显示对应死锁详细信息的三种查看方式:
-
视图:以死锁关系可视化的形式展示死锁详情,点击对应的事务图块可以在下方查看对应事务的详细信息。视图:以可视化图形展示死锁关系,包含参与死锁的事务节点和Record Lock节点,通过lock granted和waiting箭头展示锁的持有与等待关系,形成死锁环。已回滚的事务会标注"已回滚"。单击事务节点可展开查看详细信息,包括Session ID、Thread id、请求类型、事务ID、涉及表、等待锁信息及等待锁索引名等字段。
-
列表:以列表的形式,对比持有锁事务的详细信息。列表:以对比表格形式展示死锁涉及的两个事务详情,左右两列分别对应事务 1 和事务 2(已回滚的事务会标注)。表格行包括 Session ID、Thread ID、请求类型、事务ID、涉及表、等待锁(索引名及锁类型,如 X locks rec but not gap waiting)、持有锁(索引名及锁类型)以及事务SQL。底部可通过线程ID或事务ID在SQL洞察中搜索查看相关事务详情。
-
日志:展示
SHOW ENGINE INNODB STATUS返回的原始死锁日志(LATEST DETECTED DEADLOCK)内容。日志:以原始日志的形式展示 MySQL InnoDB 死锁日志详情,包括死锁发生时间、涉及事务的 SQL 语句、持有锁信息(HOLDS THE LOCK)及等待锁信息(WAITING FOR THIS LOCK TO BE GRANTED)等。
-
结合SQL洞察和审计分析
-
在目标实例左侧导航栏中,单击SQL洞察和审计,在审计页面点击开启高级查询。
-
选择包含死锁发生时间的一段时间范围,并填入线程ID(最近死锁分析中的Thread id),查询该事务执行过的SQL内容。
-
如上述示例中的事务1,查询结果显示该线程执行了三条SQL:
update students set name=UUID() where id = 2(执行时间2938.377毫秒,锁等待时间1毫秒)、update students set name=UUID() where id = 3(执行时间0.002毫秒)以及begin。其中第一条update语句执行耗时异常,表明存在锁等待。 -
上述示例中的事务2(已回滚):在审计页面,设置时间范围并将线程ID设为
195662,单击查询。日志列表显示事务2的SQL执行记录:update students set name=UUID() where id = 3状态为失败(错误码1213,即死锁),耗时1.40 ms,锁等待时间1.152 ms;update students set name=UUID() where id = 2执行成功,耗时0.20 ms;begin执行成功,耗时0.18 ms。
-
全量死锁分析
-
参数设置:实例需开启
innodb_deadlock_detect、innodb_print_all_deadlocks参数。RDS MySQL实例需将log_error_verbosity参数值设置为3。说明参数
innodb_deadlock_detect通常默认为开启状态,可通过执行SHOW VARIABLES LIKE 'innodb_deadlock_detect'进行确认。需注意,部分类型的实例无法自行调整该参数的设置值。-
修改数据库实例参数:
-
RDS MySQL请参见设置实例参数。
-
PolarDB MySQL版请参见设置集群参数和节点参数。
-
-
-
分析数据:每小时解析实例错误日志中打印的死锁信息,统计死锁数量趋势以及各个死锁的详细信息。
-
冷却时间:当实例开启DAS运维服务(原经济版),识别到未开启所需参数时,会冷却12小时不进行分析。如果用户在冷却时间内开启了所需参数,也将在冷却时间后再次调度分析任务。例如:
-
实例11点12分的分析任务检测到参数未开启,将进行12小时的定时任务冷却,23点12分后全量死锁分析将再次调度该实例定时任务,如果实例参数仍未开启,将继续进行12小时的定时任务冷却;如果实例在23点12分之前开启了参数,在23点12分后将解除冷却,定时任务将每小时进行分析,直到实例关闭参数或关闭DAS运维服务(原经济版)。
-
不支持分析包含“TOO DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE WILL ROLL BACK FOLLOWING TRANSACTION”描述的死锁。
操作步骤
登录DAS控制台。
在左侧导航栏中,单击智能运维中心 > 实例监控。
找到目标实例,单击实例ID,进入目标实例详情页。
-
在左侧导航栏中,单击锁分析,在锁分析页面中死锁分析项选择全量死锁分析页签。
-
全量死锁分析每小时自动分析实例错误日志中打印的死锁日志,统计死锁数量并绘制为页面上方的死锁变化趋势图。选择时间段,查看该时间段内的死锁变化趋势。
页面上方提供近1天、近3天、近1周快捷按钮及自定义日期范围选择器,单击查看按钮刷新趋势图。趋势图下方为死锁事件列表,展示每条死锁发生时间,单击对应的查看详情可查看该死锁的详细信息。
查看详情
-
点击全量死锁分析中死锁列表详情列的查看详情。
-
弹出的抽屉页会显示对应死锁详细信息的三种查看方式(视图、列表、日志),其中,日志内容为死锁相关的错误日志。视图、列表展示形式与最近死锁分析一致,此处不再赘述,详情请参见最近死锁分析-查看详情。
结合SQL洞察和审计分析
与最近死锁分析一致,此处不再赘述,详情请参见最近死锁分析-结合SQL洞察和审计分析。