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。
看到好多人同样问题。希望对其他兄弟有帮助。