1. Oracle AWR 报告生成步骤:从 awrrpt.sql 到快照区间选择
AWR 报告是 Oracle 数据库性能排查里最常用的一份“体检报告”,全称 Automatic Workload Repository,它把一段时间内数据库的负载、等待事件、Top SQL、内存使用等指标采样并汇总成一份 HTML 文件。而生成它的入口脚本就是awrrpt.sql,配合快照(snapshot)区间选择,能快速定位某段时间的性能问题。这套流程适合 Oracle DBA、运维工程师,以及需要排查数据库慢查询、CPU 飙高、I/O 等待的后端开发者。
我平时排查线上库,第一步几乎都是先拉一份 AWR 报告,看 DB Time、Top 等待事件和 Top SQL,再决定往哪个方向深挖。这篇就把awrrpt.sql的完整交互过程、快照查询 SQL、常见报错定位,以及后续用 TaoToken 统一 Key/API 通道做配置骨架的连通性验证,一次讲清楚,让你照着敲就能跑通。
先说清楚 AWR 报告能做什么:它按快照间隔(默认 1 小时)采集一次性能数据,保留时间由AWR_RETENTION控制。你选两个快照之间的区间,Oracle 就把这段时间的统计差异算出来,生成报告。所以“选对快照区间”比“生成报告”本身更关键——你要分析 16:00 的 SQL CPU 占用,就别选一整天的区间,那样噪声太大。
生成前需要确认几件事:当前用户有DBA权限(通常用sys或具有SELECT_CATALOG_ROLE的账号),数据库处于OPEN状态,STATISTICS_LEVEL参数不是BASIC(否则很多指标采集不到)。可以用下面这条 SQL 快速确认:
-- 确认 AWR 是否启用及保留策略 SELECT snap_interval, retention FROM dba_hist_wr_control; -- 确认统计级别,必须是 TYPICAL 或 ALL SHOW PARAMETER statistics_level;如果statistics_level是BASIC,AWR 里很多等待事件和 SQL 统计会是空的,报告参考价值大打折扣。改回TYPICAL需要重启实例或动态调整(部分版本支持ALTER SYSTEM SET statistics_level=TYPICAL;,但建议在维护窗口操作)。
接下来是快照查询。生成报告前,我习惯先查一下有哪些快照可用,避免在交互里盲选:
-- 查询最近 2 天的快照,按时间倒序 SELECT snap_id, TO_CHAR(begin_interval_time, 'YYYY-MM-DD HH24:MI') AS begin_time, TO_CHAR(end_interval_time, 'YYYY-MM-DD HH24:MI') AS end_time FROM dba_hist_snapshot WHERE begin_interval_time > SYSDATE - 2 ORDER BY snap_id DESC;这条 SQL 会列出snap_id和对应的时间窗口。记住你要分析的区间起止snap_id,后面在awrrpt.sql交互里直接输入数字即可,比按时间猜要准得多。比如你要看 15:00 到 17:00,就找begin_time接近 15:00 的那个snap_id作为起点,end_time接近 17:00 的作为终点。
这里有个容易踩的坑:快照是按整点采集的,但实际采集时间可能因为系统负载略有偏移。如果你要精确定位某个时刻,建议区间稍微放宽一点,比如 14:00–18:00,先看整体趋势,再缩小范围。AWR 报告本身也支持在 HTML 里按时间段筛选,所以不必一次就选得特别窄。
另外,如果数据库刚重启过,快照可能不连续,dba_hist_snapshot里会出现断层。这时候选区间要避开断层,否则报告里会出现“snapshot not found”或数据缺失。查快照时留意snap_id是否连续,不连续就分段生成。
最后提醒一点:生成 AWR 报告会对数据库产生一定开销,尤其是大区间、高负载的库。生产环境尽量避开业务高峰,或者用awrrpt.sql的SQL_ID过滤功能只导出关心的 SQL。报告文件默认生成在当前工作目录,用sys登录时通常是$ORACLE_HOME/dbs或你cd到的目录,记得生成后确认路径,别找不到文件。
2. TaoToken 前置准备:统一 Key 与 API 通道配置骨架
排查完数据库,很多时候还要把分析结论、SQL 优化建议同步给团队,或者用大模型辅助解读 AWR 报告里的等待事件和 Top SQL。这时候如果每个工具都单独配 Key、单独记 Base URL,维护起来很乱。TaoToken 的思路是提供一个统一的 API 通道,把模型调用收敛到一套 Key 和 Base URL 上,配置一次,多个工具复用。
TaoToken 是什么?简单说,它是一个统一的大模型 API 接入层,你拿到一个 Key,配好 Base URL,就能在支持 OpenAI 兼容协议的工具里调用不同模型。适合谁?适合需要长期做数据库巡检、写分析脚本、跑 Agent 任务的 DBA 和开发者——你不用在每个工具里重复填 Key,改一处就全局生效。
前置准备分三步:拿 Key、确认 Base URL、选模型 ID。这三件套是后面所有配置的基础,缺一不可。
第一步,拿 Key。访问 API Keys 管理页:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite登录后创建一个新 Key,复制保存。注意 Key 只在创建时完整显示一次,关掉页面就看不到了,建议直接存到密码管理器或环境变量里,别硬编码进脚本。
第二步,确认 Base URL。TaoToken 的 API 入口是:
https://taotoken.net/api这个地址不加 UTM 参数,直接作为base_url使用。注意结尾不要多加/v1或斜杠,具体以你所用工具的文档为准,大多数 OpenAI 兼容客户端会自动拼接路径。
第三步,选模型 ID。模型 ID 是调用时指定的model字段,比如claude-sonnet-4-5、gpt-4o这类。不同工具对模型 ID 的写法要求不同,有的要求全小写,有的支持别名。建议先在模型对话页确认可用模型列表:
https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite在对话页里选一个模型发条消息,确认能通,再把这个模型 ID 抄到配置文件里。这一步能帮你排除“Key 没问题但模型 ID 写错”的低级错误。
三件套齐了之后,就可以写配置骨架了。下面是一个通用的config.toml骨架,适用于支持 TOML 配置的工具(比如某些 CLI 客户端、Agent 框架):
# TaoToken 统一接入配置骨架 # 路径:~/.config/taotoken/config.toml(按你所用工具的实际路径调整) [provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key = "sk-你的Key粘贴到这里" model = "claude-sonnet-4-5" timeout = 60 max_retries = 2 [logging] level = "info"如果你用的是 Claude Code 这类工具,配置通常写在settings.json里,结构类似:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key粘贴到这里", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }注意ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个环境变量名是 Claude Code 约定的,别写错。模型 ID 用ANTHROPIC_MODEL指定。配好后重启工具,让它重新读取配置。
如果你用的是 Codex 类的工具,配置可能落在auth.json里:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key粘贴到这里", "model": "gpt-4o" }auth.json的路径通常在工具的用户目录下,比如~/.codex/auth.json。改完记得检查文件权限,别让 Key 被其他用户读到。
这里强调一下三件套的完整性:Base URL、Key、Model ID 必须同时正确,缺任何一个都会报错。只填 Key 不填 Base URL,工具会走默认官方地址,可能连不上;只填 Base URL 不填 Model ID,调用时不知道用哪个模型,会返回 400。所以配置完先别急着跑任务,下一步做连通性验证。
3. 可复制配置:awrrpt.sql 交互命令与 config.toml 完整片段
这一节把两边的可复制内容都放齐:Oracle 侧的awrrpt.sql交互命令,以及 TaoToken 侧的config.toml完整片段。你直接复制改改就能用。
先看 Oracle 侧。用sys登录数据库:
# 以 sysdba 身份登录,不输密码(本地认证) [oracle@mytesthost ~]$ sqlplus / as sysdba登录成功后,执行awrrpt.sql:
SQL> @?/rdbms/admin/awrrpt.sql?是$ORACLE_HOME的简写,Oracle 会自动展开。执行后进入交互,按提示一步步输入:
Enter value for report_type: html报告类型选html,方便浏览器打开。接着会问返回几天的快照:
Enter value for num_days: 1输入1表示列出最近 1 天的快照。然后会列出快照列表,让你选起止snap_id:
Enter value for begin_snap: 1024 Enter value for end_snap: 1026这里填你前面用dba_hist_snapshot查到的snap_id。比如要分析 15:00–17:00,就选对应区间的起止 ID。最后输入报告文件名:
Enter value for report_name: yxl.html回车后等待生成,看到Report written to yxl.html就成功了。退出数据库:
SQL> exit然后在当前目录找到yxl.html,用sz下载到本地:
[oracle@mytesthost ~]$ sz yxl.html浏览器打开就能看报告了。如果你在服务器上没有sz,也可以用scp:
scp oracle@mytesthost:/path/to/yxl.html ./完整交互流程串起来就是:
SQL> @?/rdbms/admin/awrrpt.sql Enter value for report_type: html Enter value for num_days: 1 Enter value for begin_snap: 1024 Enter value for end_snap: 1026 Enter value for report_name: yxl.html注意begin_snap和end_snap必须是有效的快照 ID,且begin_snap < end_snap。如果输入了不存在的 ID,会报ORA-20200: Invalid snapshot ID之类的错误,回到快照列表重选即可。
再看 TaoToken 侧的config.toml完整片段。这个骨架可以直接复制,改 Key 和模型 ID:
# ~/.config/taotoken/config.toml # TaoToken 统一接入配置,适用于支持 TOML 的 CLI/Agent 工具 [provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key = "sk-替换成你的Key" model = "claude-sonnet-4-5" timeout = 60 max_retries = 2 [provider.headers] "Content-Type" = "application/json" [logging] level = "info" output = "stdout"如果你用的是 Claude Code,对应的settings.json完整片段:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-替换成你的Key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" }, "permissions": { "allow": [] } }Codex 的auth.json完整片段:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-替换成你的Key", "model": "gpt-4o" }三件套对照表,方便你检查有没有漏:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 不加 UTM,不加尾部斜杠 |
| API Key | sk-... | 从 API Keys 页创建,只显示一次 |
| Model ID | claude-sonnet-4-5等 | 以模型对话页确认的为准 |
配置路径按你所用工具的实际约定来,别照搬。比如 Claude Code 的settings.json通常在~/.claude/settings.json,Codex 的auth.json在~/.codex/auth.json。改完文件后,重启工具或重新加载配置,让改动生效。
如果你需要长期跑编码或 Agent 任务,可以考虑 Coding Plan,配置方式类似,但额度策略不同:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite配置骨架就这些,重点是三件套齐全、路径正确、Key 别泄露。下一步做连通性验证,确认真的能通。
4. 验证请求与成功结果:连通性检查与 AWR 报告确认
配置写完不算完,得验证。这一节分两部分:TaoToken 侧的连通性检查,以及 Oracle 侧 AWR 报告生成成功的确认。
先看 TaoToken 侧。最直接的验证方式是发一个最小请求,看返回是否正常。如果你有curl,可以用下面这条命令测:
curl -s -X POST "https://taotoken.net/api/v1/messages" \ -H "Content-Type: application/json" \ -H "x-api-key: sk-你的Key" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 32, "messages": [{"role": "user", "content": "ping"}] }'如果返回里有content字段和文本内容,说明 Key、Base URL、模型 ID 三件套都通了。如果返回 401,说明 Key 有问题;返回 404,说明 Base URL 或路径不对;返回 400 且提示 model 相关,说明模型 ID 写错了。
注意上面的路径是/api/v1/messages,这是 Anthropic 兼容格式。如果你用的是 OpenAI 兼容格式,路径换成/api/v1/chat/completions,请求体也相应调整:
curl -s -X POST "https://taotoken.net/api/v1/chat/completions" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的Key" \ -d '{ "model": "gpt-4o", "max_tokens": 32, "messages": [{"role": "user", "content": "ping"}] }'两种格式的鉴权头不同:Anthropic 用x-api-key,OpenAI 用Authorization: Bearer。别混用,混用会 401。
如果你用的是 Claude Code,验证更简单,直接在终端里跑:
claude -p "回复 ok"如果输出ok或类似内容,说明配置生效。如果报OAuth error或local proxy failed,往下看第 5 节的排查。
再看 Oracle 侧。awrrpt.sql生成成功后,终端会输出类似:
Report written to yxl.html同时当前目录会出现yxl.html文件。用ls -lh yxl.html确认文件大小,正常报告几百 KB 到几 MB 不等,太小可能是区间选得太窄或快照数据缺失。
[oracle@mytesthost ~]$ ls -lh yxl.html -rw-r--r-- 1 oracle oinstall 1.2M Nov 20 16:30 yxl.html下载到本地后,浏览器打开,重点看这几个部分:
第一,数据库详细信息。确认 DB Name、Instance、Host、Release 版本和你排查的库一致,别拿错库的报告。
第二,快照详细信息。确认起止时间和snap_id是你选的区间,Elapsed时长合理。
第三,负载信息。看DB Time、DB CPU、Redo size、Logical reads等,判断整体负载水平。
第四,Top 10 前台等待事件。按Total Wait Time (sec)倒序,先看wait class。如果是User I/O或System I/O,可能是正常 I/O 压力;如果是Concurrency,要警惕,可能是锁竞争或 latch 争用。再看Total Wait Time和Avg Wait,总等待大但平均等待小,通常不是大问题。
第五,共享池统计信息。Memory Usage %长期在 70% 左右比较健康,低于 50% 说明内存浪费,高于 90% 要检查是否有 PL/SQL、cursor 占用过多,考虑扩内存或排查泄漏。
第六,Time Model Statistics。按% of DB Time排序,关注占比高的事件。注意总百分比可能大于 100%,因为sql_execute_elapsed_time可能包含hard_parse和parse时间,这是正常的。
第七,Top SQL。重点看SQL Ordered by Elapsed Time和SQL Ordered by CPU Time。解析时间长、执行次数少的 SQL,优先优化;Executions为 0 的,说明 SQL 正在执行时生成了快照,可以忽略或重新生成。
验证通过后,你就有了完整的排查链路:AWR 报告定位问题,TaoToken 通道辅助分析。下一步看常见报错怎么处理。
5. 本篇常见错排查:401、local proxy failed、reading choices 与 OAuth
这一节把 Oracle 侧和 TaoToken 侧的高频报错放一起,对照真实错误信息给排查路径。
先看 TaoToken 侧。
401 Unauthorized。最常见的原因是 Key 写错、Key 过期、或者鉴权头用错。排查步骤:确认 Key 是从 API Keys 页复制的完整字符串,没有多余空格;确认 Anthropic 格式用x-api-key,OpenAI 格式用Authorization: Bearer;确认 Base URL 是https://taotoken.net/api,没有多加/v1导致路径重复。如果还不行,重新创建一个 Key 试试。
local proxy failed。这个报错通常出现在 Claude Code 或类似工具里,意思是本地代理层没起来或配置没生效。排查:确认settings.json里的ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY都填了;确认工具重启过,读到了新配置;确认没有其他环境变量(比如系统级的ANTHROPIC_BASE_URL)覆盖了你的配置。可以用env | grep ANTHROPIC检查当前生效的环境变量。
reading choices 报错。这个通常出现在 OpenAI 兼容客户端里,报错信息类似reading 'choices'或cannot read property 'choices' of undefined。原因是返回体结构不符合预期,可能是 Base URL 路径不对,或者模型 ID 不被支持。排查:确认请求路径是/api/v1/chat/completions;确认模型 ID 在模型对话页里能正常使用;用curl直接测一次,看原始返回体是什么。
OAuth error。Claude Code 有时会走 OAuth 流程,如果你用的是 API Key 模式,需要确认没有触发 OAuth。排查:检查settings.json里是否同时存在 OAuth 相关配置和 API Key 配置,两者冲突时优先走 OAuth,导致 Key 不生效。清掉 OAuth 相关字段,只保留ANTHROPIC_BASE_URL、ANTHROPIC_API_KEY、ANTHROPIC_MODEL三件套。
再看 Oracle 侧。
ORA-20200: Invalid snapshot ID。输入的snap_id不存在或已被清理。回到dba_hist_snapshot查询,确认 ID 有效且未被AWR_RETENTION清理。
ORA-13509: Error encountered during AWR report generation。通常是快照区间内有断层,或者STATISTICS_LEVEL是BASIC。检查快照连续性,确认统计级别。
SP2-0552: Bind variable "X" not declared。在awrrpt.sql交互里输入了非法字符,比如中文标点或空格。重新执行,输入纯数字。
报告文件找不到。awrrpt.sql生成的文件在当前工作目录,不是$ORACLE_HOME。用pwd确认当前目录,或者用find / -name "yxl.html" 2>/dev/null找。
排查完这些,基本能覆盖 90% 的报错场景。如果遇到没列出的错误,先看报错原文,再对照配置三件套和快照区间,逐项排除。
6. 语义一致 CTA:接入文档、模型对话与 Coding Plan
报告生成链路跑通后,如果你想把 TaoToken 接入到日常的数据库巡检脚本、AWR 报告解读工具,或者长期跑的 Agent 任务里,可以从下面几个入口继续。
需要查接入细节、参数说明、错误码,看接入文档:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite想先验证模型能不能用、返回格式对不对,去模型对话页发条消息:
https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite要管理 Key、创建新 Key、查看额度,去 API Keys 页:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite如果你要长期跑编码任务、Agent 工作流,或者需要更稳定的额度策略,看 Coding Plan:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewriteClaude Code 用户如果遇到 Anthropic 相关配置问题,可以看专门的接入说明:
https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite最后分享一个我踩过的坑:awrrpt.sql生成的报告文件名如果带路径,比如/tmp/yxl.html,Oracle 会写到指定路径,但如果你没写路径只写文件名,它写在当前工作目录。有次我在$ORACLE_HOME/dbs下执行,生成的文件就在那儿,找了半天。所以生成后先pwd确认目录,再用ls找文件,别急着sz。另外,TaoToken 的 Key 建议用环境变量注入,别写死在config.toml里,尤其是多人共用的服务器,避免 Key 泄露。