---
title: SQL Audit 内存管理与淘汰机制-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 SQL Audit 内存管理与淘汰机制相关的常见问题和使用技巧，帮助您快速解决 SQL Audit 内存管理与淘汰机制的难题。
---
切换语言

- 简体中文
- English

划线反馈

# SQL Audit 内存管理与淘汰机制

更新时间：2026-05-15 09:06

适用版本： V3.2.x 内容类型：TechNote  

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 保留更长时间的记录。

Previous

[OceanBase 数据库的 SQL 审计信息淘汰机制](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000010176)

Next

[诊断 TEMP TABLE 抽取的性能问题](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000691729) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
