今天下午,原来一个部门的同事找过来,说有个即将上线的环境偶尔会出现 No more data to read from socket错误,版本是oracle 11.2.0.1,如下:
经查,这个问题原因比较多,有oracle自己的bug,有可能配置的问题,也有可能代码上的问题。主要有如下:
1、jdbc连接池大小问题,我们最小10、最大100,有校验有效性,此原因排除;
2、有可能是内存不足的原因,经查看sar历史,排除此原因;
3、有可能绑定变量偷窥问题,可设置_optim_peek_user_binds = false解决;
上述参考:https://stackoverflow.com/questions/7839907/no-more-data-to-read-from-socket-error
对于此类问题,首要排查的就是oracle alert和trace,根据开发反馈的时间段,果然有很多的dump:
逐步往上排查,一共有下列几类ORA-07445:
ORA-07445: exception encountered: core dump [pfr_v3_tab_handler()+311] [SIGSEGV]
确认的bug 10269022,Executing a PL/SQL block dynamically that returns a REF CURSOR fails with ORA-7445 [pfr_v3_tab_handler] – superceded,11.2.0.3修复
ORA-07445: 出现异常错误: 核心转储 [ksuklms()+316]
确认的bug 13322802,11.2.0.4修复
ORA-07445: exception encountered: core dump [dbgrmqmqpk_query_pick_key()+2033]
确认的bug 9390347,11.2.0.2修复
ORA-07445: exception encountered: core dump [kocgpn2()+141] [SIGSEGV]
这个错误号没有查到相应的bug记录。
最后,让用户升级到11.2.0.4解决。
除此之外,有可能是sql太复杂所致,比如sql中有with子句,with又引用了另一个with,扁平化后也可能可以解决。