☰
EBS 查询会话 SQL 慢?用 TaoToken 统一 Key 打通诊断链路
2026/10/17 20:39:30 网站建设 项目流程

1. EBS 会话卡顿现场:从 SID 到 SQL 文本的完整诊断链路

EBS 里最让人头疼的不是数据库整体挂了,而是某个用户跑过来跟你说「我的表单转圈圈转了三分钟」。你登上数据库一看,会话一堆,AWR 报告还没生成,ASH 采样粒度又不够细,这时候最直接的办法就是:拿到那个用户的 SID,把它的 SQL 文本和绑定变量一次性捞出来。

这套诊断链路的核心逻辑其实很朴素——EBS 的并发管理器、Form 会话、OAF 页面最终都会在数据库里留下v$session记录,而prev_sql_addr指向的就是该会话最近一次执行的 SQL 在共享池里的地址。只要顺着这个地址去v$sqltext_with_newlines里按piece拼回去,就能还原出完整 SQL。绑定变量则从v$sql_bind_capture里按sql_id捞,注意要过滤was_captured = 'YES',否则会捞到一堆空值。

我试过在 EBS R12.2 + Oracle 19c 的环境里排查一个「采购订单审批页面卡死」的问题,用户描述是点击审批按钮后页面无响应。当时并发查询堆积到 40 多个,AWR 还没到快照点,最后就是靠这套 SID → SQL 文本 → 绑定变量的链路,在五分钟内定位到是一条没走索引的PO_HEADERS_ALL全表扫描。所以这套方法不是纸上谈兵,是真实救过场的。

适合谁用?DBA、EBS 运维、以及需要跟数据库打交道的功能顾问。你不需要有 OEM 或者 AWR 的权限,只要有v$session、v$sqltext_with_newlines、v$sql_bind_capture的查询权限就能跑。下面我会先讲怎么拿到 SID,再给可复制的 SQL 模板,然后讲怎么用 TaoToken 统一 Key 把诊断脚本、模型对话、编码辅助串起来,最后给验证步骤和常见报错排查。

2. TaoToken 前置准备:统一 Key 与 API 通道接入

在讲具体配置之前,先说清楚为什么要在这里引入 TaoToken。EBS 诊断本身是数据库层面的操作,但实际工作中你往往需要同时做几件事:把诊断 SQL 模板存下来、让模型帮你解释执行计划、把排查过程写成文档、甚至用 Claude Code 或 Cline 辅助写 PL/SQL 脚本。如果每个工具都单独配一套 Key 和 Base URL,管理成本很高,而且容易在切换时搞混。

TaoToken 的做法是提供一个统一的 API 通道,你只需要一个 Key,就能在模型对话、Coding Plan、API Keys 管理、接入文档这几个入口之间复用。对于 EBS 诊断这种「查完 SQL 还要写报告、还要让模型帮忙分析绑定变量异常」的场景,统一 Key 能省掉很多重复配置。

先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个新的 API Key,复制出来。注意这个 Key 只在创建时显示一次,丢了就得重新生成。拿到 Key 之后,你的 Base URL 统一用https://taotoken.net/api,不要加任何 UTM 参数,这是 API 调用的规范地址。

如果你用的是 Claude Code 做 PL/SQL 脚本辅助,需要在 settings 里配置 Base URL 和 Key。Claude Code 的配置文件路径通常是~/.claude/settings.json,内容如下:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey" } }

如果你用的是 Cline 或者 Roo Code 这类 VS Code 插件,配置方式是在插件的 API Provider 设置里选 Anthropic,然后填 Base URL 和 Key。Cline 的 MCP 配置如果涉及数据库连接,注意不要直连生产库,用只读账号或者测试库。

Codex 用户如果要用auth.json,路径在~/.codex/auth.json,内容格式:

{ "api_key": "sk-你的TaoTokenKey", "base_url": "https://taotoken.net/api" }

三件套记牢:Base URL 是https://taotoken.net/api,Key 是你在 API Keys 页面生成的那串,Model ID 根据你用的模型填,比如claude-sonnet-4-20250514或者gpt-4o。这三个要素在任何一个接入场景里都不能少。

配置完之后,你可以先用模型对话入口 https://taotoken.net/model-chat 发一条测试消息,确认 Key 和通道是通的。如果这里能正常返回,说明前置准备完成,可以进入下一步的 SQL 配置。

3. 可复制配置:EBS 会话 SQL 查询模板与 TaoToken 接入片段

这一节给两套可复制的东西:一套是 EBS 里查会话 SQL 的 PL/SQL 模板,一套是 TaoToken 的接入配置片段。先讲 SQL 模板。

在 EBS 里拿 SID 的第一步是让用户开启诊断。路径是:登录 EBS 后点「帮助」→「关于」,然后确认个人配置文件里FND:诊断的值是「是」。如果不是,让用户在「配置文件」里把自己的FND:诊断改成「是」,保存后重新登录。这一步不做,后面v$session里可能看不到完整的 SQL 信息。

