Troubleshooting ORA-600: internal error code, arguments: [kksgaGetNoAlloc_Int0], [34], [24],
近期一套Oracle Database 12c (12.1.0.2.0)数据库在RAC ADG , 在standby端一个查询select语句涉及分区表, SQL解析时触发ora-600 [kksgaGetNoAlloc_Int0], [34], [24], 因为11.2.0.4对分区表对象在DDL后除了基础对象外引入了一个KGL handle 多版本对象,当分区计数和详细信息之间不匹配报错。
ORA-00600: internal error code, arguments: [kksgaGetNoAlloc_Int0], [34], [24], [], [], [], [], [], [], [], [], []
========= Dump for incident 81551 (ORA 600 [kksgaGetNoAlloc_Int0]) ========
[TOC00003]
----- Beginning of Customized Incident Dump(s) -----
kksgaArrDump(): kksgaArr=c000002add6cf7c8, isSpecial=1, magic=0x47656f72 [ok]
firstN=24, firstNsegm=1
nElems=24, loElem=0, hiElem=24, maxSize=24, itSize=192
lvl=0, hi1BitFanout=0, lvl0=c000002add6cfac0, bv=c000002add6cfac8
heapP=c000002adab88098, clear=1, subHeap=0
sql :
select * from xxx
left join partitioned_tablexxx on xxx
left join partitioned_tablexxx on xxx
where xxx
----- Abridged Call Stack Trace -----
ksedsts()+336<-kjzdssdmp()+496<-kjzduptcctx()+656<-kjzdpcrshnfy()+80<-kstdmp()+576<-$cold_dbkedDefDump()+20448<-ksedmp()+480<-ksfdmp()+160<-dbgexPhaseII()+3440<
-dbgexExplicitEndInc()+1840<-dbgeEndDDEInvocationImpl()+864<-dbgeEndDDEInvocation()+224<-$cold_kksgaGetNoAlloc_Int()+336
<-qksmaGetTblStats_Int()+96<-kkeits()+4320<-kkoiqb()+12208<-kkooqb()+1232<-kkoqbc()+6320<-apakkoqb()+384<-apaqbdDescendents()+896
----- End of Abridged Call Stack Trace -----
kksgaGetNoAlloc_Int Get the element at a specific index
qksmaGetTblStats_Int Get stats for a particular partition Internal
ORA-00600: internal error code, arguments: [kksgaGetNoAlloc_Int0], [34], [24] 由于分区计数和详细信息之间不匹配
This bug can cause ORA-600, ORA-8103, ORA-1555, and wrong results when accessing partitioned objects on physical standby systems that are also RAC systems.
相关bug
Bug 19614585 Wrong Results / ORA-600 [kksgaGetNoAlloc_Int0] / ORA-600 [12406] / ORA-7445 / ORA-8103 / ORA-1555 from query on RAC ADG Physical Standby Database
如果在primary 上没有问题,只是在standby 可能是上面的这个bug
Oracle 11.2.0.4 “_part_access_version_by_number” = false
原因是因为主库做了DDL 后,正常应该是把本地节点的基础对象与版本化对象失效,然后再把远程实例的基础对象与版本化对象失效,但如果远程节点中没有cache 基础对象,代码中忘记清理远程的该version 对象失效。 该问题还可能发生成RAC的两个不同节点。
临时解决方法
可以配置实例级改_part_access_version_by_number=FALSE 参数,
或
flush shared_pool重试该SQL.
另一个相关BUG,如果以上修复没有启作用可以尝试如下配置
Bug 25335790 : ORA-600 [KKSGAGETNOALLOC_INT0] ON ACTIVE DATABASE
原因是引入了16954950后导致, 显示 call stack 会包含… kksgaGetNoAlloc_Int qksmaGetTblStats_Int kketac …
kketac returns cost of accesing a table given predicates and access
临时解决方法
alter session set “_fix_control”=’16954950:OFF’;
对不起,这篇文章暂时关闭评论。