文档首页/ 数据管理服务 DAS/ 最佳实践/ 使用DAS进行锁分析
更新时间:2024-11-26 GMT+08:00

使用DAS进行锁分析

DAS的DBA智能运维功能包含元数据锁、Innodb锁等待、最近死锁分析和全量死锁分析功能。本文介绍如何通过DAS对RDS for MySQL进行锁分析。

前提条件

已创建RDS for MySQL实例。

操作步骤

  1. 构造数据。

    1. 在目标RDS for MySQL实例中创建名为das_test的测试数据库,详情请参见创建数据库
    2. 通过数据管理服务DAS登录RDS for MySQL数据库,详情请参见登录华为云数据库实例
    3. 在DAS的SQL查询执行如下命令,在数据库das_test中创建测试表shopping。

      CREATE TABLE shopping (

      a int NOT NULL AUTO_INCREMENT,

      b int,

      c int,

      PRIMARY KEY (a),

      UNIQUE KEY u_k (b, c)

      );

    4. 执行如下命令,在测试表shopping中写入测试数据。

      insert into shopping(b,c) values(1,1),(1,5),(1,9);

    数据构造完成后:
    • 如您需要元数据锁分析与处理,请执行2
    • 如您需要Innodb锁等待分析,请执行3
    • 如您需要最近死锁分析,请执行4
    • 如您需要全量死锁分析,请执行5

  2. 元数据锁分析与处理。

    • 元数据锁(Meta Data Lock, MDL),其作用是用于解决DDL操作与DML操作的一致性;通常,DDL操作需要获取MDL写锁,并且MDL锁一旦发生,就可能会对数据库的性能造成影响,因为后续对该表的任何Select、DML、DDL操作都会被阻塞,造成连接积压。
    • 当前功能展示了当前时刻(实时)数据库的MDL锁的信息,可以快速帮助定位MDL问题、终止持有MDL锁的会话,从而恢复被阻塞的操作。
    • DML锁不在当前功能的范围之内,可以使用Innodb锁等待进行分析和查看。
    • 最多显示1000条数据。
    1. 登录华为云数据库实例,通过SQL查询构造会话一。
      1. 查询测试表shopping中的数据。

        select a from shopping;

        返回结果为:

        图1 查询测试表数据
      2. 开启事务,并更新测试表shopping中的数据,但不提交事务。

        BEGIN;

        UPDATE shopping SET b = 3 WHERE a =1;

    2. 构造会话二,执行如下语句为测试表shopping增加索引。

      ALTER TABLE shopping ADD INDEX idx_name(b);

    3. 返回DAS首页,在左侧的导航栏中单击DBA智能运维 > 实例列表页签,进入DBA智能运维实例列表页面。
    4. 选择目标实例,单击“详情”,选择“锁&事务 > 锁分析 > 元数据锁”,列表展示当前实例的元数据锁。
      图2 元数据锁
    5. 选择目标会话,单击“Kill会话”。
      图3 选择目标元数据锁
    6. 刷新元数据锁列表。可以观察到,查询语句已经执行完毕,DDL语句正在执行。

      如果测试表shopping上的数据较少,当语句被kill后,DDL语句会立即执行成功,将无法观察到。

      图4 元数据锁kill后列表

  3. Innodb锁等待分析。

    • 当前功能展示了当前时刻(实时)数据库的DML操作之前的锁等待的信息,可以快速帮助定位多个会话因同时更新同一条数据,而产生的会话等待和阻塞,并且支持快速终止持有锁的源头会话,从而恢复被阻塞的操作。
    • DDL锁不在当前功能的范围之内,可以使用元数据锁进行分析和查看。
    1. 登录华为云数据库实例,通过SQL查询构造会话一。
      1. 查询测试表shopping中的数据。

        select a from shopping;

        返回结果为:

        图5 查询测试表数据
      2. 开启事务,并更新测试表shopping中的数据,但不提交事务。

        BEGIN;

        UPDATE shopping SET b = 100 WHERE a < 5;

    2. 构造会话二,执行如下语句更新会话一种更新过的语句。

      UPDATE shopping SET b = 3 WHERE a = 1;

    3. 构造会话三,执行如下语句更新会话一种更新过的语句。

      UPDATE shopping SET b = 4 WHERE a = 2;

    4. 返回DAS首页,在左侧的导航栏中单击DBA智能运维 > 实例列表页签,进入DBA智能运维实例列表页面。
    5. 选择目标实例,单击“详情”,选择“锁&事务 > 锁分析 > Innodb锁等待”,页面展示当前实例的Innodb锁等待。
      图6 Innodb锁等待
    6. 在会话一中,执行如下命令提交事务。

      COMMIT;

    7. 查看Innodb锁等待,页面无锁等待内容。

  4. 最近死锁分析。

    • 此功能基于SHOW ENGINE INNODB STATUS返回的最近一次死锁日志进行分析。如果发生过多次死锁,只会对最近一次死锁进行分析。
    • 需要开启innodb_deadlock_detect(仅针对版本为5.7的实例)参数。
    1. 登录华为云数据库实例,通过SQL查询测试表shopping中的数据。

      select a from shopping;

      返回结果为:

      图7 查询测试表数据
    2. 通过DAS的SQL查询新建会话一和会话二,并构造死锁场景。
      表1 构造死锁场景

      会话一

      会话二

      begin;

      begin;

      insert into shopping(b,c) values(1,8);

      -

      -

      insert into shopping(b,c) values(1,8);

      insert into shopping(b,c) values(1,6);

      -

      -

      产生死锁

    3. 返回DAS首页,在左侧的导航栏中单击DBA智能运维 > 实例列表页签,进入DBA智能运维实例列表页面。
    4. 选择目标实例,单击“详情”,选择“锁&事务 > 锁分析 > 最近死锁”,单击“创建锁分析”并刷新页面,查看列表。
      图8 最近死锁
    5. 单击“操作 > 查看详情”,可以看到解析列表和原始日志。
      图9 最近死锁查看详情

  5. 全量死锁分析。

    • 此功能定时对错误日志进行分析,解析其中的死锁信息,并进行全面的死锁分析。
    • 依赖参数:
      • 需要开启innodb_deadlock_detect(仅针对版本为5.7的实例)参数。
      • 需要开启innodb_print_all_deadlocks参数,并将log_error_verbosity(仅针对版本除5.7之外的实例)参数值设置为3。
    • 最多显示10000条数据。
    1. 登录管理控制台
    2. 单击管理控制台左上角的,选择区域和项目。
    3. 单击页面左上角的,选择“数据库 > 数据管理服务 DAS”,进入数据管理服务页面。
    4. 在左侧的导航栏中单击DBA智能运维 > 实例列表页签,进入DBA智能运维实例列表页面。
    5. 选择目标实例,单击“详情”,选择“锁&事务 > 锁分析 > 全量死锁分析”,打开全量死锁分析开关。
    6. 在左侧导航栏中,单击“开发工具”,进入开发工具页面。

      您也可以在产品概览页面,单击“进入开发工具”,进入开发工具页面。

    7. 选择需要登录的目标数据库,单击操作列表中的“登录”,通过SQL查询测试表shopping中的数据。

      select a from shopping;

      返回结果为:

      图10 查询测试表数据
    8. 通过SQL查询新建会话一和会话二,并构造死锁场景。
      表2 构造死锁场景

      会话一

      会话二

      begin;

      begin;

      insert into shopping(b,c) values(1,8);

      -

      -

      insert into shopping(b,c) values(1,8);

      insert into shopping(b,c) values(1,6);

      -

      -

      产生死锁

    9. 查看全量死锁分析列表。
      图11 全量死锁
    10. 单击“操作 > 查看详情”,可以看到解析列表和原始日志。
      图12 全量死锁详情