监听程序无法分发客户机连接

re:应该是内存问题

这个错误在oracle 9.2-Oracle 10.2.X数据库的windows平台很常见,
原因:服务器可用的内存枯竭。
通常的解决办法如下:
1、enable 4GB开关,在C:\根目录下的boot.ini文件中增加/PAE参数,如下:
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 AdvancedServer" /PAE
注意:只支持Windows 2000高级服务器版,数据中心版和windows 2003企业版,数据中心版;如果没有4GB这个大的物理内存也不行。
2、在初始化文件中,加入参数:
USE_INDIRECT_DATA_BUFFERS=TRUE
同时,数据库告诉缓存必须使用DB_BLOCK_BUFFERS和db_block_size 调整;
3、减小总的SGA的大小;
4、用orastack更改Oracle.exe,TNSLSNR.exe的栈大小,如500K;
5、更改服务器从专用模式到共享模式。

总的来说,如果有比较大的内存会好办一些,如果内存较小,就只能减小SGA了,用orastack.exe更改栈大小效果不明显。

 

 

 

 

 

使用SQLPLUS把服务器改变SHARED SERVER

--------------------------------------------------------------------------------
D:\>sqlplus sys/sys@orcl as sysdba

SQL*Plus: Release 10.2.0.1.0- Production on 星期日 7月 1518:08:43 2007

Copyright (c) 1982, 2005, Oracle.    Allrights reserved.


连接到:
Oracle Database 10gEnterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options

SQL> alter system set shared_servers=1;

系统已更改。

然后使用LSNRCTL查看监听器状态,马上就会发现有很多连接被拒绝

 

2:根据搜索到的原因,我们在LISTENER。ORA头部加入这一行

DIRECT_HANDOFF_TTC_LISTENER = OFF

 

3:执行以下命令重启监听器和EM

 

--------------------------------------------------------------------------------

lsnrctl stop

lsnrctl start

emctl stop dbconsole

emctl start dbconsole

 

 

4:查看监听器状态和登入EM,看到状态,一切正常

 

--------------------------------------------------------------------------------

D:\Documents and Settings\gdy>lsnrctlservice

 

出现这种这题最多的是因为processes设的不够。也常出现在shared server的配置中。

 

也可能是client端及server端的tnsnames.ora配置的有问题及listener.ora配置的有问题,把这部分贴上来。

 

另外,可以在listener.ora加如下几行打开trace跟踪,以观察一下。

 

TRACE_LEVEL_LISTENER= USER

TRACE_DIRECTORY_LISTENER= /opt/oracle/product/9ir2/network/trace

TRACE_FILE_LISTENER= LISTENER1.trc

 

processes =400,目前才120,

 

另外log文件,出现的时候,后面总是:

有 32-bit Windows Error: 233: Unknown error。

 

 

TNS-12518: TNS:监听程序无法分发客户机连接

TNS-12560: TNS:协议适配器错误

TNS-00530: 协议适配器错误

32-bit WindowsError: 233: Unknown error

 

检查 lsnrctlstatus ----- no ok! 出现这种这题最多的是因为processes设的不够。也常出现在shared server的配置中。 也可能是client端及server端的tnsnames.ora配置的有问题及listener.ora配置的有问题,把这部分贴上来。

 

 

说明监听有问题

 

查到了相关资料如下:

http://www.dba-oracle.com/sf_ora_12518_tns_listener_could_not_hand_off_client_connection.htm

 

The reason ORA-12518 is being throw may bebecause of DEDICATED connections because Oracle 10g has a value of PROCESSES is defaulted at 150 whichcan be lower than necessary in a production system. Also, in pre-9i MTS,ORA-12518 may be thrown in SHARED SERVER because the dispatcher may havereached the maximum connection value, so it denies all other.

 

There are two solutions for ORA-12518depending on which symptom you may be experiencing.

a.For the DEDICATED occurrence ofORA-12518, you would need to try increasing the PROCESSES parameter so that itcan handle the needed number of processes. You can ensure that you have theneeded value by monitoring the listener log for ORA-12518. Also, note thatbecause the PROCESSES parameter is static, the database will need to bebounced.

b.If you are experiencing ORA-12518 becauseof a shared server issue, you first would need to use the command below toshutdown the dispatcher:

SQL> alter system shutdown immediate'D001';

Then, add on new dispatchers:

SQL> alter system set DISPATCHERS ='(protocol=tcp)(dispatchers=3)';

 

通过以上资料分析得出可能出现问题的原因有两种:一是processes值设的过小,二是需要增加参数DISPATCHERS。

 

考虑到之前经常遇到ora-00020超出最大进程数的问题在安装数据库的时候已经把processes设到800了,为保险起见再show parameter processes

 

SQL> show parameter process;

 

NAME                                 TYPE        VALUE

----------------------------------------------- -----

aq_tm_processes                      integer     0

db_writer_processes                  integer     1

gcs_server_processes                 integer     0

job_queue_processes                  integer     10

log_archive_max_processes            integer     2

processes                            integer     1000

 

再查进程数

 

SQL> select count(*) from v$session;

 

 COUNT(*)

----------

      224

 

所以最后得出结论应该不是processes的问题,应该用b方法来解决

1.connect sys/test as sysdba

2.show parameters dispatchers;

NAME                TYPE             VALUE

dispatchers         string           (protocol=tcp)(service=oracle10xdb)

max_dispatchers      integer 

5.SQL>alter system set dispatchers ='(protocol=tcp)(dispatchers=3)(service=oracle10xdb)';

system altered

问题解决。

当然根据实际情况你也可以用a方法解决,

 

可以用show parametersprocesses;

 

命令查看processes的值,数据库在安装时默认为150,对于大型应用,32位的oracle一定要注意这个问题

你可能感兴趣的:(监听程序无法分发客户机连接)