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

最近学习ORACLE SHARED SERVER的时候遇到一个奇怪的错误。

以下模拟错误并展示解决方法
环境:WINXP_SP2_CHS + ORACLE_R2
服务器配置为专用服务器,并且运行正常。

1:使用SQLPLUS把服务器改变SHARED SERVER

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

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

Copyright (c) 1982, 2005, Oracle.    All rights reserved.


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

SQL> alter system set shared_servers=1;

系统已更改。

SQL>

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

--------------------------------------------------------------------------------
D:\Documents and Settings\gdy>lsnrctl service

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 15-7月 -2007 18:1
1:19

Copyright (c) 1991, 2005, Oracle.    All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
    例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
      处理程序:
        "DEDICATED" 已建立:0 已被拒绝:0
           LOCAL SERVER
服务 "orcl" 包含 1 个例程。
    例程 "orcl", 状态 READY, 包含此服务的 3 个处理程序...
      处理程序:
        "DEDICATED" 已建立:33 已拒绝:0 状态:ready
           LOCAL SERVER
        "D001" 已建立:0 已被拒绝:9 当前: 0 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3448>
           (ADDRESS=(PROTOCOL=tcps)(HOST=netplus)(PORT=1934))
        "D000" 已建立:1 已被拒绝:0 当前: 1 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3996>
           (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1933))
服务 "orcl_XPT" 包含 1 个例程。
    例程 "orcl", 状态 READY, 包含此服务的 3 个处理程序...
      处理程序:
        "DEDICATED" 已建立:33 已拒绝:0 状态:ready
           LOCAL SERVER
        "D001" 已建立:0 已被拒绝:9 当前: 0 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3448>
           (ADDRESS=(PROTOCOL=tcps)(HOST=netplus)(PORT=1934))
        "D000" 已建立:1 已被拒绝:0 当前: 1 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3996>
           (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1933))
命令执行成功

D:\Documents and Settings\gdy>
--------------------------------------------------------------------------------
查看监听器日志发现如下错误
15-7月 -2007 18:12:43 * (CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=D:\oracle\product\10.2.0\db_1\bin\emagent.exe)(HOST=NETPLUS)(USER=SYSTEM))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.1)(PORT=2101)) * establish * orcl * 12518
TNS-12518: TNS: 监听程序无法分发客户机连接
ORA-28759: 无法打开文件
    TNS-12560: TNS: 协议适配器错误
     TNS-00540: SSL 协议适配器错误


而且在EM中会显示如下错误
到实例的代理连接




状态    失败

详细资料    无法连接到数据库实例: ORA-12518: TNS: 监听程序无法分发客户机连接 (DBD ERROR: OCIServerAttach)。


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

上网搜索后发现可能是如下的原因:客户连接到监听器后,监听器把客户重定向到调度程序端口(很可能不是1521端口),由于操作系统问题,这些连接会被拒绝。
要解决这个问题,只需要在LISTENER。ORA的头部加入这一行DIRECT_HANDOFF_TTC_LISTENER = OFF 即可。

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

--------------------------------------------------------------------------------
# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
DIRECT_HANDOFF_TTC_LISTENER = OFF
SID_LIST_LISTENER =
    (SID_LIST =
      (SID_DESC =
        (SID_NAME = PLSExtProc)
        (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
        (PROGRAM = extproc)
      )
    )

LISTENER =
    (DESCRIPTION_LIST =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      )
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
      )
    )


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

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

--------------------------------------------------------------------------------
lsnrctl stop
lsnrctl start
emctl stop dbconsole
emctl start dbconsole

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

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

--------------------------------------------------------------------------------
D:\Documents and Settings\gdy>lsnrctl service

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 15-7月 -2007 18:2
8:19

Copyright (c) 1991, 2005, Oracle.    All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
    例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
      处理程序:
        "DEDICATED" 已建立:0 已被拒绝:0
           LOCAL SERVER
服务 "orcl" 包含 1 个例程。
    例程 "orcl", 状态 READY, 包含此服务的 3 个处理程序...
      处理程序:
        "D001" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3448>
           (ADDRESS=(PROTOCOL=tcps)(HOST=netplus)(PORT=1934))
        "D000" 已建立:7 已被拒绝:0 当前: 6 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3996>
           (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1933))
        "DEDICATED" 已建立:1 已拒绝:0 状态:ready
           LOCAL SERVER
服务 "orcl_XPT" 包含 1 个例程。
    例程 "orcl", 状态 READY, 包含此服务的 3 个处理程序...
      处理程序:
        "D001" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3448>
           (ADDRESS=(PROTOCOL=tcps)(HOST=netplus)(PORT=1934))
        "D000" 已建立:7 已被拒绝:0 当前: 6 最大: 1002 状态: ready
           DISPATCHER <machine: NETPLUS, pid: 3996>
           (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1933))
        "DEDICATED" 已建立:1 已拒绝:0 状态:ready
           LOCAL SERVER
命令执行成功

D:\Documents and Settings\gdy>

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

官方论坛有说到这个问题
http://forums.oracle.com/forums/thread.jspa?threadID=267593


其它:http://www.itpub.net/521086.html

出现这种这题最多的是因为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 Windows Error: 233: Unknown error


配置文件等一下我贴上来。

谢谢!


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

 

window平台真是有点搞不懂,不存是Oracle的问题,呵呵

1、Orale server的配置是Dedicated还是shared server的?
2、client用的版本是多少的?
3、在listener.ora中加如下一行试一下:
direct_handoff_ttc_=off
4、实在不行真得做trace了,分析下。

 

你可能感兴趣的:(TNS)