love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

绑定变量超过65535 导致数据库集群频繁crash

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 绑定变量超过65535 导致数据库集群频繁crash

今天凌晨5点半,被客户的电话声惊喜。对于DBA来讲,最紧张的时刻莫过于半夜接到突然突然。若非紧急故障,客户通常不会大半夜打电话。从客户提供的信息来看,数据库不断crash:

可以看到实例最终被pmon进程异常终止了。而ora-00600 17147 也是较为常见的。

进一步分析客户提供的trace 发现了如下内容,其中报错的存储过程传参超过7万个:

对比上述相关错误以及call stack堆栈信息,发现为Oracle bug导致。可参考如下文档:

摘取其中一段描述:

CAUSE

Instance terminated due to ora-7445 [opiaba] which leads to ora-600 [17147]. ora-7445 [opiaba] error is reported due to the use of more than 65535 binds in the same sql / plsql statement.

You may find some or all of the following function codes in the ‘Call Stack’ portion of the trace file:

opiaba opiprs rpiswu2 kksLoadChild kxsGetRuntimeLock kksfbc

This scenario is reported in bug 13973845 which is closed of duplicated bug 12578873.

紧急下载该patch发客户,打上补丁之后,数据库实例不再频繁crash。从描述来看,该patch并不能彻底解决问题,只是让实例不crash而已。最根本的解决方法还是调整应用,将存储过程拆分,不要一次性传入数万个参数,超过oracle 65535的临界值。

这个问题很简答, 我们在其他客户之前都遇到过了多次,在我司内部mes平台也能看到相关的案例分享。简单记录一下吧!

Leave a Reply

You must be logged in to post a comment.