DAS经济版在基础版功能的基础上,增强了会话管理、锁分析和性能洞察等功能,并新增了空间碎片自动回收,使数据库运维更加高效便捷,帮助您7*24小时高效管理数据库,避免业务受阻的风险,有效保障线上业务的稳定性。本文介绍如何通过DAS经济版对RDS MySQL进行锁分析。
前提条件
已创建RDS MySQL实例。详情请参见快速使用RDS MySQL高可用版实例。
DAS经济版当前仅支持华东2(上海)地域,请在华东2(上海)地域创建RDS MySQL实例。
步骤一:构造数据
在目标RDS MySQL实例中创建名为das_test的测试数据库。详情请参见创建数据库。
通过数据管理DMS(Data Management)登录RDS MySQL数据库,详情请参见通过DMS登录RDS数据库。
在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
重复执行如下命令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());
步骤二:元数据锁分析与处理
通过MySQL命令行工具连接RDS MySQL数据库,构造会话一。详情请参见使用命令行连接。
查询测试表students中的数据。
SELECT id FROM students LIMIT 5;
例如返回结果为:
+----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | +----+
开启事务,并更新测试表students中的数据,但不提交事务。
BEGIN; UPDATE students SET name=UUID() WHERE id =3 ;
构造会话二,执行如下语句为测试表students增加索引。
ALTER TABLE students ADD INDEX idx_name(name);
构造会话三,执行如下语句查询测试表students中的数据。
SELECT * FROM students WHERE id < 5;
登录DAS控制台,通过会话管理功能查看实例当前会话。详情请参见实例会话。
实例会话显示当前存在锁等待。
单击查看详情,查看会话锁等待关系图。
选择并结束可疑会话。
刷新实例会话数据。可以观察到,查询语句已经执行完毕,DDL语句正在执行。
说明如果测试表students上的数据较少,当可疑会话结束时,DDL语句会立即执行成功,将无法观察到。
步骤三:事务阻塞关系分析
通过MySQL命令行工具连接RDS MySQL数据库,构造会话一。详情请参见使用命令行连接。
查询测试表students中的数据。
SELECT id FROM students WHERE id < 5;
例如返回结果为:
+----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+
开启事务,并更新测试表students中的数据,但不提交事务。
BEGIN; UPDATE students SET name=UUID() WHERE id < 5;
构造会话二,执行如下语句更新会话一中更新过的数据。
UPDATE students SET name=UUID() WHERE id = 1;
构造会话三,执行如下语句更新会话一中更新过的数据。
UPDATE students SET name=UUID() WHERE id = 2;
登录DAS控制台,通过会话管理功能查看实例当前会话。详情请参见实例会话。
实例会话显示当前有两个事务处于LOCK WAIT状态。
在锁等待统计区域,单击查看详情,查看会话锁等待关系图。
在会话一中,执行如下命令提交事务。
COMMIT;
查看实例当前会话,系统显示另外两个会话的更新语句已经执行完毕,并且已经没有处于LOCK WAIT状态的事务。