ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

11.2.0.4 ADG备库 ORA-01555 与 cursor: pin S wait on X 并发争用排查:从 hanganalyze 到 TaoToken 统一 Key 配置

11.2.0.4 ADG备库 ORA-01555 与 cursor: pin S wait on X 并发争用排查:从 hanganalyze 到 TaoToken 统一 Key 配置 1. 备库查询突然报错ORA-01555 和 cursor: pin S wait on X 一起出现如果你在 Oracle 11.2.0.4 的 ADG 备库上跑 ORACLE EBS 报表某天突然发现一个视图查询直接抛 ORA-01555而且语句看起来还没真正开始执行就报错了那大概率不是简单的 UNDO 不够用。我遇到的情况更典型备库是 READ ONLY WITH APPLY 状态alert 日志里连续刷出执行几秒的语句报 ORA-01555同时业务侧反馈大量会话卡住等待事件集中在 cursor: pin S wait on X 和 library cache lock。这两个现象叠在一起说明问题不是单一维度。ORA-01555 指向 UNDO 一致性读失败而 cursor: pin S wait on X 指向游标上的排他锁争用。在 ADG 备库上这两者可能通过同一个阻塞源串起来某个会话持有游标资源不放其他会话在一致性读时既要等游标锁又因为等待时间拉长导致 UNDO 快照过期最终报 ORA-01555。排查这类复合故障核心思路是先找到阻塞源头再判断 UNDO 是否被连带拖垮。hanganalyze 是定位阻塞链最直接的工具AWR 用来确认等待事件的分布和 UNDO 使用趋势。下面按可复现的路径走一遍包括 hanganalyze 触发命令、ADG 备库参数核查清单以及后续把排查脚本和 API 通道统一管理起来的配置方式。2. 前置准备TaoToken 统一 Key 与排查环境排查过程中会反复执行 SQL、查看 trace、调用诊断接口如果每个工具都单独配一套 Key 和地址切换起来很碎。我习惯把这类诊断辅助通道统一到一个入口TaoToken 的 API 通道可以做到这一点一个 Key 覆盖模型对话、编码辅助和文档查询config.toml 里集中管理排查时不用来回改环境变量。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。如果你只是临时验证模型连通性可以直接用模型对话页面如果是长期做数据库排查和脚本编写建议走 Coding Plan把常用诊断提示词和 SQL 模板固化下来。需要先拿到 API Key入口在 console 的 api-keys 页面。拿到之后不要硬编码在脚本里放到 config.toml 中统一读取。下面给一个最小骨架字段名按实际接口文档调整重点是结构清晰、便于替换。# config.toml - TaoToken 统一通道骨架 [default] base_url https://taotoken.net/api api_key sk-你的Key timeout_seconds 30 [chat] model claude-sonnet endpoint /v1/messages [coding] model claude-sonnet endpoint /v1/messages max_tokens 4096 [doc] endpoint /v1/messages配置完成后先做一次连通性验证不要等到排查中途才发现 Key 或地址有问题。用 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, max_tokens: 64, messages: [{role: user, content: ping}] }返回里有正常的内容字段就说明通道通了。这一步和数据库排查本身无关但能保证后续用脚本批量分析 trace 时不会因为通道问题中断。3. 可复制配置hanganalyze 触发与 ADG 备库参数核查3.1 hanganalyze 触发命令在备库上以 sysdba 登录执行以下命令。hanganalyze 的级别用 3能输出较完整的阻塞链信息sqlplus / as sysdba oradebug setmypid oradebug unlimit oradebug hanganalyze 3执行后会提示 trace 文件路径类似Hang Analysis in /u02/prod/db/trace/PROD_ora_11469346.trc打开 trace 文件重点看Chains most likely to have caused the hang这一段。典型输出如下Chain 1 Signature: not in a waitcursor: pin S wait on X Chain 1 Signature Hash: 0x3a7b30c Chain 2 Signature: not in a waitlibrary cache lock Chain 2 Signature Hash: 0x24734cfChain 1 表示有会话在等 cursor: pin S wait on XChain 2 表示有会话在等 library cache lock。继续往下看State of LOCAL nodes列表找到状态为LEAF_NW的节点那就是阻塞源头。例如[2265]/1/2266/3615/70001075215e428/2949500/LEAF_NW/这里 SID 2266 就是 blocker它不在等待状态但阻塞了多个 NLEAF 节点。NLEAF 表示在等待adjlist 列会指向阻塞它的节点编号。把 blocker 的 SID 和 SQL 记下来再决定是否 kill。3.2 ADG 备库参数核查清单在定位阻塞源的同时核查以下参数确认 UNDO 和 ADG 应用是否正常-- 数据库角色与打开模式 select database_role, open_mode from v$database; -- ADG 应用状态 select process, status, sequence# from v$managed_standby; -- UNDO 表空间使用 select tablespace_name, bytes/1024/1024 mb, autoextensible from dba_data_files where tablespace_name like UNDO%; -- UNDO 保留时间 show parameter undo_retention; -- 当前 SCN 与备库应用 SCN 差距 select current_scn from v$database; select applied_scn from v$dataguard_stats;重点看三项UNDO 表空间是否接近满、undo_retention 是否过短、备库应用是否延迟。如果备库应用延迟大查询需要的一致性读版本更旧UNDO 更容易过期ORA-01555 就更容易出现。而 cursor: pin S wait on X 的阻塞会拉长查询等待时间进一步放大 UNDO 过期风险。3.3 阻塞会话处理确认 blocker 后先看它的 SQL 和状态select sid, serial#, status, sql_id, event, blocking_session from v$session where sid 2266;如果确认是异常持有游标的查询会话可以 killalter system kill session 2266,3615;kill 之后观察等待事件是否消退ORA-01555 是否停止刷出。如果 kill 后短时间内又出现同样的阻塞链说明有周期性任务在反复触发需要从 SQL 层面排查。4. 验证请求与成功结果处理完阻塞会话后用以下步骤验证第一步确认等待事件归零select event, count(*) from v$session_wait where event in (cursor: pin S wait on X,library cache lock) group by event;返回空或计数为 0说明游标争用已消退。第二步确认 ORA-01555 不再新增。查看 alert 日志最后 50 行tail -n 50 alert_PROD.log | grep -i ORA-01555如果没有新的 ORA-01555 记录说明 UNDO 一致性读恢复正常。第三步重新执行之前报错的视图查询确认能正常返回结果。如果查询本身耗时较长可以配合alter session set events 10046 trace name context forever, level 12做一次 trace确认没有额外的游标等待。第四步用 TaoToken 通道做一次连通性复验确保排查脚本和 API 通道都可用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, max_tokens: 64, messages: [{role: user, content: verify}] }返回正常内容即表示通道可用。这一步放在排查收尾是为了确认后续自动化分析 trace 时不会因为通道问题卡住。5. 本篇常见错排查5.1 hanganalyze 没有输出阻塞链如果 trace 文件里只有节点列表没有Chains most likely to have caused the hang通常是 hanganalyze 级别不够或执行时阻塞已经缓解。把级别提到 3 或 4 重试并在业务高峰期执行更容易抓到瞬时阻塞。5.2 kill 会话后 ORA-01555 仍然出现这说明 UNDO 本身已经不够用不只是被阻塞拖累。检查 UNDO 表空间是否可自动扩展、undo_retention 是否过短。在 ADG 备库上UNDO 保留时间受主库影响备库查询需要的一致性读版本可能比主库更旧必要时在主库侧调整 undo_retention 并观察备库应用。5.3 cursor: pin S wait on X 反复出现如果 kill 后很快复现说明有周期性 SQL 在反复持有游标。用 AWR 报告查看 Top SQL 和等待事件分布重点找执行频率高、持有游标时间长的查询。在 ORACLE EBS 场景下某些报表查询会反复解析同一个游标可以考虑在备库侧做 SQL 计划固化或调整查询方式。5.4 ADG 备库参数核查遗漏常见遗漏是只看 UNDO 表空间大小没看v$dataguard_stats里的应用延迟。备库应用延迟大时查询需要读取更旧的 UNDO 版本ORA-01555 风险显著上升。每次排查都把应用延迟和 UNDO 使用一起看避免只处理阻塞而忽略根因。5.5 TaoToken 通道返回 401 或超时先确认 API Key 是否正确、是否放在请求头里。config.toml 中的 base_url 不要带 UTM 参数API 地址用 https://taotoken.net/api 。如果超时检查网络出口和 timeout_seconds 设置排查脚本里建议把超时设到 30 秒以上避免 trace 分析中途断开。6. 排查收尾与通道统一这套排查路径走下来核心是两步先用 hanganalyze 找到阻塞源再核查 ADG 备库的 UNDO 和应用延迟确认 ORA-01555 是单纯被阻塞拖累还是 UNDO 本身不足。kill 阻塞会话能快速恢复业务但反复出现时要从 SQL 和参数层面继续挖。排查过程中用到的脚本、trace 分析和文档查询如果分散在多个工具里切换成本很高。把 TaoToken 的 API Key 和通道统一到 config.toml 之后后续做批量 trace 分析、SQL 模板生成和文档检索都可以走同一个入口。需要长期做数据库排查和脚本编写的可以走 Coding Plan 把常用诊断流程固化只是临时验证模型连通性的用模型对话页面就够。接入文档和 API Keys 入口在 console 里都能找到配置一次之后下次再遇到 ADG 备库的复合故障排查链路会顺很多。
返回列表