環境: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
新聞熱點
疑難解答