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)端口: