Menu Close

ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序

1. 问题简述

在PL/SQL中打开新窗口,并执行SQL语句时报 ORA-12516错误

2. 报错信息

2.1. 报错内容

  • 中文
    TNS:监听程序找不到符合协议堆栈要求的可用处理程序。

  • 英文
    TNS:listener could not find available handler with matching protocol stack

2.2. 报错截图

3. 问题分析

3.1. 错误解释

[oracle@dbtest ~]$ oerr ora 12516
12516, 00000, "TNS:listener could not find available handler with matching protocol stack"
// *Cause: None of the known and available service handlers for the given 
// SERVICE_NAME support the client's protocol stack: transport, session, 
// and presentation protocols.
// *Action: Check to make sure that the service handlers (e.g. dispatchers) 
// for the given SERVICE_NAME are registered with the listener, are accepting 
// connections, and that they are properly configured to support the desired 
// protocols.

出现该错误时,说明数据库的连接达到了设定的上限,不允许新的会话创建连接。

3.2. 分析问题

  • (1) 取得数据库进程数的上限
SELECT value
  FROM v$parameter a
 WHERE a.name = 'processes';
  • (2) 查看当前数据库已连接的会话数
SELECT COUNT(*)
  FROM v$process;
  • (3) 按用户统计已连接的会话数
SELECT b.username,b.machine,b.program, COUNT(*)
  FROM v$process a
  LEFT JOIN v$session b ON a.addr = b.paddr
 GROUP BY b.username,b.machine,b.program
 ORDER BY 4 DESC;

4. 问题解决

  • (1) 增加数据库的进程上限,但需要重启数据库
alter system set processes=800 scope=spfile;
# 重启数据库,使更改生效
  • (2) 通知连接不当的应用程序,禁止其连接
revoke connect from user_name;

5. 问题总结

ORA-12516错误一般是由于数据库的当前会话数不满足造成的,可以视业务需要增加processes和sessions参数的大小,这二者的关系是:

在Oracle11g中为:sessions = (1.1 * processes + 5)
在Oracle12c中为:sessions = (1.5 * PROCESSES) + 22

6. 其他扩展现象

数据库异常停机后,服务器时间异常,导致连接也报 ORA-12516 错误,重启了监听后解决问题。

附录:关联或参考文档

A. 关联的文档

清理Oracle监听日志:http://dba.qishuo.xin/?p=411
使用脚本分析Oracle listener日志:http://dba.qishuo.xin/?p=417
Oracle 使用 SCANs 是如何创建数据库连接:http://dba.qishuo.xin/?p=1755
Oracle RAC 修改侦听 (listener)端口: