【真实经验分享】ORA-03113 ORA-7445[evaopn3()+240]根因定位:从通信中断到内核空指针崩溃的完整排查实录
ORA-03113 ORA-7445[evaopn3()240] 根因定位从通信中断到内核空指针崩溃的完整排查实录版本环境Oracle 11.2.0.1.0 (64bit) on Windows Server 2012问题现象客户端偶发 ORA-03113 “通信通道的文件结尾”服务端进程崩溃根本原因Oracle Bug 12672969 — ORDER BY 消除优化导致evaopn3()空指针解引用解决方案打补丁解决BUG问题。一、问题现象客户端失联某客户的业务系统前端偶发报错ORA-03113: 通信通道的文件结尾客户端表现为无法从套接字读取更多数据SQL 执行到一半突然中断。起初以为是网络不稳定但排查alert日志后发现ORA-03113之后都伴随ORA-7445[evaopn3()240]。这说明问题不在网络而在是BUG导致的。二、服务端追踪ORA-7445 内核崩溃对 Alert Log 和 Trace 文件中ORA-7445信息进行分析Exception [type: ACCESS_VIOLATION, UNABLE_TO_READ] [ADDR:0x4] [PC:0x2C26DB6, evaopn3()240] ORA-07445: exception encountered: core dump [evaopn3()240] [ACCESS_VIOLATION] [ADDR:0x4]2.1 关键信息解读字段含义ACCESS_VIOLATION访问违规即空指针/野指针解引用ADDR:0x4试图读取地址0x0000000000000004典型的空结构体偏移访问PC:0x2C26DB6程序计数器指向evaopn3()240evaopn3()Oracle 内核函数负责表达式求值Expression Evaluation2.2 Call Stack 分析从堆栈可以看到崩溃前的调用链evaopn3()240 → qerixTunnelGetKey()1599 → qerixStart()1844 → qertbStart()1036 → qerjoStart()542 (多次说明有多个 JOIN 操作) → qergsStart()868 (Group By / Sort 操作) → qerjoFetch()/qerflFetch() (数据获取) → opifch2() (最终返回客户端)关键特征崩溃发生在evaopn3()表达式求值阶段调用链中包含qergsStartGroup By/Sort和多次qerjoStartJoin这是一个复杂的多表 JOIN 聚合查询三、根因定位Oracle Bug 126729693.1 匹配官方 Bug根据 MOSMy Oracle Support文档该症状与Bug 12672969高度吻合Bug 12672969— Assorted Dumps with aggregate expression in ORDER BY影响版本11.2.0.1 ~ 11.2.0.3低于 12.1症状包含 ORDER BY 子句且其中带有聚合函数的查询可能触发 ORA-7445 [evaopn3]3.2 Bug 触发条件根据 MOS 文档该 Bug 的重现场景必须同时满足ORA-7445发生在聚合求值函数中包括evaopn3ORDER BY 消除Order By Elimination, OBE被执行ORDER BY 子句中存在聚合函数位于操作符树中间3.3 本案例的触发路径查看了出问题的SQL语句发现与BUG有以下雷同之处查询涉及多表 LEFT JOIN包含GROUP BY / ORDER BY操作CBO 在执行ORDER BY Elimination优化转换时对包含聚合表达式的 ORDER BY 子句处理不当可以基本确定是这个BUG引起的。3.4故障发生链客户端报ORA-03113只是表象。根本原因是服务端进程因 ORA-7445 崩溃 → 操作系统终止 ORACLE.EXE 进程 → TCP 连接被强制断开 → 客户端读取套接字失败 → 抛出 ORA-03113四、解决方案对比方案一禁用 ORDER BY 消除官方 WorkaroundALTERSESSIONSET_optimizer_order_by_elimination_enabledFALSE;优点会话级别关闭触发 Bug 的优化特性。缺点需要修改应用代码代码层面不一定支持比较麻烦被客户否决。方案二使用 Hint 锁定执行计划在排障过程中发现该SQL语句有时候是能执行成功然后对比了执行计划加上以下hint后就能运行成功。SELECT/* USE_HASH(t1 t2) */...原理Bug 的触发与执行计划强相关特定 Join 顺序和访问路径会触发 OBE 优化中的缺陷通过USE_HASHHint强制使用 Hash Join改变 CBO 生成的执行计划新的执行计划不再触发 ORDER BY Elimination 的缺陷路径从而绕开 Bug优点无需修改数据库参数无需打补丁只影响特定 SQL不影响全局立即验证立即可用缺点需要修改应用代码比较麻烦被客户否决。方案三应用官方 Patch 12672969优点官方修复彻底解决问题。缺点 需要维护窗口生产环境打补丁存在一定的风险。该数据库是在虚拟机上后来复制了一个虚拟机的镜像做了补丁测试这样就可以将风险降到最低。之后在生产环境上打了补丁后问题得到解决。