环境: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可执行文件权限
本文参考链接: