Oracle监听 报错TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序

最近接了个公司的锅,2012年的老项目要改需求。用的struts2开发的,数据库用的oracle。瞬间感觉好苦逼。。。。没办法,锅已经背上了,要好好搞啊~~~

进去数据库服务器,用PL/SQL连接,发现连接不上。。。。。说是12541: TNS: 无监听程序 。检查了一下oracle的服务,该开的都开了,然并卵。。

上网查了下问题,有的说是什么host改成本地主机名的或者localhost的 或者替换oci.dll文件的 统统无用。(悲催ing)最后想在NET manager里面重新配置一下服务,发现配置的时候卡的一比,,最后搞了半天,终于搞出来了。。现在把问题解决方式奉献如下:

首先在CMD窗口执行lsnrctl status,发现错误原因如下:

TNS-12541: TNS: 无监听程序

TNS-12560: TNS: 协议适配器错误

TNS-00511: 无监听程序 

Oracle监听 报错TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序

网上有个解决TNS-12535错误的案例,平台和版本都很类似,如下:
1、在 sqlnet.ora文件中 增加如下行:
DIAG_ADR_ENABLED = OFF
2、在listener.ora文件中增加如下行:
DIAG_ADR_ENABLED_<listenername> = OFF
如何监听是listener时,则前面的名称为:DIAG_ADR_ENABLED_LISTENER = OFF
3、重新启动windows服务管理中的监听程序.先停止,然后再重新启动.
4、检查结果.发现可以了,返回的值在10毫秒.有时为0毫秒.成功!!

但这并不是问题发生原因,在继续排查过程中偶然发现监听日志大小居然为4G。

Oracle监听 报错TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序


搜索过后才知道这是oracle的一个Bug,BUG号为9879101 :

THE CONNECT THROUGH LISTENER WAS SLOW WHEN LISTNER LOG GROWED 4GB。

那么如何解决呢??网上搜的答案如下。。。

You can solve this problem by deleting the large listener in $ORACLE_BASE\diag\tnslsnr\<hostname>\listener\trace\<listener_name>.log
1)  Stop the listener process using the command line or Control Panel Service.

2) Delete the log file(s) that are at or approaching the 4G size limit at this location:
$ORACLE_BASE\diag\tnslsnr\<hostname>\listener\trace\<listener_name>.log
3)  Issue any lsnrctl command and you will see a new listener.log in its place under:
$ORACLE_BASE\diag\tnslsnr\<hostname>\listener\trace\


Since ADR Diagnostics are enabled for this listener these steps cannot be done dynamically using the lsnrctl utility. 
e.g.
LSNRCTL>set log_file mylog
Will yield:  TNS-01251: Cannot set trace/log directory under ADR.

However, it is possible to disable the flat file listener logging using the following commands:

LSNRCTL>set current_listener <listener_name>
LSNRCTL>set log_status OFF
LSNRCTL>save_config

大概意思就是:

1)LSNRCTL进入交互模式
2)执行set current_listener LISTENER
3)set log_status off
4)stop 停止监听器
5)手工删除ADR指定的监听日志路径下的listener.log文件
6)start重启监听器

就是那个4G的log在作怪路径:$ORACLE_BASE\diag\tnslsnr\<hostname>\listener\trace\<listener_name>.log  

至此,问题得到完美解决。希望能帮到你。