现象:当应用程序(ERP等)连接数达到一定数量后,就无法登录。
listener.log中出现:
TNS-12518: TNS: 监听程序无法分发客户机连接
 TNS-12560: TNS: 协议适配器错误
  TNS-00530: 协议适配器错误
   32-bit Windows Error: 233: Unknown erroralert_aaa.log中出现:
Errors in file d:\oracle\product\10.2.0\admin\jserp\bdump\aaa_psp0_1892.trc:
ORA-27300: OS system dependent operation:spcdr:9261:4200 failed with status: 997
ORA-27301: OS failure message: 重叠 I/O 操作在进行中。
ORA-27302: failure occurred at: skgpspawn客户端程序提示:
TNS-12518: TNS: 监听程序无法分发客户机连接另外有的程序提示:
Tns error struct:
    ns main err code: 12564
    TNS-12564: TNS: 拒绝连接
    ns secondary err code: 0
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0
----------------------------------------------------
服务器情况:windows 2003 server企业版(32bit)
12GB内存
启动加了PAE参数oracle情况:
10g Enterprise Edition Release 10.2.0.1.0
shared模式---------------------------------------------------
经过不断的尝试改变sessiones、processes、sga_max_size、sga_target的设置,发现一个规律:
Sga_max_size和sga_target设置越小,可连接的用户越多,但速度越慢。反之,Sga_max_size和sga_target设置越大,可连接的用户越少,但速度越快。比如:
当sga设置为200MB时候,session达到304(process为309),应用程序还可继续连接,但是非常慢。
当sga设置为600MB时候,session达到290(process为295),应用程序就无法连接了。
当sga设置为1500MB时,很快地应用程序就无法连接了(可能只有几十个session就完蛋了,当时没有统计,sql plus也连不上)。网上的做法:1、sessiones不够大,我设置了600,出问题的时候使用远远不到600。
2、有的说是1.7G的限制,可是当出现问题的时候,OS总占用内存还不到1.7GB。
3、PGA太小,原来480MB,后面改成600MB、800MB都没啥变化。
4、10.2.0.1.0版本的bug(p5639232)造成的,今天升级至10.2.0.4,现象依然存在。

解决方案 »

  1.   

    操作系统和数据库是32位和64位是不同的。 
    32位且内存>2.5G,试试下面的: 
    sga_max_size=1600m 
    db_cache_size=1200m 
    shared_pool_size=200m 
    java_pool_size=80m 
    large_pool_size=80m 
    pga_aggregate_target=250m 64位的t: 
    sga_max_size=系统内存*0.8*0.8 
    db_cache_size=sga_max_size*0.7 
    shared_pool_size=sga_max_size*0.18 
    java_pool_size=sga_max_size*0.1 
    large_pool_size=sga_max_size*0.1 
    pga_aggregate_target=系统内存*0.8*0.2 还有的书中介绍,数据库缓冲区中:
    oracle内存的80% 
    共享池 19% 
    redo日志缓冲区及其他1%; 这是本人以前记下的经验值,供楼主试一下。
      

  2.   

    12GB内存,应该是个很大的内存了,但“启动加了PAE参数”不知为何意?
     
      

  3.   

    我查询了一下:
    db_cache_size、shared_pool_size、java_pool_size、large_pool_size的设置都为0,难道ASMM不可靠?
      

  4.   


    是说OS的boot.ini中加了PAE参数,不加OS压根儿就不认识12GB,只认识3个多GB
      

  5.   

    会不会与shared_servers(现在为1)设置有关?
     dispatchers为(protocol=tcp)(dispatchers=3)(service=aaaxdb)
      

  6.   

    你的系统配置是怎样的,在各个sga的配置时,系统的资源状况是怎样的。
      

  7.   

    sga配置为200M,pga配置为300MB时:
    当session达到304,os内存使用1.15GB,oracle.exe占用内存714MB,oracle.exe线程数量595,此时可连接sga配置为600M,pga配置为500MB时:
    当session达到295,os内存使用1.56GB,oracle.exe占用内存1.13GB,oracle.exe线程数量565,此时就不能连接了
      

  8.   

    对于32bit的oracle,12g的ram是浪费,因为支持不了。
    你的环境TNS-12518:的根本原因是内存分配的问题,建议升级到64bit 的os+64bit的oradcle。
    目前你的环境需要保证sga+(pga实际使用值)<2g,且保证process足够大才不会报TNS-12518。
    ps: pga的值<>pga的实际使用值,在压力情况下pga的实际值远远大于pga的值。