今天下午,原來一個部門的同事找過來,說有個即將上線的環境偶爾會出現 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,扁平化后也可能可以解決。