开启诊断后,让用户执行会触发慢 SQL 的操作,比如打开那个卡顿的 LOV、点击审批按钮、或者提交并发请求。操作完成后,你需要在数据库里找到这个用户的 SID。可以用下面这条查询:

SELECT s.sid, s.serial#, s.username, s.program, s.module, s.action, s.last_call_et FROM v$session s WHERE s.username IS NOT NULL AND s.program LIKE '%FND%' ORDER BY s.last_call_et DESC;

last_call_et是会话最后一次调用到现在经过的秒数,卡顿的会话这个值通常比较大。找到目标 SID 后,把下面的 PL/SQL 模板里的v_sid改成实际值,然后在 SQL*Plus 或 SQL Developer 里执行:

DECLARE v_sid NUMBER := 333; -- 替换为实际 SID CURSOR sql_lines IS SELECT sql_text, t.sql_id FROM v$sqltext_with_newlines t, v$session s WHERE t.address = s.prev_sql_addr AND s.sid = v_sid ORDER BY t.piece; CURSOR paras(p_sql_id VARCHAR2) IS SELECT DISTINCT bc.name, bc.value_string FROM v$sql_bind_capture bc WHERE bc.sql_id = p_sql_id AND bc.was_captured = 'YES' ORDER BY bc.name; v_sql_id VARCHAR2(100); v_sql VARCHAR2(30000); BEGIN FOR sql_line IN sql_lines LOOP v_sql := v_sql || sql_line.sql_text; v_sql_id := sql_line.sql_id; END LOOP; dbms_output.put_line('SQL'); dbms_output.put_line('-----------------------------------------'); dbms_output.put_line(v_sql); dbms_output.put_line(''); dbms_output.put_line('Parameter'); dbms_output.put_line('-----------------------------------------'); FOR para IN paras(v_sql_id) LOOP dbms_output.put_line(para.name || ' = ' || para.value_string); END LOOP; END; /

执行前记得在 SQL*Plus 里开SET SERVEROUTPUT ON SIZE UNLIMITED,否则dbms_output的内容不会显示。SQL Developer 里则要在「DBMS 输出」窗口里启用输出。

TaoToken 的接入片段,如果你要在 Cline 里用 MCP 方式连接数据库做辅助查询,配置如下:

{ "mcpServers": { "ebs-diag": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-oracle"], "env": { "ORACLE_CONNECTION_STRING": "ebs_readonly/密码@//dbhost:1521/EBSDB", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_API_KEY": "sk-你的TaoTokenKey" } } } }

注意这里用的是只读账号,不要用 APPS 或者 SYSTEM 直连生产库。MCP 直连生产库是业务禁则,必须避免。

如果你只是想让模型帮你分析 SQL 文本,不需要 MCP,直接在模型对话里粘贴 SQL 和绑定变量即可。Coding Plan 适合长期做 EBS 二次开发或者写诊断脚本的场景,入口在 https://taotoken.net/coding-plan 。

4. 验证请求:从会话 ID 到 SQL 文本的完整复现步骤

配置好之后,怎么验证这套链路是通的?我按真实操作顺序走一遍。

第一步,在 EBS 里找一个测试用户,开启FND:诊断,然后执行一个已知的慢操作。比如打开「采购订单」的 LOV,或者提交一个并发请求。操作完成后,立刻在数据库里查v$session,找到这个用户的 SID。可以用last_call_et排序,也可以用module和action过滤。

第二步,把 SID 填进上面的 PL/SQL 模板,执行。如果一切正常,你会看到输出里先打印SQL和分隔线,然后是完整的 SQL 文本,接着是Parameter和分隔线,最后是绑定变量列表。SQL 文本应该是拼完整的,不会缺字或者乱序,因为v$sqltext_with_newlines按piece排序后拼接是标准做法。

第三步,把 SQL 文本和绑定变量一起复制到 TaoToken 的模型对话里,让模型帮你分析。比如你可以问「这条 SQL 在 EBS 采购模块里通常走哪个索引,为什么这里没走」。模型会结合 SQL 结构和绑定变量给出分析。这一步不是必须的,但对于不熟悉 EBS 表结构的 DBA 来说很有帮助。

第四步,验证绑定变量是否完整。有时候v$sql_bind_capture里捞不到值,原因是was_captured不是YES,或者绑定变量是在 SQL 第一次执行时没被捕获。这时候可以查v$sql_bind_capture的原始记录确认:

SELECT sql_id, name, value_string, was_captured, last_captured FROM v$sql_bind_capture WHERE sql_id = '你的sql_id' ORDER BY name;

如果was_captured是NO,说明这个绑定变量没被捕获,可能是 SQL 还没执行完,或者绑定变量是NULL。这时候可以等 SQL 执行完再查,或者用v$sql_monitor看实时执行计划。

第五步,确认 SQL 文本和实际执行的是同一条。有时候prev_sql_addr指向的是上一条 SQL,不是当前卡住的 SQL。这时候可以用v$session的sql_id和prev_sql_id对比:

SELECT sid, sql_id, prev_sql_id, sql_child_number, status FROM v$session WHERE sid = 333;

如果status是ACTIVE,说明会话正在执行sql_id对应的 SQL;如果是INACTIVE,prev_sql_id才是最近执行完的 SQL。这个细节很关键,搞错了就会分析错 SQL。

实测下来,这套流程在 EBS R12.2 + Oracle 19c 上跑通没问题。唯一需要注意的是权限,普通用户可能没有查v$sqltext_with_newlines的权限,需要用 DBA 账号或者授予SELECT_CATALOG_ROLE。

5. 常见报错排查:401、local proxy failed、reading choices、OAuth

这一节列几个真实会遇到的报错,以及怎么排查。

401 Unauthorized:这个最常见,通常是 Key 填错了或者过期了。检查ANTHROPIC_API_KEY或TAOTOKEN_API_KEY是否和 API Keys 页面生成的一致。注意 Key 只在创建时显示一次,如果复制时多了空格或者少了字符,都会 401。另外确认 Base URL 是https://taotoken.net/api,不要写成https://taotoken.net/api/带尾斜杠,有些客户端对尾斜杠敏感。

local proxy failed:这个报错通常出现在客户端配置了本地代理但代理没启动,或者代理地址填错了。检查你的客户端设置里有没有HTTP_PROXY或HTTPS_PROXY环境变量,如果有,确认代理服务是运行的。如果不需要代理,把这些环境变量清掉。注意这里说的是本地开发环境的代理配置,不是网络层面的东西,别搞混。

reading choices 报错:这个通常出现在模型返回格式不符合预期时,比如你用的 Model ID 和客户端期望的格式不匹配。检查 Model ID 是否填对,比如claude-sonnet-4-20250514和claude-3-5-sonnet-20241022是不同的模型,填错了可能返回空或者格式异常。另外确认客户端的 API 版本设置,有些客户端需要指定anthropic-version头。

OAuth 相关报错:如果你用的是 Claude Code 并且走了 OAuth 流程,但同时又配了 API Key,可能会冲突。Claude Code 的 settings.json 里如果同时有 OAuth token 和 API Key,优先用 API Key。如果报 OAuth 错误,检查~/.claude/settings.json里有没有残留的 OAuth 配置,清掉后重新用 API Key 配置。

SQL 查询返回空:如果 PL/SQL 模板执行后 SQL 文本是空的,检查v_sid是否填对,以及该会话的prev_sql_addr是否为空。有些会话刚建立还没执行过 SQL,prev_sql_addr就是空的。另外确认v$sqltext_with_newlines里是否有该地址的记录,如果 SQL 已经被 aged out,共享池里就找不到了。

绑定变量捞不到:前面说过,检查was_captured是否为YES。另外v$sql_bind_capture只捕获绑定变量,不捕获字面量。如果 SQL 里用的是字面量而不是绑定变量,这里就捞不到。EBS 里大部分 SQL 都用绑定变量,但有些自定义报表可能用字面量拼接。

权限不足:如果查v$session或v$sqltext_with_newlines报ORA-00942: table or view does not exist,说明当前用户没有权限。用 DBA 账号授予SELECT_CATALOG_ROLE,或者单独授予这几个视图的查询权限。

6. 把诊断链路固化下来:从单次排查到可复用流程

单次排查跑通之后,下一步是把这套流程固化下来。我的做法是建一个只读账号,把上面的 PL/SQL 模板存成脚本文件,每次排查时只需要改 SID 就能跑。同时把 TaoToken 的 Key 和 Base URL 配在客户端的 settings 里,这样模型对话、Coding Plan、API Keys 管理都在一个通道里,不用来回切换。

如果你经常需要分析 SQL 执行计划,可以在 TaoToken 的模型对话里建一个固定的会话,把常用的 EBS 表结构和索引信息贴进去,让模型记住上下文。这样每次贴 SQL 进来,模型能直接结合 EBS 的表结构给出分析,不用重复解释。

对于长期做 EBS 二次开发的团队,Coding Plan 入口 https://taotoken.net/coding-plan 可以配合 Claude Code 或者 Cline 使用,把 PL/SQL 脚本编写、SQL 优化建议、诊断文档生成串起来。接入文档在 https://taotoken.net/doc ,里面有各客户端的详细配置步骤。

最后提醒一点:EBS 诊断涉及生产库操作,所有查询都用只读账号,不要用 APPS 或 SYSTEM 直连。MCP 配置里也不要填生产库的连接串,用测试库或者只读副本。这套链路的价值在于快速定位问题,而不是替代 DBA 的判断。SQL 文本和绑定变量拿到之后,怎么优化、加什么索引、改什么执行计划,还是得结合业务场景来定。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询