Oracle10gR2 32bit Windows Ora-12560非官方解决方案

Posted on 2010-06-22 19:47  blackcat  阅读(2975)  评论(3编辑  收藏  举报

最近遇到Win32下Oracle10gR2的ora-12560问题。

OS环境:

  Win2003 Server, 32bit, 8g内存。

数据库环境:

  Oracle10g 10.2.1.0. SGA=1.7GB, PGA=250M

 

应用跑一段时间之后,连接提示 tns协议错误,报ora-12560,同时Listener.log报错如下:

TNS-12518: TNS: 监听程序无法分发客户机连接 
  TNS-12560: TNS: 协议适配器错误 
   TNS-00530: 协议适配器错误 

    32-bit Windows Error: 233: Unknown error  

 

在服务端使用sqlplus /nolog; conn / as sysdba同样报错 ora-12560,提示tns协议错误。证明不是监听的错误。

 

通过已建立的连接,select count(*) from v$session, 得到当前连接数目为62. 

初步估计,应该是oracle为新的连接建立资源的时候,内存或者其他资源不足。

 

问题分析:

前面说过,通过conn / as sysdba方式基本可以确定,这个不是监听的问题。

问题发生在oracle建立一定数量的情况下,对新的连接请求服务时候。

看最后的  32-bit Windows Error: 233: Unknown error  ,应该是OS调用的问题。

 

测试把SGA调整为1200M,发现连接数目到了100多以后才会出这个问题。继续把sga改小,发现连接数目可以继续增加到200以上。(已经调整过process,session等参数。)

但是调整后的性能越来越差。

 

故猜测是oracle ASSM内存使用的问题。可能是在大的sga设置下,对每个连接的某些资源给的内存比较大,导致在一定规模下,新的连接申请时候,内存资源不足(应该是虚拟内存地址不够用了),超出了window进程内存限制。于是失败。

 

解决方案:

在window的boot.ini中增加启动参数 /3GB,强制win内核使用1g进程空间,给用户空间留下3GB空间,保证oracle调用有足够的虚拟内存使用。

问题不在重现。

 

结语:

这种方式的解决,能在一定情况下解决或者缓解相关问题。

但是最终的根源是资源冲突引起的,也就是一定资源满足一定应用。

如果需要支持更多的并发,使用64bit的OS。

看到好多人同样问题。希望对其他兄弟有帮助。 

Copyright © 2024 blackcat
Powered by .NET 9.0 on Kubernetes