ORA-12520 TroubleShooting

栏目: 数据库 · 发布时间: 5年前

同事反馈他连接一个新搭建的测试数据库时,报 ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序 错误,在解决他这个问题时,顺便分析、总结一下 ORA-12520 错误。下面重现一下这个场景:

Oracle Client 段的 tnsnames.ora 的配置如下:

MY_TEST=
        (DESCRIPTION=
                (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.5.37)(PORT=49161))
            (CONNECT_DATA=
           (SERVER = SHARED)
                  (SERVICE_NAME = XE)
            )
        )

客户端SQL*PLUS 访问数据库报错:

C:\Users>sqlplus test/test123456@MY_TEST
 
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 8 23:30:47 2019
 
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
 
ERROR:
ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序
 
 
请输入用户名:
 
 
请输入用户名:

ORA-12520 TroubleShooting

在服务器检查是否开启了 shared server 模式(注意,如果配置正确,但是没有开启共享服务器模式,也会报这个错误)

SQL> show parameter shared_servers
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers                   integer     10
shared_servers                       integer     10
SQL> 

在服务器检查 SERVICE_NAME 的信息:

SQL> show parameter service_name;

NAME                                  TYPE         VALUE

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

service_names                         string       XE

SQL> !

oracle@3c939f31e44b:~$ lsnrctl services

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 08-JAN-2019 15:33:45

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

    Handler(s):

      "DEDICATED" established:0 refused:0

         LOCAL SERVER

Service "XE" has 1 instance(s).

  Instance "XE", status READY, has 1 handler(s) for this service...

    Handler(s):

      "DEDICATED" established:102 refused:0 state:ready

         LOCAL SERVER

Service "XEXDB" has 1 instance(s).

  Instance "XE", status READY, has 1 handler(s) for this service...

    Handler(s):

      "D000" established:4 refused:0 current:0 max:1022 state:ready

         DISPATCHER <machine: 3c939f31e44b, pid: 5980>

         (ADDRESS=(PROTOCOL=tcp)(HOST=3c939f31e44b)(PORT=41385))

Service "XE_XPT" has 1 instance(s).

  Instance "XE", status READY, has 1 handler(s) for this service...

    Handler(s):

      "DEDICATED" established:102 refused:0 state:ready

         LOCAL SERVER

The command completed successfully

我们知道如果共享服务器模式连接数据库,是需要通过 DISPATCHER 的,那么要看看参数 dispatchers 是如何配置的。如下所示, dispatchers 里面设置的是 SERVIE_NAMEXEXDB ,不是 XE ,难怪会出这个错误。

ORA-12520 TroubleShooting

ORA-12520 TroubleShooting

那么我们修改一下 DISPATCHERS 参数配置,将 SERVICE_NAME 改为 XE

SQL> show parameter dispatcher;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dispatchers                          string      (PROTOCOL=TCP) (SERVICE=XEXDB)
max_dispatchers                      integer
 
SQL> ALTER SYSTEM SET DISPATCHERS ='(PROTOCOL=TCP) (SERVICE=XE)';
 
System altered.
 
SQL> show parameter dispatcher;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dispatchers                          string      (PROTOCOL=TCP) (SERVICE=XE)
max_dispatchers                      integer
SQL> 

OK ,如下所示,问题解决。此时客户端可以顺利访问数据库了。

ORA-12520 TroubleShooting

说到这里,那么我们就不得不说一下 SERVICE_NAME ,服务名( SERVICE_NAME ):指 listener 提供的对外的服务名,客户端可以通过配置 tnsnmaes.ora 连进行连接, tnsnmaes.ora 文件中的 service_name 要等于服务器端 listener 所注册的服务名,服务名可以通过输入 lsnrctl 后,在输入 service 查看,一般的 service_namelistener.ora 文件中配置(静态注册),或者当没有 listener.ora 文件时,在初始化文件中配置 instance_nameservice_names2 个参数进行动态注册。但是无论采用那种注册方式,都可以通过 lsnrctl-sevice 来检查。上面案例中,配置都没有错,而是在于共享连接的分派器( DISPATCHER )的设置问题,因为共享连接的分派器( DISPATCHER )指定 SERVICE_NAMEXEXDB, 那么客户端访问数据库使用服务名 XE 的话,就只能使用专用连接服务器模式。

另外,我们看看如果数据库实例配置不改动的情况下,需要如何修改客户端的 tnsnames.ora 的条目( entry )需要如何修改。

注意: 下面所谓正确、错误配置,仅仅指服务器配置不改动的情况下,正确配置仅仅指客户端这种配置方式不会报错。而错误配置仅仅指这种配置方式报错。

