ORA-12520 TNS:Listener count not find available handler for requested type of server错误解决办法

晨曦之光 发布于 2012/04/25 16:17
阅读 520
收藏 0

专有服务器进程是与客户端进程是一对一映射,即时生成,即时消失。用户会话数据和游标状态放在PGA里

共享服务器进程是已经存在的,分为2部分,一种是dispatch进程,一种是共享服务器进程。
dispatch进程与user进程建立连接,把用户请求放入SGA的请求队列里,共享进程取出请求进行处理,处理完后放入SGA响应队列,dispatch进程取出处理结果给用户进程。一个dispatch可以和250或300个客户端进程进行连接。一个请求队列,多个响应队列。用户会话数据和游标状态放在SGA里。


ORA-12520错误可能的原因和解决方法 
ORA-12520监听程序无法为请求的服务器类型找到可用的处理程序:
1,数据库是专用服务器,但是在tnsname.ora配置中设置了连接方式为shared,这种情况下打开tnsname.ora, 
   把(server = shared) 改成 (server = dedicate)

 2,数据库设置为了shared模式,但是参数dispatchers='(PROTOCOL=TCP) (SERVICE=orcl)‘配置的service和本地tns中指定的SERVICE_NAME不同,这里的SERVICE=orcl表示通过orcl服务连接到数据库的时候,dispatch到某个共享服务器进程。

如配置一个与之对应的tns这可以用shared模式连接到数据库。

ORCLS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = PC-6753184)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = SHARED)
      (SERVICE_NAME = orcl)
    )
  )

假设数据库同时有别的service(可以通过lsnrct status查看)如下面的ORCLA,ORCLB都是service名称,这些service都是可以被用在tns配置中的,但不是可以设置为shared模式连接的。意味着数据库中的连接有的是专用模式,有的是共享模式。如果用共享模式连接,还有就是SERVICE_NAME指定的service只能用动态注册的服务名。

Services Summary...
Service "ORCLA" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "ORCLB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...

如果这时候配置一个tns如下:

ORCLA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = PC-6753184)(PORT = 1522))
    )
    (CONNECT_DATA =
    (SERVER = SHARED)
      (SERVICE_NAME = orcla)
    )
  )

这时候因为dispatchers='(PROTOCOL=TCP) (SERVICE=orcl)‘配置和这里的SERVICE_NAME不同,用sqlplus test/test@orcla 连接就会得到ORA-12520错误。

解决办法是修改SERVICE_NAME = orcl,或者修改dispatchers='(PROTOCOL=TCP)‘所有的连接都已shared模式,推荐用前者。

(这样的话,可以对某一种业务配置的tns连接使用共享模式,如OLTA类型的,对有的业务用专用模式连接)

连接上数据库后,通过查看

select * from v$session where sid in(select distinct(sid) from v$mystat)
server的值如果是DEDICATED表示为专用模式,shared为共享模式。


3)是由于process不够引起的 

查看当前的连接数 
select count(*) from v$process;

设置的最大连接数(默认值为150) 
select value from v$parameter where name = 'processes';

修改最大连接数 
alter system set processes = 300 scope = spfile

重新启动

select * from v$shared_server 查看共享进程的信息,正在执行,等待请求等。

select * from  v$dispatcher查看共享调度器的信息,dispatchers=如果配置了(dispatchers=数量),可以看到数量条数据。

select * from v$circuit 查看那个session连接到了那个dispatcher,那个服务器进程在为其服务。




原文链接:http://blog.csdn.net/kkdelta/article/details/7183140
加载中
返回顶部
顶部