环境: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: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值改为1000b) 修改session值alter system set sessions=1105 scope=spfile; --将sessions值改为1105之后重启数据库生效2)当前dispatcher个数不够,dispatcher使用率过高
select name,busy,status,accept,idle from v$dispatcher; --查看当前dispatchers个数和部分信息。一般默认安装的库只有一个。select name,(busy/(busy+idle))*100 "busy rate%" from v$dispatcher; --查看dispatchers使用率
从上图中可以看出dispatcher使用率为0,排除此原因
若需要修改dipacther个数
alter system set dispatchers='(protocol=tcp)(dispatchers=3)(service=youroracleservicenameXDB)'; --修改dispatchers个数为3.之后重启数据库3.重启系统
不符合上述几种情形后,决定重启系统(暂时没有生产数据,不会对业务产生影响),但是重启系统之后再次尝试,问题依旧存在
shutdown -g0 -y -i64.重新安装数据库
未解决问题
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可执行文件权限
本文参考链接:
http://blog.itpub.net/28380626/viewspace-754428/
http://blog.csdn.net/zhouxinhong/article/details/7396910
新闻热点
疑难解答