TNS-12519(ORA-12519) 或 TNS-12516(ORA-12516)问题分析和处理

本文分析了Oracle数据库遇到TNS-12519和TNS-12516错误的原因,包括数据库PROCESSES参数设置不合理、负载过高、PMON或监听异常等,并提供了相应的解决对策,如调整PROCESSES参数、优化应用、检查PMON和监听器工作状态以及修复监听配置问题。
一.问题背景分析
   首先简单说明Oracle数据库监听注册的机制:PMON进程负责周期性(单个周期最长不超过10分钟,根据数据库负载不同而有所差异)将数据库的相关信息(主要包含:数据库服务名、数据库的当前负载和最大负载、服务句柄的相关信息及负载)更新到监听程序,监听程序根据收到的相关信息进行业务的分发工作:
          1).根据客户端的请求和服务句柄提供的服务信息确定请求的转发地址;
          2).根据数据库的负载信息进行动态分配请求,确保多个实例间的LB;
          3).根据数据库进程占用量(PROCESSES参数)确保是否继续允许用户接入(超过限制将会把服务状态置为BLOCKED);
          4).当PMON更新数据库负载再次低于限制值时将服务状态从BLOCKED置为READY.
          5).监听会记录通过此服务句柄连入数据库的连接数量;
         
二.出现故障的可能性
结合以上原理说明,可以看出一下情况可能会导致用户登陆时报错:TNS-12519(ORA-12519) 或 TNS-12516(ORA-12516).
          1).数据库PROCESSES参数设置不合理(设置太小);
          2).数据库负载过重导致PMON延时注册到监听的负载不准确(间歇性连接异常);
          3).PMON未正常工作,没有将负载信息更新到监听;
          4).监听未正常工作,没有合理处理PMON注册的信息;
          5).监听配置不合理
         
三.故障的相关对策
1.数据库PROCESSES参数设置不合理,当用户创建新的连接时数据库因资源限制无法为用户分配新的server process。检查v$resource_limit试图确认processes资源的使用量,如果MAX_UTILIZATION达到LIMIT_VALUE则说明曾经达到过峰值。那么我们需要结合业务的情况调整PROCESSES参数的值。(参照:Troubleshooting Guide TNS-12519 TNS-12516 ORA-12519 ORA-12516 (Doc ID 552765.1))
    
     2.数据库负载过重的话可以从下列方向进行处理:优化应用缩短单个会话的占用时间、主机扩容等;
    
3.PMON或监听异常(已知BUG 8232287:PMON HAS STOPPED REGISTERING ITS SERVICES),如果数据库版本为:10g(10.1.0.2-10.2.0.4)则升级到10.2.0.4.3或者10.2.0.5; 11g(11.2.0.1以前)则升级到11.2.0.1。该BUG的表象为:
          1) The listener.log no longer shows service_update messages from that instance.
          2) Not being able to make new connections to the database
          3) ORA-12516: TNS:listener could not find available handler with matching protocol stack
     4.用户监听配置不合理(10.1.0.2-10.2.0.1 RAC环境将LOCAL_LISTENER和REMOTE_LISTENER中同时包含了VIP和物理IP),解决方案为:确保参数中仅涉及到VIP:
          Setup the spfile/pfile to have only the VIP addresses of the node. For example:
LOCAL_LISTENER = 'LOCAL_LISTENER'
REMOTE_LISTENER = 'REMOTE_LISTENERS'

          And in the TNSNAMES.ORA file
LOCAL_LISTENER = (ADDRESS = (PROTOCOL = TCP)(HOST = VIP1)(PORT = 1521))
REMOTE_LISTENERS = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = VIP1)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = VIP2)(PORT = 1521)))
    
四.BUG分析案例
1.故障产生的现象
2015-07-14 09:13开始,AZCLWEB应用开始陆续无法连接该数据库。10:10开始Efinance/EHR开始出现所有客户端出现无法连接的现象。应用新连接请求均无法连接数据库(其中如已建立连接的会话不受该问题影响,并且同一主机的多个实例都有相同问题),本地可以连接数据库(测试错误信息如下)。
C:\Users\Administrator>sqlplus system@efinance
SQL*Plus: Release 10.1.0.2.0 - Production on Tue Jul 14 10:14:12 2015
Copyright (c) 1982, 2004, Oracle.  All rights reserved.
Enter password:
ERROR:
ORA-12519: TNS:no appropriate service handler found
Enter user-name: system
Enter password:
ERROR:
ORA-12560: TNS:protocol adapter error
Enter user-name: system
Enter password:
ERROR:
ORA-12560: TNS:protocol adapter error
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
                              
2. 问题分析
监听器日志第一次报异常时间点的相关信息为:
14-JUL-2015 09:13:55 * (CONNECT_DATA=(SERVICE_NAME=azclweb)(CID=(PROGRAM=C:\Apache2\bin\httpd.exe)(HOST=VM-WEBWWW-APP)(USER=SYSTEM))) * 
(ADDRESS=(PROTOCOL=tcp)(HOST=129.1.101.29)(PORT=65269)) * establish * azclweb * 12516
TNS-12516: TNS:listener could not find available handler with matching protocol stack
14-JUL-2015 09:13:55 * (CONNECT_DATA=(SERVICE_NAME=azclweb)(CID=(PROGRAM=C:\Apache2\bin\httpd.exe)(HOST=VM-WEBWWW-APP)(USER=SYSTEM))) * (ADDRESS=(PROTOCOL=tcp)(HOST=129.1.101.29)(PORT=65269)) * establish * azclweb * 12516
TNS-12516: TNS:listener could not find available handler with matching protocol stack

故障发生前,监听器日志中,关于pmon进程和oracle监听器最后通讯情况如下:
14-JUL-2015 09:04:42 * service_update * azclweb * 0
Tue Jul 14 09:04:44 2015
注:该时间点service_update为PMON最后一次正常与监听间进行通信。

直到14-JUL-2015 10:21:59数据库EHR重新启动后才有pmon进程和oracle监听器进行通讯,
14-JUL-2015 10:21:59 * service_update * EHR * 0

所以从现象分析为pmon没有和监听器及时通讯,导致监听器无法获取各个数据库的实际连接数的情况,最终导致监听器拒绝新的连接请求。

3.总结
综合上述现象和MOS中的文档PMON and the Listener Suddenly Start Denying New Connections With TNS-12516 (Doc ID 1082370.1)描述问题吻合(主要表现为BUG 8232287的表现)。

4.解决方法或临时解决方式
该bug在11.1.0.6上没有oneoff补丁。解决办法主要2个:
1)升级到11.1.0.7并应用补丁8232287
2)升级到11.2.0.1及之后的版本
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值