当数据库出现性能问题或异常操作时,通常需要结合数据库的会话信息,快速定位和解决数据库的问题。数据库自治服务DAS(Database Autonomy Service)的实例会话功能,支持实时查看目标实例的会话信息,并提供会话运维操作,例如结束会话、10秒SQL分析、SQL限流以及优化等。
前提条件
目标数据库实例已接入DAS,并且接入状态显示为接入正常。
说明 当前不支持RDS SQL Server数据库实例。
操作步骤
本文以RDS MySQL为例介绍如何使用实例会话功能。
登录DAS控制台。
在左侧导航栏中,单击实例监控。
找到目标实例,单击实例ID,进入目标实例详情页。
在左侧导航栏,单击实例会话。
在会话管理页面,可以查看目标实例当前的实例会话和会话统计等详细信息。
您可以在实例会话区域进行如下操作:
查看实例会话信息:可以查看异常、活跃会话、最大执行时间、CPU使用率和连接使用率等信息。
10秒SQL分析:单击页面右上角的10秒SQL分析,在弹出的对话框内查看10秒内的SQL统计、慢日志及SQL概览等信息,详细信息请参见10秒SQL分析。
SQL限流:单击SQL限流,在弹出的SQL限流页面配置限流参数,对符合限流条件的实例会话进行SQL限流,详细操作请参见SQL限流。
优化:单击优化,对目标实例会话进行优化,详细操作请参见SQL优化。
导出活跃会话。
结束会话。
结束会话时,需要输入建立该会话的数据库账号和密码。您也可以使用更高权限的数据库账号(具有结束其他账号建立的会话的权限),例如高权限账号。
您可以在会话统计区域进行如下操作:
常见问题
Q:为什么会出现%的访问来源?
A:该情况可能在您使用存储过程时出现。按如下示例可以复现这种情况:
说明 示例中数据库实例为RDS MySQL,测试账号为test_user,测试数据库为testdb。
在RDS控制台创建普通权限账号及其授权的数据库,详细操作请参见创建数据库和账号。
使用测试账号通过命令行方式连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例。
切换到测试数据库,并创建如下存储过程。
-- 切换到测试数据库
USE testdb;
-- 创建存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS `das` $$
CREATE DEFINER=`test_user`@`%` PROCEDURE `das`()
BEGIN
SELECT * FROM information_schema.processlist WHERE Id = CONNECTION_ID();
END $$
DELIMITER;
使用高权限账号连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例。
调用存储过程。
-- 切换到测试数据库
USE testdb;
-- 调用存储过程
CALL das();
+--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+
| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |
+--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+
| 487818 | test_user | %:2065 | testdb | Query | 0 | executing | SELECT * FROM information_schema.processlist WHERE Id = CONNECTION_ID() |
+--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+
Q:对于RDS MySQL和PolarDB MySQL版实例,哪些会话会被标记为异常?
A:如下的会话会被标记为异常:
会话包含阻塞型SQL(执行时间超过30秒的SQL),例如报“Waiting for table metadata lock”的会话。阻塞型SQL会长时间占用资源,从而导致其他SQL无法正常执行。常见的阻塞型SQL,如:FLUSH TABLES WITH READ LOCK,悬挂事务导致DDL语句等待元数据锁等。
会话中的事务持续时间超过30s。
会话中包含长时间未提交的事务。如果一个会话中开启了事务,但是超过10秒未执行任何新的SQL,很可能是代码中遗漏了COMMIT命令,这可能导致事务一直持有资源,无法及时释放资源。