
# 使用DAS进行锁分析
DAS的DBA智能运维功能包含元数据锁、Innodb锁等待、最近死锁分析和全量死锁分析功能。本文介绍如何通过DAS对RDS for MySQL进行锁分析。
#### 前提条件
已创建RDS for MySQL实例。
#### 操作步骤
1. 构造数据。 
   1. 在目标RDS for MySQL实例中创建名为das_test的测试数据库，详情请参见[创建数据库](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0019.html)。
   
   2. 通过数据管理服务DAS登录RDS for MySQL数据库，详情请参见[登录华为云数据库实例](https://support.huaweicloud.com/usermanual-das/das_01_2100.html)。
   
   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)* **;**
      
   
   
   ![](https://support.huaweicloud.com/bestpractice-das/public_sys-resources/note_3.0-zh-cn.png)
   数据构造完成后：
   - 如您需要元数据锁分析与处理，请执行[2]。
   
   - 如您需要Innodb锁等待分析，请执行[3]。
   
   - 如您需要最近死锁分析，请执行[4]。
   
   - 如您需要全量死锁分析，请执行[5]。
    
   
   
2. 元数据锁分析与处理。
   
   ![](https://support.huaweicloud.com/bestpractice-das/public_sys-resources/note_3.0-zh-cn.png)
   - 元数据锁(Meta Data Lock, MDL)，其作用是用于解决DDL操作与DML操作的一致性；通常，DDL操作需要获取MDL写锁，并且MDL锁一旦发生，就可能会对数据库的性能造成影响，因为后续对该表的任何Select、DML、DDL操作都会被阻塞，造成连接积压。
   
   - 当前功能展示了当前时刻(实时)数据库的MDL锁的信息，可以快速帮助定位MDL问题、终止持有MDL锁的会话，从而恢复被阻塞的操作。
   
   - DML锁不在当前功能的范围之内，可以使用Innodb锁等待进行分析和查看。
   
   - 最多显示1000条数据。
    
   1. [登录华为云数据库实例](https://support.huaweicloud.com/usermanual-das/das_01_2100.html)，通过SQL查询构造会话一。
      1. 查询测试表shopping中的数据。 **select** *a* **from** *shopping* **;**
         返回结果为：
         图1查询测试表数据   
         ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123459601.png) 
      
      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元数据锁   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002087983812.png) 
   
   5. 选择目标会话，单击"Kill会话"。
      图3选择目标元数据锁   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002124772113.png) 
   
   6. 刷新元数据锁列表。可以观察到，查询语句已经执行完毕，DDL语句正在执行。
      ![](https://support.huaweicloud.com/bestpractice-das/public_sys-resources/note_3.0-zh-cn.png)
      如果测试表shopping上的数据较少，当语句被kill后，DDL语句会立即执行成功，将无法观察到。
      图4元数据锁kill后列表   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123492529.png) 
   
   
   
   
3. Innodb锁等待分析。
   
   ![](https://support.huaweicloud.com/bestpractice-das/public_sys-resources/note_3.0-zh-cn.png)
   - 当前功能展示了当前时刻（实时）数据库的DML操作之前的锁等待的信息，可以快速帮助定位多个会话因同时更新同一条数据，而产生的会话等待和阻塞，并且支持快速终止持有锁的源头会话，从而恢复被阻塞的操作。
   
   - DDL锁不在当前功能的范围之内，可以使用元数据锁进行分析和查看。
    
   1. [登录华为云数据库实例](https://support.huaweicloud.com/usermanual-das/das_01_2100.html)，通过SQL查询构造会话一。
      1. 查询测试表shopping中的数据。 **select** *a* **from** *shopping* **;**
         返回结果为：
         图5查询测试表数据   
         ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123459601.png) 
      
      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锁等待。
      图6Innodb锁等待   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002087871542.png) 
   
   6. 在会话一中，执行如下命令提交事务。 **COMMIT;**
      
   
   7. 查看Innodb锁等待，页面无锁等待内容。
   
   
   
   
4. 最近死锁分析。
   
   ![](https://support.huaweicloud.com/bestpractice-das/public_sys-resources/note_3.0-zh-cn.png)
   - 此功能基于SHOW ENGINE INNODB STATUS返回的最近一次死锁日志进行分析。如果发生过多次死锁，只会对最近一次死锁进行分析。
   
   - 需要开启innodb_deadlock_detect（仅针对版本为5.7的实例）参数。
    
   1. [登录华为云数据库实例](https://support.huaweicloud.com/usermanual-das/das_01_2100.html)，通过SQL查询测试表shopping中的数据。
      **select** *a* **from** *shopping* **;**
      返回结果为：
      图7查询测试表数据   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123459601.png) 
   
   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最近死锁   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123563733.png) 
   
   5. 单击"操作 \> 查看详情"，可以看到解析列表和原始日志。
      图9最近死锁查看详情   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123566693.png) 
   
   
   
   
5. 全量死锁分析。
   
   ![](https://support.huaweicloud.com/bestpractice-das/public_sys-resources/note_3.0-zh-cn.png)
   - 此功能定时对错误日志进行分析，解析其中的死锁信息，并进行全面的死锁分析。
   
   - 依赖参数：
     - 需要开启innodb_deadlock_detect（仅针对版本为5.7的实例）参数。
     
     - 需要开启innodb_print_all_deadlocks参数，并将log_error_verbosity（仅针对版本除5.7之外的实例）参数值设置为3。
      
   
   - 最多显示10000条数据。
    
   1. [登录DAS管理控制台](https://console.huaweicloud.com/das/#/das/overview)。
   
   2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002088097014.png)，选择区域和项目。
   
   3. 在左侧的导航栏中单击"DBA智能运维 \> 实例列表"页签，进入DBA智能运维实例列表页面。
   
   4. 选择目标实例，单击"详情"，选择"锁\&事务 \> 锁分析 \> 全量死锁分析"，打开全量死锁分析开关。
   
   5. 在左侧导航栏中，单击"开发工具"，进入开发工具页面。 您也可以在产品概览页面，单击"进入开发工具"，进入开发工具页面。
      
   
   6. 选择需要登录的目标数据库，单击操作列表中的"登录"，通过SQL查询测试表shopping中的数据。 **select** *a* **from** *shopping* **;**
      返回结果为：
      图10查询测试表数据   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123459601.png) 
   
   7. 通过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); | -                                      |
      | -                                      | 产生死锁                                   |
         
      
   
   8. 查看全量死锁分析列表。
      图11全量死锁   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002088058196.png) 
   
   9. 单击"操作 \> 查看详情"，可以看到解析列表和原始日志。
      图12全量死锁详情   
      ![](https://support.huaweicloud.com/bestpractice-das/zh-cn_image_0000002123698969.png) 
   
   
   
   
 
