文档

SQL洞察

更新时间:

SQL洞察功能可对SQL进行健康情况诊断、性能问题排查。本文介绍在SQL洞察和审计中进行SQL洞察的操作步骤。

前提条件

  • 已在DAS中接入对应的数据库实例,并且接入状态显示为连接正常

  • 实例已开启SQL洞察和审计,详情请参见开启SQL洞察和审计

功能说明

开启SQL洞察功能可以记录所有DQL、DML和DDL操作信息,这些信息是通过数据库内核输出,对系统CPU消耗极低。

支持的数据库和地域

开启DAS企业版后,才可以使用该企业版提供的SQL洞察和审计功能,不同的企业版支持的数据库和地域不同。各个企业版支持的数据库和地域请参见各个版本支持的数据库和地域

注意事项

  • SQL洞察功能中分析和统计数据(不包括SQL明细数据)的存储时长为30天。

  • SQL洞察功能中SQL明细数据的存储时长与DAS企业版设置的存储时长一致。

  • 关闭SQL洞察和审计功能后,不会对业务产生影响,但是SQL洞察和审计的所有存储数据会被清空,请将数据导出并保存至本地后,再关闭SQL洞察和审计功能。详情请参见关闭SQL洞察和审计

  • 挂载到PolarDB-X 1.0(DRDS)的RDS MySQL实例执行一条SQL语句时,由于水平拆分(分库分表)原因,会在RDS MySQL实例上产生多条SQL日志。

  • 数据库实例的数据迁移会引起闪断,迁移期间SQL洞察丢失部分数据是符合预期的。

  • 当数据库实例负载非常高时,会丢失少量记录,因此通过SQL洞察来统计增量数据可能会出现不准确的情况。

  • SQL洞察中记录的SQL语句最大长度为8192字节,超过部分不再记录。其中RDS MySQLPolarDB MySQL版实例记录的SQL语句最大长度受参数控制:

    • 当参数取值小于等于8192字节时,SQL语句最大长度为参数设定值,超过部分不再记录。由于信息采集处理时会增加前缀标注,实际记录的SQL语句最大长度略小于参数设定值。

    • 当参数取值大于8192字节时,SQL语句最大长度为8192字节,超过部分不再记录。由于信息采集处理时会增加前缀标注,实际记录的SQL语句最大长度略小于8192字节。

    说明
    • RDS MySQLPolarDB MySQL版的5.6、5.7版本由loose_rds_audit_max_sql_size参数控制记录长度。

    • RDS MySQLPolarDB MySQL版的8.0版本由loose_rds_audit_log_event_buffer_size参数控制记录长度。

  • 对于RDS PostgreSQL实例,如果启用了PgBouncer连接池,通过PgBouncer执行的SQL不会被SQL洞察记录。

操作步骤

  1. 登录DAS控制台

  2. 在左侧导航栏中,单击实例监控

  3. 找到目标实例,单击实例ID,进入目标实例详情页。

  4. 在左侧导航栏单击请求分析 > SQL洞察和审计,然后在右侧打开的页面单击SQL洞察

  5. 根据需要选择对应的功能项:

    说明

    选择时间范围时,查询结束时间需晚于查询开始时间,且查询开始时间和查询结束时间的间隔不能超过1天。您可以查询数据库实例开启DAS企业版后,SQL洞察存储时长范围内任意一天的数据。

    • 区间查看:选择需要查看SQL洞察结果的时间范围,您可以查看选定时间范围内所有SQL的执行耗时分布执行耗时执行次数。您还可以在全量请求统计区域内查看选定时间范围内所有SQL的详细信息,并可以将其导出到本地。

      说明

      最多支持导出1000条SQL日志,如果您需要获取时间范围更大、数量更多的SQL日志,可以通过搜索(审计)功能。

    • 对比查看:选择需要对比SQL洞察结果的时间点,您可以查看所有SQL执行耗时分布执行耗时执行次数的对比结果。您还可以在请求对比列表区域内查看详细的对比结果。

    • 来源统计:选择需要统计SQL来源的时间范围,你可以查看选定时间范围内所有SQL的来源信息。

    • SQL Review:对选定区间与基准区间内的数据库实例进行workload分析,并且对数据库实例中运行的SQL进行深度分析,展示数据库实例的索引优化建议、SQL改写建议、TOP SQL、新增SQL、失败SQL、SQL特征分析、执行变化SQL、性能恶化SQL和TOP流量表。详情请参见SQL Review

    • 相关SQL识别:选择需要查看的指标,单击分析按钮,经过1~5分钟的时间,即可以定位到在选定时间范围内和相关指标变化趋势最相似的SQL及其详细信息。

    重要
    • 对于采用冷热混合存储的SQL洞察和审计,超过7天的SQL洞察和审计数据采用冷存储,分析7天前的SQL明细数据时,系统会创建对应的任务重新进行计算和分析,您可以在任务列表页面,查看任务进度及历史任务。

    • 查询分析超过7天的SQL洞察和审计数据,会按量收取查询费用,详情请参见产品计费

