有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 数据库智能管家 DBbrain > 最佳实践 > 如何解决 MySQL 实例锁冲突问题

问题描述

锁冲突问题一直是 MySQL 数据库业务经常遇到的问题,锁冲突问题在不同场景下表现也大不相同,某些场景下可能直接导致业务瘫痪,而某些场景下业务侧可能很难感知,出现数据错乱等情况。n锁冲突场景的多样性、复杂性以及隐秘性,决定了要解决这一类问题对数据库管理员的技术和能力要求极高,同时处理锁冲突故障的时效性也会大打折扣。
数据库智能管家 DBbrain 提供的异常诊断功能,包含了数十个锁相关诊断项,涵盖了死锁、等待行锁、出现表锁、只读锁、DDL/select/DML等待锁、SQL 等待 MDL 锁等多个锁冲突场景,能够高效、便捷、专业化地帮助用户解决锁冲突的问题。n本文以常见的“等待行锁”和“死锁”为案例,介绍如何使用 DBbrain 解决锁冲突问题。

解决方案

场景一:“等待行锁”场景

步骤一:查看“等待行锁”事件

方式1:
1. 登录 DBbrain 控制台,在左侧导航选择监控告警 > 异常告警页。
2. 选择需要查看的时间范围,在诊断项列,选择等待行锁进行过滤。
3. 列表会展示实例出现等待行锁的事件列表,单击操作列的详情可进入事件详情页。n
?
?
方式2:
1. 登录 DBbrain 控制台,在左侧导航选择诊断优化,然后选择异常诊断页。
2. 在上方选择对应实例,然后选择实时(默认动态更新)或历史(可自定义)时间段。
3. 查看诊断提示栏中是否存在“等待行锁”的事件,单击事件可进入事件详情页。n
?
?

步骤二:解决“等待行锁”事件

1. 进入事件详情页后,在现象描述页,了解出现“等待行锁”事件时,数据库中语句的运行情况。n
?
?
2. 切换至智能分析页,查看出现“等待行锁”事件的原因。
等待行锁事务中,清晰显示被阻塞的事务语句情况,例如下图中的 delete 语句,是处于 LOCK WAIT 状态。n
?
?
根据持有锁事务结果,快速定位目前持有行锁的事务当前状态以及 ID。n
?
?
性能监控曲线中,直观展示出等待行锁次数的趋势。n
?
?
3. 切换至专家建议页,根据提示解决锁冲突问题。例如,通过使用 kill 命令,中止会话3965158来释放锁,解决本案例中的锁冲突问题。n
?
?

场景二:“死锁”场景

注意
由于 MySQL 具有“死锁”监测和自动事务回滚的能力,故大多数“死锁”场景可自愈,业务无感知,但由于业务逻辑不够健壮或极端情况下也会导致系统雪崩 ,以及数据不一致等后果,故对于出现死锁的情况也需足够重视。

步骤一:查看“死锁”事件

方式1:
1. 登录 DBbrain 控制台,在左侧导航选择监控告警 > 异常告警页。
2. 选择需要查看的时间范围,在诊断项列,选择死锁进行过滤。
3. 列表会展示实例出现“死锁”的事件列表,单击操作列的详情可进入事件详情页。n
?
?
方式2:
1. 登录 DBbrain 控制台,在左侧导航选择诊断优化,然后选择异常诊断页。
2. 在上方选择对应实例,然后选择实时(默认动态更新)或历史(可自定义)时间段。
3. 查看诊断提示栏中是否存在“死锁”的事件,单击事件可进入事件详情页。n
?
?

步骤二:解决“死锁”事件

进入事件详情页后,在现场描述页,通过分析如下信息优化对应语句,来解决“死锁”事件。
发生时间以及来源 IP,便于溯源。
发生死锁的两条 SQL 语句,例如下图的两条 INSERT INTO 语句。
根据 Status 字段状态,判断哪条语句回滚(Rollback),哪条语句正常执行(Normal)。
(可选)根据 LockRequest、LockHold 信息分析具体锁的持有和类型。
?
?
?


http://www.vxiaotou.com