1. 从一次 MES 系统卡顿说起:CPU 100% 与 insert into sys.aud$
某天下午接到反馈,说 MES 系统操作明显变慢,登录数据库主机一看,任务管理器里 CPU 使用率长时间钉在 100%,内存、磁盘、网络都正常。数据库还能连上,但执行任何查询都慢得让人想砸键盘。这种场景下,第一反应通常是先看等待事件,而不是急着杀会话或者重启实例。
连上数据库后查v$session和v$active_session_history,发现等待事件高度集中在cursor: mutex S,占比接近 60%,其次是library cache lock。这两个事件都指向同一个方向:游标争用。继续往下挖,AWR 里SQL ordered by Version Count有一行特别扎眼——某个 SQL_ID 的 Version Count 高达 2420,但 SQL 文本显示为** SQL Text Not Available **。这种“看不见文本但版本数爆炸”的情况,往往就是问题的入口。
通过 ASH 里cursor: mutex S的 P1 值反查v$sqlarea,最终定位到罪魁祸首:insert into sys.aud$(...) values(...),版本数 5546。也就是说,Oracle 的审计功能在往sys.aud$表里疯狂插入记录,而这条插入语句的游标无法共享,导致大量子游标堆积,进而引发cursor: mutex S等待,CPU 被解析和游标管理吃满。本文就围绕这个场景,把排查路径、audit_trail 配置检查与关闭、AWR/ASH 验证动作,以及用 TaoToken 统一 Key 接入 AI 辅助分析工具的 settings.json 骨架一次讲清楚。
2. 前置准备:TaoToken 统一 Key 与 AI 辅助分析通道
排查 Oracle 性能问题时,我习惯把 AWR、ASH 的片段丢给 AI 做辅助归纳,尤其是等待事件和 SQL 版本数的关联分析。但直接调各家模型 API 要维护多套 Key,切换麻烦。TaoToken 提供统一 Key 和 API 通道,一个 Key 就能走模型对话、Coding Plan 等入口,适合把 AI 辅助分析嵌进日常排障流程。
你需要先拿到 Key。访问控制台创建 API Key:
- 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console
- API Key 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys
拿到 Key 后,模型对话入口可以用来快速问“cursor: mutex S 的 P1 值怎么对应 SQL HASH_VALUE”这类问题:
- 模型对话:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model-chat
如果你长期做数据库排障、写脚本、维护 Agent,Coding Plan 更划算,适合把 AI 辅助分析固化成工作流:
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan
API 基础地址统一用https://taotoken.net/api,不要加 UTM。接入文档在这里:
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
注意:TaoToken 是统一 Key/API 通道,用于接入 AI 辅助分析工具,不是数据库客户端,也不替代 SQL Developer 或 AWR 报告本身。排障主体仍然是 Oracle 自身的诊断视图。
3. 可复制配置:audit_trail 参数检查与关闭
3.1 确认当前 audit_trail 配置
先查当前审计配置,确认是不是DB级别:
show parameter audit_trail; -- 或者 select name, value from v$parameter where name = 'audit_trail';如果返回DB或TRUE,说明审计记录写入sys.aud$表,这正是引发insert into sys.aud$高版本数的前提。DB级别下,每次审计动作都会触发对sys.aud$的插入,游标无法共享时就会堆积子游标。
3.2 检查 sys.aud$ 相关游标版本数
select sql_id, version_count, sql_text from v$sqlarea where sql_text like 'insert into sys.aud$%' order by version_count desc;如果version_count达到几千,基本可以确认问题。再查共享游标失效原因:
select sql_id, child_number, optimizer_mismatch, sql_type_mismatch from v$sql_shared_cursor where sql_id = '你的SQL_ID' and rownum < 100;常见的是optimizer_mismatch = Y,说明优化器环境不一致导致游标不能共享。
3.3 紧急缓解:刷新共享池
在确认业务压力可控、且系统已经卡到无法正常操作时,可以刷新共享池:
alter system flush shared_pool;刷新后几分钟内 CPU 通常会回落。但这个操作会清空共享池,高并发多业务系统慎用,可能引发短时硬解析风暴。我试过在业务低峰期做,效果立竿见影,但一定要评估影响。
3.4 根治:关闭 audit_trail
紧急缓解只是临时手段,根治要改audit_trail。当前版本 11.2.0.1 存在 Bug 11936699,表现为sys.aud$子游标过多导致library cache lock等待时间增加。处理方式是把audit_trail从DB改为NONE或OS。
修改需要停机或在可重启实例的窗口操作:
-- 查看当前值 show parameter audit_trail; -- 修改为 NONE(需重启生效) alter system set audit_trail = none scope = spfile; -- 重启数据库 shutdown immediate; startup;重启后确认:
show parameter audit_trail;如果业务不允许完全关闭审计,可以改为OS,把审计记录写到操作系统文件,避免写入sys.aud$表:
alter system set audit_trail = os scope = spfile;注意:
audit_trail修改后需要重启实例才生效,scope = memory对部分版本不适用。生产环境务必在维护窗口操作。
4. 验证请求与成功结果:AWR/ASH 定位 SQL
4.1 用 ASH 定位 cursor: mutex S 的 P1 值
cursor: mutex S的 P1 值对应 SQL 的 HASH_VALUE。查最近一段时间的 ASH:
select * from ( select p1, sql_id, event, count(*), ratio_to_report(count(*)) over () * 100 pct from v$active_session_history where event like '%mutex%' and sample_time > sysdate - 1/12 group by p1, sql_id, event order by count(*) desc ) where rownum <= 10;如果看到某一行cursor: mutex S占比超过 90%,记下 P1 值,比如 914163366。
4.2 用 P1 反查 SQL
select sql_id, sql_text, version_count from v$sqlarea where hash_value = 914163366;返回的sql_text如果是insert into sys.aud$(...),且version_count很大,问题就确认了。
4.3 AWR 中的关键指标
生成 AWR 报告后,重点看三处:
- Top 5 Timed Foreground Events:
cursor: mutex S和library cache lock是否排前两位。 - Time Model Statistics:
parse time elapsed和connection management call elapsed time是否异常高。 - SQL ordered by Version Count:是否有 Version Count 超过 20 甚至上千的 SQL。
一个典型的 AWR 片段如下:
Top 5 Timed Foreground Events Event Waits Time(s) Avg wait (ms) % DB time cursor: mutex S 24,415,300 657,967 27 59.35 library cache lock 37,388 281,185 7521 25.36 DB CPU 146,580 13.22cursor: mutex S占 59%,library cache lock占 25%,两者合计超过 80%,方向非常明确。
4.4 验证关闭后的效果
关闭audit_trail并重启后,过一周再查:
select sql_id, version_count, sql_text from v$sqlarea where sql_text like 'insert into sys.aud$%' order by version_count desc;如果不再出现高版本数的insert into sys.aud$,且 ASH 里cursor: mutex S占比回落到正常水平,说明问题已缓解。
5. 本篇常见错排查
5.1 刷共享池后 CPU 又飙升
刷新共享池只是清掉当前堆积的游标,如果audit_trail仍是DB,审计插入会继续产生新子游标,过一段时间又堆积。必须改audit_trail才能根治。
5.2 改 audit_trail 不生效
alter system set audit_trail = none如果只加scope = memory,部分版本不生效。必须用scope = spfile并重启。改完用show parameter audit_trail确认。
5.3 ASH 查不到数据
v$active_session_history只保留最近一段时间的数据,如果问题发生超过一小时,可能已被覆盖。此时改用 DBA_HIST_ACTIVE_SESS_HISTORY:
select * from ( select p1, sql_id, event, count(*) from dba_hist_active_sess_history where event like '%mutex%' and sample_time > sysdate - 1 group by p1, sql_id, event order by count(*) desc ) where rownum <= 10;5.4 监听日志没有明显会话增长
这说明问题不是连接风暴引起的,而是已有会话反复解析同一条审计插入语句。不要只盯着连接数,重点看游标版本数和等待事件。
5.5 版本升级建议
Bug 11936699 在 11.2.0.3 之后修复。如果条件允许,升级到 11.2.0.3 或更高版本可以从根上避免。但升级周期长,短期还是先改audit_trail。
6. 用 TaoToken 接入 AI 辅助分析:settings.json 骨架
把 AWR 片段、ASH 查询结果丢给 AI 做归纳,能省不少翻文档的时间。下面是一个settings.json骨架,把 TaoToken 统一 Key 配进去,供支持该配置格式的 AI 辅助分析工具使用:
{ "ai": { "provider": "taotoken", "base_url": "https://taotoken.net/api", "api_key": "你的_TaoToken_API_Key", "model": "claude-sonnet-4-20250514", "max_tokens": 4096, "temperature": 0.2 }, "analysis": { "oracle": { "awr_sections": [ "Top 5 Timed Foreground Events", "Time Model Statistics", "SQL ordered by Version Count" ], "ash_events": [ "cursor: mutex S", "library cache lock", "library cache: mutex X" ] } } }Key 从控制台创建,模型对话入口可以直接验证 Key 是否可用:
- 模型对话:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model-chat
如果你要长期做数据库排障和脚本自动化,Coding Plan 更适合把 AI 辅助分析固化成流程:
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan
接入细节参考文档:
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
注意:AI 辅助分析只是帮你归纳等待事件和 SQL 版本数的关联,最终判断仍要回到 Oracle 官方文档和 MOS。TaoToken 提供的是统一 Key/API 通道,不替代数据库本身的诊断能力。
实际用下来,把 ASH 的 P1 值和v$sqlarea的查询结果一起丢给模型,让它帮你梳理“P1 对应 HASH_VALUE 再对应 SQL_ID”的链路,比手动翻 MOS 快很多。但记住,audit_trail的修改和重启操作,永远要在维护窗口做,别在业务高峰期动手。