tencent cloud

文档反馈

如何解决 MySQL 实例锁冲突问题

最后更新时间:2022-07-31 17:10:56

    问题描述

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

    解决方案

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

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

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

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

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

    场景二:“死锁”场景

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

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

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

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

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

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持