使用DAS经济版进行锁分析

DAS经济版在基础版功能的基础上,增强了会话管理、锁分析和性能洞察等功能,并新增了空间碎片自动回收,使数据库运维更加高效便捷,帮助您7*24小时高效管理数据库,避免业务受阻的风险,有效保障线上业务的稳定性。本文介绍如何通过DAS经济版对RDS MySQL进行锁分析。

前提条件

已创建RDS MySQL实例。详情请参见快速使用RDS MySQL高可用版实例

重要

DAS经济版当前仅支持华东2(上海)地域,请在华东2(上海)地域创建RDS MySQL实例。

步骤一:构造数据

  1. 在目标RDS MySQL实例中创建名为das_test的测试数据库。详情请参见创建数据库

  2. 通过数据管理DMS(Data Management)登录RDS MySQL数据库,详情请参见通过DMS登录RDS数据库

  3. 在DMS的SQL窗口(SQL Console)执行如下命令,在数据库das_test中创建测试表students。

    CREATE TABLE `students` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `sid` char(64) NOT NULL COMMENT 'student id',
      `name` varchar(64) NOT NULL COMMENT 'name',
      `birth_date` date NOT NULL COMMENT 'birth date',
      `gender` char(16) NOT NULL COMMENT 'sex',
      `extra_info` varchar(1024) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_sid` (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
  4. 重复执行如下命令10次,在测试表students中写入测试数据。

    INSERT INTO students(sid, name, birth_date, gender, extra_info) VALUES(UUID(), SUBSTRING(UUID(), FLOOR(1+(RAND() * 18)), FLOOR(2+(RAND() * 16))), CONCAT(FLOOR(1990 + (RAND() * 20)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(1 + (RAND() * 27)),2,0)), 'female', UUID());
    
    INSERT INTO students(sid, name, birth_date, gender, extra_info) VALUES(UUID(), SUBSTRING(UUID(), FLOOR(1+(RAND() * 18)), FLOOR(2+(RAND() * 16))), CONCAT(FLOOR(1990 + (RAND() * 20)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(1 + (RAND() * 27)),2,0)), 'male', UUID());

步骤二:元数据锁分析与处理

  1. 通过MySQL命令行工具连接RDS MySQL数据库,构造会话一。详情请参见使用命令行连接

    1. 查询测试表students中的数据。

      SELECT id FROM students LIMIT 5;

      例如返回结果为:

      +----+
      | id |
      +----+
      |  1 |
      |  2 |
      |  3 |
      |  4 |
      |  5 |
      +----+
    2. 开启事务,并更新测试表students中的数据,但不提交事务。

      BEGIN;
      UPDATE students SET name=UUID() WHERE id =3 ;
  2. 构造会话二,执行如下语句为测试表students增加索引。

    ALTER TABLE students ADD INDEX idx_name(name);
  3. 构造会话三,执行如下语句查询测试表students中的数据。

    SELECT * FROM students WHERE id < 5;
  4. 登录DAS控制台,通过会话管理功能查看实例当前会话。详情请参见实例会话

    实例会话显示当前存在锁等待。

    image

  5. 单击查看详情,查看会话锁等待关系图。

    image

  6. 选择并结束可疑会话。

    image

  7. 刷新实例会话数据。可以观察到,查询语句已经执行完毕,DDL语句正在执行。

    说明

    如果测试表students上的数据较少,当可疑会话结束时,DDL语句会立即执行成功,将无法观察到。

    image

步骤三:事务阻塞关系分析

  1. 通过MySQL命令行工具连接RDS MySQL数据库,构造会话一。详情请参见使用命令行连接

    1. 查询测试表students中的数据。

      SELECT id FROM students WHERE id < 5;

      例如返回结果为:

      +----+
      | id |
      +----+
      |  1 |
      |  2 |
      |  3 |
      |  4 |
      +----+
    2. 开启事务,并更新测试表students中的数据,但不提交事务。

      BEGIN;
      UPDATE students SET name=UUID() WHERE id < 5;
  2. 构造会话二,执行如下语句更新会话一中更新过的数据。

    UPDATE students SET name=UUID() WHERE id = 1;
  3. 构造会话三,执行如下语句更新会话一中更新过的数据。

    UPDATE students SET name=UUID() WHERE id = 2;
  4. 登录DAS控制台,通过会话管理功能查看实例当前会话。详情请参见实例会话

    实例会话显示当前有两个事务处于LOCK WAIT状态。

    image

  5. 在锁等待统计区域,单击查看详情,查看会话锁等待关系图。

    image.png

  6. 在会话一中,执行如下命令提交事务。

    COMMIT;
  7. 查看实例当前会话,系统显示另外两个会话的更新语句已经执行完毕,并且已经没有处于LOCK WAIT状态的事务。

相关文档