首批通过分布式安全可靠测评,为关键业务系统打造
SQL Audit 内存管理与淘汰机制
更新时间:2026-05-15 09:06
SQL Audit 以租户为单位进行内存的分配与管理,其内存大小由租户变量 ob_sql_audit_percentage 来控制,集群参数sql_audit_queue_size、sql_audit_memory_limit 不再使用。
SQL Audit 的淘汰机制遵循 FIFO 的原则,当内存使用或者记录数量达到阀值时,优先对旧的记录进行淘汰。
适用版本
OceanBase 数据库 V3.2.3 版本。
内存管理
SQL Audit 可用内存:avail_mem_limit = min_memory * ob_sql_audit_percentage。
min_memory为租户资源单元定义中的最小租户内存。ob_sql_audit_percentage为 SQL Audit 的租户内存占比。
SQL Audit 的内存使用还受记录总量的上限控制,一个租户在任一 OBServer上的 SQL Audit 最多保留 1000 万记录。
可以通过以下方法来查看 SQL Audit 的内存使用。
系统监控视图
gv$memory实时统计了给内存模块的内存使用,使用context = 'MysqlRequesReco'查询 SQL Audit 的当前内存使用情况。SELECT TENANT_ID,IP,PORT,CONTEXT,COUNT,ROUND(USED/1024/1024) AS USED_MB FROM GV$MEMORY WHERE TENANT_ID=1001 AND CONTEXT= 'MysqlRequesReco' ;OBServer 每隔 10s 打印一次内存统计信息,搜索关键字
MysqlRequesReco可以查看 SQL Audit 的内存使用情况。[2022-07-05 14:27:57.984408] INFO [LIB] ob_tenant_ctx_allocator.cpp:151 [3927][0][Y0-0000000000000000-0-0] [lt=12] [dc=0] [MEMORY] tenant_id= 1001 ctx_id= DEFAULT_CTX_ID hold= 48,784,334,848 used= 48,668,214,457 [MEMORY] hold= 11,768,104,488 used= 11,749,294,080 count= 5587 avg_used= 2,102,970 mod=MysqlRequesReco
淘汰机制
系统后台任务每隔 1s 会检测 SQL Audit 的使用情况,来决定是否进行淘汰。淘汰的触发条件根据 SQL Audit 内存大小不同而变化,具体的淘汰机制如下表所示。
| 淘汰依据 | SQL Audit 内存上限(avail_mem_limit) | 淘汰触发条件 | 淘汰停止条件 |
|---|---|---|---|
| 内存使用 | [64M, 100M] | avail_mem_limit- 20M | avail_mem_limit- 40M |
| 内存使用 | [100M, 5G] | availmem_limit * 0.8 | availmem_limit * 0.6 |
| 内存使用 | [5G, +∞] | availmem_limit- 1G | availmem_limit-2G |
| 记录数 | / | 900万 | 800万 |
可以在日志中搜索 sql audit evict record start 关键字,检查 OceanBase 数据库的 SQL 审计信息的淘汰日志。
[root@hostname /]# cd /home/admin/oceanbase/log
[root@hostname log]# cat observer.log | grep "sql audit evict record start"
手动清空
FLUSH SQL AUDIT 命令可以实现租户级跨服务器的 SQL AUDIT 清理功能,命令如下。
obclient> ALTER SYSTEM FLUSH SQL AUDIT [tenant_list] [GLOBAL]
其中,tenant_list 和 GLOBAL 为可选字段。
- 如果在
tenant_list中指定租户,则只删除指定租户的 SQL AUDIT。否则默认会删除所有租户的相关 SQL AUDIT。 - 如果指定了
GLOBAL,会删除所有 OBServer 上该租户的 SQL AUDIT。否则仅删除本机中相关租户的 SQL AUDIT。
建议与推荐
对于一个业务繁忙的大租户,增大 ob_sql_audit_percentage 的值来提高 SQL Aduit 的内存可能没有意义,因为 SQL Audit 最多保存 1000 万条记录。例如,一个租户在任一 OBServer 上的 QPS 平均值为 2 万,则 SQL Audit 最多可以保留 500s 的记录,增大 ob_sql_audit_percentage 并不能让 SQL Audit 保留更长时间的记录。