说明

  • 执行耗时分布:展示了选定时间范围内,所有SQL的执行耗时分布,将执行耗时分为了7个区间,每分钟计算一次,分别是:

    • [0,1]ms 是指满足0ms ≤ 执行耗时 ≤ 1ms SQL执行次数占比

    • (1,2]ms 是指1ms < 执行耗时 ≤ 2ms SQL执行次数占比

    • (2,3]ms 是指2ms < 执行耗时 ≤ 3ms SQL执行次数占比

    • (3,10]ms 是指3ms < 执行耗时 ≤ 10ms SQL执行次数占比

    • (10,100]ms 是指10ms < 执行耗时 ≤ 100ms SQL执行次数占比

    • (0.1,1]s 是指0.1s < 执行耗时 ≤ 1s SQL执行次数占比

    • >1s 是指1s < 执行耗时 SQL执行次数占比

    说明

    如果一个实例的执行耗时分布越接近蓝色,代表这个实例的SQL健康情况越好,越接近橙色和红色,代表这个实例的SQL健康情况越差。

  • 执行耗时(SQL RT):通过执行耗时,可以方便地查看在选定的时间范围内,SQL的执行耗时。

  • 全量请求统计:展示了选定时间范围内每一类SQL的SQL文本、耗时比例、平均执行耗时、执行趋势等信息。

    说明

    耗时比例=(该类SQL执行耗时 × 执行次数)/(所有SQL执行耗时 × 总执行次数)× 100%。耗时比例越高的SQL,占用MySQL资源越多。

  • SQL ID:单击SQL ID,您可查看该类SQL性能趋势、SQL样本等。

  • SQL样本:通过SQL样本,查看该SQL是由哪个应用端发起。

    说明

    SQL样本的编码采用UTF-8字符集。

常见问题

Q:SQL洞察全量请求统计区域中的logout!语句是什么?

A:logout!是指连接断开。logout!的耗时,是指上一次交互时间到logout!发生时间的差值,可以理解为连接空闲的时长。状态列的1158是指网络链接断开,其可能的原因是:

  • 客户端连接超时。

  • 服务端异常断开。

  • 服务端连接Reset(超过interactive_timeout或wait_timeout时长)。

Q:SQL洞察来源统计中,为什么会出现%访问来源

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:为什么日志列表中展示的数据库名称和SQL语句中的不一致?

A:日志列表中所展示的数据库名称是从会话中获取的,而SQL语句中的数据库名称则由用户指定,取决于用户的输入或查询的设计,例如跨数据库查询、动态SQL等场景。两者之间可能存在不一致的情况。

相关API

API

描述

GetErrorRequestSample

异步查询数据库实例SQL洞察结果中执行错误的SQL样本数据,最多返回指定时间范围内20条数据。

GetAsyncErrorRequestStatResult

异步获取数据库实例SQL洞察结果中指定SQL的执行错误次数。

GetAsyncErrorRequestListByCode

异步查询数据库实例SQL洞察结果中产生指定MySQL错误码的SQL ID。

GetAsyncErrorRequestStatByCode

异步查询数据库实例SQL洞察结果中的MySQL错误码以及每个错误码对应的SQL数量。

GetFullRequestOriginStatByInstanceId

按照访问来源统计数据库实例SQL洞察结果中的全量请求数据。

GetFullRequestStatResultByInstanceId

按照SQL ID异步统计数据库实例SQL洞察结果中的全量请求数据。

GetFullRequestSampleByInstanceId

按照SQL ID查询数据库实例SQL洞察结果中的SQL样本数据,最大返回20条样本数据。

GetDasSQLLogHotData

查询数据库实例7天内SQL洞察和审计的热存储数据明细。

最佳实践

处理慢SQL问题