现象:执行查询SQL语句或生成查询计划,报ORA-00600错误,并断开连接。具体错误如下
ORA-00600: 内部错误代码, 参数: [kkoipt:incorrect pwj], [7], [1], [1], [1], [2], [2], [], [], [], [], []
用户根据错误号查了下错误信息,也是希望得到启示,看如何解决。
00600. 00000 - "internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]"
*Cause: This is the generic internal error number for Oracle program
exceptions. It indicates that a process has encountered a low-level,
unexpected condition. The first argument is the internal message
number. This argument and the database version number are critical in
identifying the root cause and the potential impact to your system.
从错误信息看,看不出什么具体问题,这里有两点需要注意,就是在Cause中说的,我们需要知道数据库版本和个参数
11.2.0.4 +ORA-00600 [kkoipt:incorrect pwj]
既然是internal error code错误,咱们就到MOS看看是不是bug吧。果然找到几片文章,
Bug 17164360 - ORA-600 [kkoipt:incorrect pwj] parsing SQL with partition wide join (Doc ID 17164360.8)
Bug 17185558 - ORA-600 [kkoipt:incorrect pwj] occurs on querying partitioned table (Doc ID 17185558.8)
但是,个bug收到影响的是11.2.0.3,所以我们分析了第二个文档
确认这个bug确实影响到11.2.0.4和11.2.0.3 在12.1.0.2和12.2.0.1中first included.根据bug描述
这个bug仅仅与分区表查询相关,在优化评估join顺序的解析阶段,这个跟客户的SQL和报错信息完全符合。
怎么解决呢?
这里Oracle提供了一个workaround方式就是修改隐藏参数。具体指令如下,这个修改不需要重启数据库。
alter system set "_full_pwise_join_enabled”=false ;
验证修改结果
show parameter full;
如果在修改前想查看隐藏参数的值,可以使用如下方式:
SELECT ksppinm, ksppstvl, ksppdesc
FROM x$ksppi x, x$ksppcv y
WHERE x.indx = y.indx AND ksppinm =‘_full_pwise_join_enabled'
在修改后,让用户再次查询,确认问题解决!
补充:用户反映,这个bug还触发两次成功查询结果不一致,我没有验证,但是如果这样,确实是大问题了,这个问题必须解决。