问题现象
查询 sql_audit 发现 sql_audit 不再刷新,距离上次刷新 3 天之前了,调整 ob_sql_audit_percentage 改到 5 后,新的流量进来能看到新数据,但是 sql audit 写满之后还是不淘汰数据。
关键诊断信息
触发条件
业务租户 sql_audit 达到内存上限后因为 BUG 导致 SQL Audit 淘汰线程每次没有淘汰数据。
事前巡检
业务租户有正常的流量。
查询业务租户 sql audit 记录内存没刷新。
select FROM_UNIXTIME(t.REQUEST_TIME/1000000), tenant_id from oceanbase.gv$ob_sql_audit t where t.tenant_id = 1004 order by t.REQUEST_TIME desc limit 10;
事后诊断
grep 日志中的关键词
grep -E 'record concurrent fifoallocator alloc' | vim observer.log能看到 1002 号租户因为 sql_audit 达到内存上限导致新数据写不进 sql audit。
grep 关键字
grep 'sql audit evict'能看到对应租户 sql audit 使用情况。
问题原因
业务租户 sql_audit 达到内存上限导致新数据写不进 sql audit,因为内核的 BUG 主要是并发实现的问题导致的 SQL Audit 淘汰线程每次没有淘汰数据,所以出现 sql_audit 不再刷新的现象,复现这个场景需要并发度比较大才会容易触发
# 内部复现小规格租户调低内存 ob_sql_audit_percentage=1,比较高的负载保持 sysbench tps=5k~6k 的情况下运行了两天时间,并做频繁的读取和淘汰操作可以复现
问题的风险及影响
sql audit 内存满之后不刷新,影响用户 SQL 的问题诊断和审计功能。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.2.5 GA(oceanbase-4.2.5.0-100000082024102022)及之后版本、V4.3.5(oceanbase-4.3.5.0-100000122024123020)及之后版本。
解决方法
如果能命中事前诊断和事后诊断的关键信息,说明遇到了相同的问题,彻底解决需要升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.5 BP3(oceanbase-4.2.5.3-103000142025033110)及之后版本、V4.3.5 BP1(oceanbase-4.3.5.1-101000292025030623)及之后版本。
规避方式
调大比例 set global ob_sql_audit_percentage=5; 但是还是会写满有概率再次遇到,彻底解决需要升级带修复版本。
注意
不能使用规避 alter system flush sql audit tenant = xxx; 这个方法无法规避并且多次执行有导致 CPU 用满的风险。