ORA-12537: TNS:connection closed

环境:Oracle linux 5.8 + Oracle 11g rac

问题描述

客户端PLSQL与服务器端SQLplus都无法连接数据库,报错ORA-12537:TNS:Connection closed

原因分析:

1.检查监听状态

lsnrctl status正常,查看listener.log(当PLSQL连接错误时,listener.log会有TNS:12518的错误)

2.TNS问题

造成TNS:12518错误的原因可能是processes和session值设置太小或者dispatcher使用率过高

1)使用PLSQL本地连接到Oracle,分别查看process进程数和session会话数

select count(*) from v$process; --取得数据库目前的进程数。
select value from v$parameter where name = 'processes';     --取得进程数的上限。

select count(*) from v$session; --取得数据库目前的会话数。
select value from v$parameter where name = 'sessions'; --取得会话数的上限。

 

从上图中可以看出process进程数和session会话数都比预设最高值低很多,排除此原因

若需要修改process进程数和session会话数

a)  修改process值
alter system set processes=1000 scope=spfile;   --将process值改为1000
b)  修改session值
alter system set sessions=1105 scope=spfile;    --将sessions值改为1105

之后重启数据库生效

2)当前dispatcher个数不够,dispatcher使用率过高

 

--查看当前dispatchers个数和部分信息。一般默认安装的库只有一个
select name,busy,status,accept,idle from v$dispatcher; 
--查看dispatchers使用率
select name,(busy/(busy+idle))*100 "busy rate%" from v$dispatcher; 

 

从上图中可以看出dispatcher使用率为0,排除此原因

若需要修改dipacther个数

--修改dispatchers个数为3.之后重启数据库
alter system set dispatchers='(protocol=tcp)(dispatchers=3)(service=youroracleservicenameXDB)';	

3.重启系统

不符合上述几种情形后,决定重启系统(暂时没有生产数据,不会对业务产生影响),但是重启系统之后再次尝试,问题依旧存在

shutdown -g0 -y -i6

4.重新安装数据库

未解决问题

5.本次故障的真正原因

oracle文件的执行权限意外变更

找到服务器上$ORACLE_HOME/bin下的oracle文件的权限

 

再次使用客户端PLSQL和服务器端sqlplus连接数据库,可以成功连接,问题解决!

进一步分析:由于oracle派生进程需要用到可执行文件oracle,所以该文件权限被意外修改之后派生进程会出现异常,因为监听派生进程本质上会调用到$ORACLE_HOME/bin/oracle可执行文件派生。

6.总结

一般监听发生问题不外乎检查如下几项:

1)/etc/hosts及域名解析配置文件

2)监听日志大小

3)监听状态

4)$ORACLE_HOME/bin下oracle可执行文件权限

 

 

本文参考链接:

ORA-12537: TNS:connection closed问题解决

ORA-12518: TNS: 监听程序无法分发客户机连接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值