会话管理

当数据库出现性能问题或异常操作时,通常需要结合数据库的会话信息,快速定位和解决数据库的问题。数据库自治服务DAS(Database Autonomy Service)的实例会话功能,支持实时查看目标实例的活跃会话、异常会话、会话访问来源和SQL语句等信息,并提供结束会话、SQL限流、SQL诊断优化等运维操作。

前提条件

实例为如下版本:

  • RDS MySQL 8.0 高可用系列或集群系列

  • RDS MySQL 5.7 高可用系列或集群系列

  • RDS MySQL 5.6 高可用系列

  • RDS MySQL 5.5 高可用系列

操作步骤

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏中,选择自治服务 > 一键诊断

  3. 单击会话管理页签。

  4. 会话管理页面,可以查看目标实例当前的实例会话会话统计等详细信息。

    • 您可以在实例会话区域进行如下操作:

      • 查看实例会话信息:可以查看异常、活跃会话、最大执行时间、CPU使用率和连接使用率等信息。

      • 10秒SQL分析:单击页面右上角的10秒SQL分析,在弹出的对话框内查看10秒内的SQL统计、慢日志及SQL概览等信息,详细信息请参见10秒SQL分析

      • SQL限流:单击SQL限流,在弹出的SQL限流页面配置限流参数,对符合限流条件的实例会话进行SQL限流,详细操作请参见SQL限流

      • 优化:单击优化,在弹出的SQL诊断优化对话框中,查看SQL诊断结果。

        若您采纳诊断建议,单击页面右上角的复制,并将优化后的SQL粘贴到数据库客户端或DMS上执行,若不采纳诊断建议,可直接单击取消结束诊断。

        说明

        DAS会根据SQL的复杂程度、对应表的数据量、数据库负载等进行SQL诊断,诊断建议的返回时间可能会超过20秒。完成诊断后,SQL诊断引擎会给出诊断结果、优化建议和预期优化收益,您可以根据诊断结果确认是否采纳建议。

      • 导出活跃会话。

      • 结束会话。

        结束会话时,需要输入建立该会话的数据库账号和密码。您也可以使用更高权限的数据库账号(具有结束其他账号建立的会话的权限),例如高权限账号

        说明
        • 在会话列表的用户列,可以查看建立目标会话的数据库账号。

        • 单击结束会话历史记录,查看结束会话的历史记录。

    • 您可以在会话统计区域进行如下操作:

      • 查看会话统计信息:可以查看会话概要(如会话总数、运行中会话总数和运行中会话最长时间),查看按用户、按访问来源和按数据库等条件统计的会话总数及活跃数。

      • 导出会话统计信息:可以按概要、按用户统计、按访问来源统计和按数据库统计等条件导出会话统计信息。

    • 您可以单击开启自动限流按钮,开启自动SQL限流功能。当数据库实例满足设定的限流条件时会自动触发SQL限流,帮助您自动控制数据库请求访问量和SQL并发量,保障服务的可用性,详情请参见自动SQL限流

常见问题

Q:为什么会出现%访问来源

A:该情况可能在您使用存储过程时出现。按如下示例可以复现这种情况:

说明

示例中数据库实例为RDS MySQL,测试账号为test_user,测试数据库为testdb。

  1. 在RDS控制台创建普通权限账号及其授权的数据库,详细操作请参见创建数据库和账号

  2. 使用测试账号通过命令行方式连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例

  3. 切换到测试数据库,并创建如下存储过程。

    -- 切换到测试数据库
    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;
  4. 使用高权限账号连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例

  5. 调用存储过程。

    -- 切换到测试数据库
    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:哪些会话会被标记为异常

A:如下的会话会被标记为异常:

  • 会话包含阻塞型SQL(执行时间超过30秒的SQL),例如报“Waiting for table metadata lock”错误的会话。阻塞型SQL会长时间占用资源,从而导致其他SQL无法正常执行。常见的阻塞型SQL包括DDL和FLUSH TABLES WITH READ LOCK等。

  • 会话中的事务持续时间超过30s。

  • 会话中包含长时间未提交的事务。如果一个会话中开启了事务,但是超过10秒未执行任何新的SQL,很可能是代码中遗漏了COMMIT命令,这可能导致事务一直持有资源,无法及时释放资源。

相关文档

您可以启用DAS的自治功能,对实例会话中的SQL进行自动诊断治理。