最近一个月从两个不同的地方碰到了相同的报错,更加巧合的是相关人员都执行了相同的参数修改,并且其中一个客户因随意修改参数导致数据库的大量sql执行计划抖动,应用受到极大影响。。
报错如下:Caused by: java.sql.SQLException: 无法从套接字读取更多的数据
这个报错为前端应用报错,因为报错太明确了,所以猜测他们都直接搜索,然后就直接用了,修改的参数为
_optimizer_connect_by_cost_based
这边一定要注意,修改oracle的隐含参数一定要谨慎,尤其是_optimizer开头的和优化器相关的参数,稍有不慎,就会出现开头出现的情况。
并且实际上修改完这个参数后,并没有用处。
这个报错一直在前台持续,对应的时间点alert日志中显示如下:
Dump continued from file: /u01/app/oracle/diag/rdbms/XX/XX/XXX_ora_1466.trc
ORA-07445: 出现异常错误: 核心转储 [evaopn3()+135] [SIGSEGV] [ADDR:0x4] [PC:0x98244A7] [Address not mapped to object] []
查看这个trc文件,可以找到引发这个报错的sql。
ORA-7445这种建议在官方文档中搜索资料,大部分情况都有收录,找到对应的
Doc ID 22611354.8
AND
Doc ID 1943615.1
可以确认这是一个bug,官方建议修改参数为
不过在确认sql的情况下,我们基本上不会在数据库级别去该参数。我们会通过hint的方式,在sql级别去应用,如下所示:
如果是create table ,那么加上
/*+ OPT_PARAM('_pred_move_around','FALSE') */
如果是select查询,那么加上
/*+OPT_PARAM('_optimizer_join_elimination_enabled' 'false')*/
然后通知开发修改应用的sql,达成目的。