【华为云MySQL技术专栏】RDS for MySQL 全量SQL模块特性解读

举报
GaussDB 数据库 发表于 2025/07/21 09:59:48 2025/07/21
【摘要】 1、背景介绍在MySQL数据库生产环境中,记录SQL语句和相关信息(如:执行开始时间、错误码、执行时长、锁等待时长等)可用于风险识别(如跨大版本迁移前验证)、性能分析、问题定位等。基于上述需求,华为云RDS开发了全量SQL组件,用于记录数据库在运行过程中执行SQL的详细信息。全量SQL是数据库侧提供的轻量化审计组件,可以在尽可能减小对数据库性能影响的前提下,记录数据库执行的所有SQL语句。该...

1、背景介绍

在MySQL数据库生产环境中,记录SQL语句和相关信息(如:执行开始时间、错误码、执行时长、锁等待时长等)可用于风险识别(如跨大版本迁移前验证)、性能分析、问题定位等。

基于上述需求,华为云RDS开发了全量SQL组件,用于记录数据库在运行过程中执行SQL的详细信息。全量SQL是数据库侧提供的轻量化审计组件,可以在尽可能减小对数据库性能影响的前提下,记录数据库执行的所有SQL语句。该组件提供了轻量化的审计功能,开启后,可将性能损耗控制在5%以内。

本文将以RDS for MySQL 5.7为对象,对全量SQL模块的功能和原理进行解析。

2、功能参数介绍

RDS for MySQL 5.7实例中开启全量SQL功能后,用户可以通过执行SQL语句`SHOW VARIABLES LIKE '%tracer%';`,来查看当前实例与全量SQL功能相关的变量名及对应的参数值。

具体的全量SQL相关参数见下表。

截图1.PNG全量 SQL功能参数说明

全量SQL功能由参数rds_sql_tracer进行控制。当该参数设置为打开状态时,实例将启用全量SQL审计模块,并启动记录功能。

此外,当开启rds_sql_tracer_reserve_big_records参数时,超过4096字节长度的SQL记录也将被完整记录至全量SQL日志文件中。

反之,若未开启该参数,则超过4096字节的SQL语句记录将会被默认丢弃,不会写入到日志文件中。

3、日志内容解析

 RDS for MySQL 5.7中,全量SQL记录详尽地记录了SQL执行过程中的每个关键环节,例如SQL的执行起始时间、SQL类型、执行线程ID等。

这些记录能够实现对SQL执行全过程的精准捕捉。完整的全量SQL记录由32个字段构成,每个字段均对应SQL执行的一个具体属性,从而确保了细节信息的全面与准确。下面将对每个字段的具体含义和作用进行详细说明。

截图2.PNG

全量 SQL记录字段说

从表中可以看到,全量SQL的日志详细记录了一条SQL执行过程中的各种状态信息,这将有助于问题的快速定位。

4、全量SQL原理浅析

当数据库执行完一条SQL语句后,如果全量SQL功能处于开启状态,系统将首先调用 sql_tracer::is_applicable 函数来判断该SQL请求是否属于需要采集的命令类型。

▶ 对于非SQL操作类命令(例如连接建立、Ping、Quit 等),以及明确排除的协议级指令(例如用于主从复制的 COM_BINLOG_DUMP、主从注册的 COM_REGISTER_SLAVE 等),全量 SQL 模块会直接跳过,不进行采集。

▶ 若经过判断,该请求属于需要采集的类型,系统则调用 sql_tracer::mmap_write 接口,将该SQL语句相关信息写入内部的环形缓冲区,正式进入全量SQL日志采集链路。

在全量SQL模块内部,采用了一个由8192个节点(window_node)组成的环形滑动窗口数组,用于标记每条SQL记录在缓冲区中的写入状态。每个节点(node)主要包含三个关键字段:起始逻辑位置(start)、记录长度(len)和状态(state)。节点状态分为两种:

▶ TRACER_NODE_USED:该节点正在被写入数据,未完成数据准备,不可消费。

▶ TRACER_NODE_FREE:该节点的数据已完成写入,状态稳定,可以被外部消费(例如日志读取线程)。

全量SQL的滑动窗口数据结构如图1所示。

截图3.PNG

环形滑动窗口数组

为了准确追踪当前日志的写入与消费位置,全量SQL模块还使用了两个关键的水位指针进行标记:

▶ 高水位指针(HWL生产者的写入指针,标识着当前尚未被消费者消费的数据。

▶ 低水位指针(LWL表示下一个已经完成写入并可以安全供外部消费的节点位置。

当全量SQL模块准备向环形缓冲区写入新的SQL记录时,首先会尝试获取缓冲区相关的锁资源,确保数据更新过程的线程安全。一旦成功获取到锁,系统会推动低水位指针(lwl)向前移动,直至最新已完成写入的节点位置。

与此同时,系统会根据当前低水位指针的位置,更新当前逻辑写入位置(write_pos)。write_pos 作为逻辑位置标记,严格保持单调递增的特性,确保消费端读取日志的顺序性与一致性。

while(window_nodes[(lwl + 1) & MAX_SQL_TRACER_NODE_SIZE_MOD].state
           == TRACER_NODE_FREE
           && hwl > lwl) {
      lwl++;
    }
    meta->write_pos =
        window_nodes[lwl & MAX_SQL_TRACER_NODE_SIZE_MOD].start +
        window_nodes[lwl & MAX_SQL_TRACER_NODE_SIZE_MOD].len;

在更新完低水位指针与 write_pos等状态信息后,全量SQL模块会判断当前 SQL记录是否会超出缓冲区尾部(通过 write_offset + record_length 是否超过 buffer size 进行判断)

▶ 如果记录可以完全容纳在缓冲区尾部,系统会直接将数据连续拷贝到对应的位置。

▶ 但若记录跨越缓冲区尾部,系统则需要进行缓冲区回卷(do rolling)操作。这时,全量SQL会先将日志数据写入临时缓冲区(tmp_buf),或通过thd->alloc动态申请内存空间(rolling_buf),然后再将该记录拆分成两部分,分别写入缓冲区尾部和头部的位置,以实现逻辑上的连续拼接。

在全量SQL完成记录的复制工作后,全量SQL的文件写入通过mmap完成——利用mmap,将磁盘文件映射到进程的地址空间,日志数据可直接从内存缓冲区更新到映射的文件区域,从而大幅减少传统文件I/O操作中频繁的系统调用和内存拷贝开销。

此外,mmap能借助操作系统的虚拟内存管理和缓存机制,在高并发写入场景下有效降低写入延迟和资源竞争风险,确保日志数据以高效、连续和一致的方式持久化到磁盘。这种方式为全量SQL模块在处理大规模日志记录时提供了重要的性能和稳定性保障。

为了实现日志的高效读写协调,全量SQL模块通过write_posread_pos两个单调递增的逻辑地址分别标记日志在环形缓冲区中的写入位置和读取位置。这两个位置的指针信息通过结构体 mmap_offset_st 对外进行统一展示:

▶ write_pos表示当前已写入日志的逻辑位置,严格单调递增;

 read_pos表示当前已消费日志的逻辑位置,同样严格单调递增。

/* Shared memory metadata information. It contains the written and * read positions. Mod the read/write position according to the buffer * size to get the read/write offset. */
typedef struct mmap_offset_st {
    // write_pos:对窗口中当前节点的 start + len 计算得出,表示“写到哪里为止”。
    ulonglong write_pos;
      // read_pos 表示消费者已经读取到的位置。
    ulonglong read_pos;
    } mmap_offset_st;

● RDS for MySQL的实际运行过程中,Agent线程(日志消费端)首先从write_pos读取当前日志写入的最新位置,而不会对其做出任何修改。当 Agent 完成相应日志记录的读取与解析之后,则更新相应的 read_pos值。

● 而全量SQL模块在新日志写入前,则会依据当前最新的read_pos判断缓冲区内是否有足够空间容纳新的日志记录。这种设计确保了读写操作的协调一致,有效提升了日志数据的处理效率和顺序性。

总的来说,全量SQL功能在RDS for MySQL中发挥着关键性作用。系统通过设定高水位(HWL)和低水位(LWL的双指针机制,实现了对SQL事件写入环形缓冲区的精细化调度和精准控制。

具体而言,在日志采集过程中,系统会根据当前日志的写入与读取进度,动态调整采集节奏,确保在高并发场景下既保持高效的数据采集效率,又不会因日志采集压力而影响数据库系统的整体运行负载。全量SQL不仅能完整记录执行过的SQL ,而且实现了日志采集效率与系统负载之间的最佳平衡。下面的全量SQL总体流程图直观则展示了这一高效机制的各个环节。

截图4.PNG

全量SQL流程图

5、使用说明

数据库实例开启全量SQL洞察

用户可以登录管理控制台,在云数据库RDS for MySQL实例管理页面,单击目标实例名称,进入基本信息页面。在左侧导航栏,点击“DBA智能运维,在弹出的下拉列表中选择“全量SQL洞察”,在弹框中选择实例,进入全量SQL洞察界面。单击开启DAS收集全量SQL”,可获取当前实例所执行过的SQL信息。

截图5.PNG

数据库开启全量SQL洞察

全量SQL洞察的使用

用户在开启全量SQL采集后,DAS模块将完整记录所有SQL执行信息,并基于这些数据提供强大的分析能力。通过多维度的SQL分析、智能检索和精准过滤功能,系统可帮助您深度洞察数据库运行状况,快速定位TOP SQL性能问题,及时排查异常根源,从而有效保障数据库的稳定性和可靠性。

截图6.PNG

全量SQL洞察的使用

6、总结

RDS for MySQL的全量SQL功能在故障排查、性能优化和安全监控等方面发挥着关键作用。

该功能不仅能够详尽记录每条SQL执行的具体信息,如连接ID、执行时间、扫描行数等,还通过高低水位指针管理机制,实现了高效、精确的日志写入和数据持久化。正因为它能够实时捕捉所有关键执行细节,企业不仅能快速定位和解决数据库故障,还能深入分析性能瓶颈和潜在安全风险,从而更好地满足日益严格的合规要求,保障整体数据库系统的稳定与安全。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。