尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Oracle CPU 100%排查:insert into sys.aud$引发cursor: mutex S的audit_trail配置与验证

Oracle CPU 100%排查:insert into sys.aud$引发cursor: mutex S的audit_trail配置与验证 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsoleAPI Key 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys拿到 Key 后模型对话入口可以用来快速问“cursor: mutex S 的 P1 值怎么对应 SQL HASH_VALUE”这类问题模型对话https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat如果你长期做数据库排障、写脚本、维护 AgentCoding Plan 更划算适合把 AI 辅助分析固化成工作流Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-planAPI 基础地址统一用https://taotoken.net/api不要加 UTM。接入文档在这里接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc注意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 定位 SQL4.1 用 ASH 定位 cursor: mutex S 的 P1 值cursor: mutex S的 P1 值对应 SQL 的 HASH_VALUE。查最近一段时间的 ASHselect * 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 反查 SQLselect 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 Eventscursor: mutex S和library cache lock是否排前两位。Time Model Statisticsparse 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_HISTORYselect * 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat如果你要长期做数据库排障和脚本自动化Coding Plan 更适合把 AI 辅助分析固化成流程Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan接入细节参考文档接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc注意AI 辅助分析只是帮你归纳等待事件和 SQL 版本数的关联最终判断仍要回到 Oracle 官方文档和 MOS。TaoToken 提供的是统一 Key/API 通道不替代数据库本身的诊断能力。实际用下来把 ASH 的 P1 值和v$sqlarea的查询结果一起丢给模型让它帮你梳理“P1 对应 HASH_VALUE 再对应 SQL_ID”的链路比手动翻 MOS 快很多。但记住audit_trail的修改和重启操作永远要在维护窗口做别在业务高峰期动手。
返回列表