我们先复原数据库实例的配置,如下所示,然后测试一下其它

ORA-12520 TroubleShooting

错误的配置:

MY_TEST=

        (DESCRIPTION=

                (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.5.37)(PORT=49161))

            (CONNECT_DATA=

           (SERVER = SHARED)

                  (SERVICE_NAME = XE)

            )

        )

正确的配置

1 :不指定共享连接服务器模式,那么默认使用专用连接服务器模式,那么也没有问题。

MY_TEST=

        (DESCRIPTION=

                (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.5.37)(PORT=49161))

            (CONNECT_DATA=

                  (SERVICE_NAME = XE)

            )

2 :使用专用连接服务器模式访问数据库

MY_TEST=

        (DESCRIPTION=

                (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.5.37)(PORT=49161))

            (CONNECT_DATA=

                  (SERVER = DEDICATED)

                  (SERVICE_NAME = XE)

            )

        )

3 :将 SERVICE_NAME 改为 XEXDB ,也可以解决问题。

MY_TEST=

        (DESCRIPTION=

                (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.5.37)(PORT=49161))

            (CONNECT_DATA=

                  (SERVER = SHARED)

                  (SERVICE_NAME = XEXDB)

            )

        )

        )

4 :将 SERVICE_NAME 改为改为 ISD ,也可以解决问题。

MY_TEST=

        (DESCRIPTION=

                (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.5.37)(PORT=49161))

            (CONNECT_DATA=

                     (SERVER = DEDICATED)

                  (SID = XE)

            )

        )

另外,这个问题问题,我们稍微展开下,其实我们清楚,在下面情况下会关闭数据库实例的共享服务连接,

1 设置 SHARED_SERVERS=0

2 关闭 DISPATCH 进程

ALTER SYSTEM SET DISPATCHERS = '';

如下所示, SHARED_SERVERS=0 的情况下:

ORA-12520 TroubleShooting

客户端访问数据库也会报 ORA-12520 错误

C:\Users>sqlplus test/test123456@MY_TEST

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 1 10 22:55:18 2019

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

ERROR:

ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序

请输入用户名 :

2 :关闭 DISPATCH 进程

SQL> alter system set shared_servers=10 scope=both;

System altered.

# 此时,客户端访问数据库正常

SQL> ALTER SYSTEM SET DISPATCHERS = '';

System altered.

SQL>

# 此时,客户端访问数据库报 ORA-12520 错误。

另外,需要注意的是在共享服务器模式下, local namingtnsnames.ora 也可以配置成专用模式,需要注意的是如果使用参数 DEDICATEDORACLE 将单独派生进程进行客户端处理,也就是专用模式。其实如果你看懂了上面案例,那么我们再来看看官方文档对 ORA-12520 的描述,是否有茅塞顿开的感觉呢!

ORA-12520: Listener Could Not Find Available Handler for Requested Type of Server

This message indicates that the type of service handler requested by the client is incorrect or not registered for the requested SERVICE_NAME/INSTANCE_NAME parameters, or the database instance is not registered with the listener.

If you suspect the problem is the wrong type of service handler, then perform the following steps:

If (server=value) is set in the connect descriptor, then ensure that the value is set to the appropriate service handler type for the database, that is, dedicated for dedicated server or shared for dispatchers. You can use the Listener Control utility SERVICES command to see what service handlers are currently registered with the listener.

If the USE_DEDICATED_SERVER parameter is set to ON in the sqlnet.ora file, then ensure the database is configured to use dedicated servers. If it is not, then set this parameter to OFF.

Ensure that the database instance is running. If the instance not running, then start it so that it can register with the listener .

另外,如果运行正常的数据库服务器,突然报 ORA-12520 错误,一般是因为 process 不够引起的。需要增大 processes 参数的值。网上有许多资料,这里不做展开!在此略过。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective JavaScript

Effective JavaScript

赫尔曼 (David Herman) / 黄博文、喻杨 / 机械工业出版社 / 2014-1-1 / CNY 49.00

Effective 系列丛书经典著作,亚马逊五星级畅销书,Ecma 的JavaScript 标准化委员会著名专家撰写,JavaScript 语言之父、Mozilla CTO —— Brendan Eich 作序鼎力推荐!作者凭借多年标准化委员会工作和实践经验,深刻辨析JavaScript 的内部运作机制、特性、陷阱和编程最佳实践,将它们高度浓缩为极具实践指导意义的 68 条精华建议。 本书共......一起来看看 《Effective JavaScript》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具