ORA-7445 [opiaba] and ORA-600 [17147] 问题分析处理

今天早上发现数据库一个实例在08点38分29秒宕机了一次,迅速又在08点39分01秒自动拉起。重启后产生了很多分布式事务的报错。接着在09点03分39秒又再一次宕机,并在09点04分48秒再一次自动拉起。

通过对数据库alert日志进行分析。发现重启前后报了ORA-07445和ORA-00600错误。首先是应用进程报了ORA-07445错误。接下来是PMON进程产生了ORA-00600[17147错误]。最终PMON进程终止了实例。

 
进一步分析应用进程的trace,发现下列问题:

 
可以看到是在执行SQL语句9q342zu0xtkvx触发了Oracle内部opiaba函数的异常。而进一步观察发现这个是一个语句块,这个语句块中执行了很多条相同的insert语句,而这些insert语句使用了绑定变量达到86904个。

 
通过在mos上搜索,我们找到一篇文章Instance crashed after ORA-7445 [opiaba] and ORA-600 [17147] (Doc ID 1466343.1),其中的错误及堆栈信息和我们遇到的报错完全一致。

 
根据文档的描述,ora-7445 [opiaba]错误是由于在SQL或者PL/SQL的语句中使用了超过65535个绑定变量。从而最终导致实例的crash。解决的办法是修改应用程序以使用少于65535个绑定变量。或者是安装patch 12578873,但是安装完补丁之后,只会阻止实例不会宕机,并不能从根本上解决问题,目前为止还是不允许在SQL或者PL/SQL语句中使用超过65535个绑定变量。正常情况程序是不会使用到这么多绑定变量的。
参考文档:Instance crashed after ORA-7445 [opiaba] and ORA-600 [17147] (Doc ID 1466343.1)

分享到: 更多

Post a Comment

Your email is never published nor shared. Required fields are marked *