1. 硬解析为什么会让 CPU 突然飙起来Oracle 硬解析Hard Parse指的是 SQL 每次执行时数据库都要重新做一遍语法分析、语义检查、权限校验、执行计划生成这一整套动作。软解析只是从共享池里把已经存在的游标拿出来复用硬解析则相当于每次都要重新走一遍完整流程。单条 SQL 硬解析一次可能只花几毫秒但当应用没有用绑定变量、SQL 文本频繁变化、共享池被挤爆时每秒几千次硬解析就会把 CPU 直接顶到 90% 以上同时伴随 library cache latch、shared pool latch 争用。我遇到过的典型场景是一套 Java 应用用字符串拼接 SQLWHERE id 1、WHERE id 2这种文本各不相同共享池里塞满了只执行一次的游标v$sysstat里parse count (hard)每秒涨几百。DBA 第一反应是加 CPU但根因是解析。这篇就按这个场景走一遍先用v$sysstat、v$sql、v$sqlarea定位高硬解析 SQL再用 TaoToken 统一 Key 把 AI 辅助诊断接进来让模型帮你读 AWR 片段、生成排查 SQL、解释执行计划。适合谁看正在被 Oracle CPU 飙升困扰的 DBA、后端开发以及想把 AI 工具接进日常数据库排障流程的人。下面所有命令和配置都可以直接复制。2. TaoToken 前置统一 Key 打通 AI 诊断链路排障时最烦的是工具切换一个窗口连数据库一个窗口查文档还要开 AI 对话问「这个 latch 争用怎么解」。TaoToken 的作用是把模型调用收敛成一个统一 KeyOpenAI 兼容接口base_url指向https://taotoken.net/api这样无论是命令行工具、编辑器插件还是自己写的脚本都共用一套凭证不用每个工具单独配。你需要先拿到 Key登录官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建后复制那串sk-开头的字符串只显示一次先存到密码管理器。注意Key 不要写进代码仓库用环境变量或本地配置文件承载。下面配置里我用占位符sk-你的Key你替换成自己的。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 接口规范、模型列表、错误码都在里面配之前扫一眼能省很多试错。如果你主要做长期编码和 Agent 类任务可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 按套餐走比单次调用更划算。3. 可复制配置settings.json 与 config.toml 骨架不同 AI 工具读不同格式的配置。下面给两份骨架一份给读 JSON 的工具比如 Claude Code 类、部分编辑器插件一份给读 TOML 的工具比如一些 CLI Agent。核心都是三件事base_url、api_key、model。3.1 settings.json 骨架{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [ Read, Bash(sqlplus:*) ] } }这里ANTHROPIC_BASE_URL指向 TaoToken 的 API 入口ANTHROPIC_AUTH_TOKEN填你的 Key。permissions.allow里我放开了sqlplus命令这样 AI 工具在排障时可以直接帮你跑查询、读输出不用你手动复制粘贴。如果你用的是 Claude Code 类工具接入说明在 https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentClaudeCodeAnthropicutm_campaignrewrite 里面有更细的字段解释。3.2 config.toml 骨架[model] provider openai-compatible base_url https://taotoken.net/api api_key sk-你的Key name claude-sonnet-4-20250514 max_tokens 8192 temperature 0.2 [tools] allow_shell true allow_file_read truetemperature我压到 0.2排障场景要的是稳定、可复现的回答不需要发散。allow_shell和allow_file_read打开后AI 能读你导出的 AWR 文本、能跑sqlplus查询诊断链路就通了。3.3 环境变量方式最通用如果你不想改工具配置文件直接导出环境变量也行export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENsk-你的Key export ANTHROPIC_MODELclaude-sonnet-4-20250514配完用env | grep ANTHROPIC确认一下别让旧变量覆盖了。4. 硬解析指标采集与 AI 辅助定位配置通了接下来是真正的排障动作。硬解析排查的核心是三个视图v$sysstat看总量趋势v$sqlarea看哪条 SQL 解析次数多v$sql_shared_cursor看为什么没共享。4.1 采集硬解析总量-- 每秒硬解析次数间隔 5 秒采样两次 SELECT name, value FROM v$sysstat WHERE name IN (parse count (total), parse count (hard), parse time cpu); -- 等 5 秒后再跑一次用差值除以间隔 SELECT sn.name, (s2.value - s1.value) / 5 AS per_sec FROM v$sysstat s1, v$sysstat s2, v$statname sn WHERE s1.statistic# s2.statistic#() AND s1.statistic# sn.statistic# AND sn.name parse count (hard);如果parse count (hard)每秒超过 100基本可以确认硬解析是 CPU 大头。把两次采样结果贴给 AI让它帮你算占比、判断是否异常比手算快。4.2 定位高硬解析 SQLSELECT sql_id, executions, parse_calls, loads, version_count, ROUND(parse_calls / GREATEST(executions, 1), 2) AS parse_per_exec, SUBSTR(sql_text, 1, 80) AS sql_snippet FROM v$sqlarea WHERE parse_calls 100 ORDER BY parse_calls DESC FETCH FIRST 20 ROWS ONLY;重点看parse_per_exec每次执行对应的解析次数。正常应该接近 0如果大于 1说明这条 SQL 每次执行都在重新解析。version_count高说明同一逻辑 SQL 有大量不同文本版本典型的没绑变量。4.3 查为什么没共享SELECT sql_id, child_number, reason, -- 不共享的原因 address, hash_value FROM v$sql_shared_cursor WHERE sql_id 你的SQL_ID AND rownum 10;reason列会告诉你具体原因比如BIND_MISMATCH、OPTIMIZER_MISMATCH、ROLL_INVALID_MISMATCH。把这段输出丢给 AI让它翻译成人话并给修复建议比翻文档快得多。4.4 用 AI 工具串起来配好 TaoToken 后你可以直接在 AI 工具里说「读一下我贴的 v$sqlarea 输出找出 parse_per_exec 最高的三条 SQL并解释 version_count 高的原因」。模型会结合上下文给出判断。需要验证模型回答质量时可以开模型对话页 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 直接问不用切工具。5. 验证请求确认 AI 链路真的通了配置完别急着排障先发一个最小请求验证链路。用 curl 测curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的Key \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 128, messages: [ {role: user, content: 用一句话解释 Oracle 硬解析} ] }返回里能看到content字段有正常文本说明 Key、base_url、模型名都对。如果返回 401检查 Key 有没有多余空格返回 404检查base_url是不是写成了带/v1的完整路径TaoToken 的 base 是https://taotoken.net/api具体路径由工具拼接。验证通过后回到数据库侧做一次对比验证修复前记录parse count (hard)每秒值改完 SQL 绑定变量后再采一次把两组数据贴给 AI 让它算下降比例。我实测下来把字符串拼接改成绑定变量后硬解析能从每秒 300 降到个位数CPU 从 95% 回落到 30% 左右。6. 本篇常见错排查报错一ORA-04031: unable to allocate shared memory共享池被硬解析产生的游标碎片撑爆了。临时缓解是ALTER SYSTEM FLUSH SHARED_POOL;但根因还是硬解析。先按第 4 节定位高解析 SQL别只 flush 了事。报错二library cache latch等待高查v$latch和v$latch_children确认是library cache相关 latch。这通常和硬解析并发高同时出现。把v$latch输出贴给 AI让它帮你区分是解析争用还是其他争用。报错三AI 工具返回model not found模型名写错了。去接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 核对当前可用模型列表别用记忆里的旧名字。报错四sqlplus权限被 AI 工具拒绝settings.json里permissions.allow没放Bash(sqlplus:*)。加上后重启工具。如果公司安全策略不允许 AI 跑 shell就改成手动导出结果再贴给模型。报错五绑定变量改了但硬解析没降检查是不是CURSOR_SHARING被设成了EXACT且应用层还在拼字符串。另外v$sql_shared_cursor里如果reason是ROLL_INVALID_MISMATCH说明统计信息收集导致游标失效需要看DBMS_STATS的收集频率。7. 把 AI 接进日常排障的下一步硬解析只是入口。真正省时间的是把「采集指标 → 贴给 AI → 拿修复建议 → 验证」这条链路固化下来。你可以把第 4 节的查询存成.sql脚本让 AI 工具直接读文件执行也可以把常用排查 SQL 做成模板每次只换sql_id。长期做数据库排障和 Agent 自动化的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 比按次调用更稳额度够你反复跑诊断脚本。Key 管理和新建入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 需要多环境隔离时给每个环境建独立 Key出问题好定位。最后留一个我踩过的坑别一上来就调CURSOR_SHARINGFORCE掩盖问题那只是把硬解析转成软解析SQL 文本还是乱的执行计划可能更差。先定位、再改应用层绑定变量AI 帮你读输出但决策还得你拍板。
