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