如201903文所述,我们的一台下发库周五还可以plsql连接的,周一来就只可以通过服务器命令行的sqlplus方式连接上,但是,通过plsql就没法连接上。
监听删除,重建
监听服务关闭、启动
数据库关闭、启动
服务器关闭、启动
都没能解决问题。
到底发生了什么呢?
我们自己折腾了一天都没能解决。
工程师断定是系统问题。
我们就以为无解了。
后来,幸亏又请了另一位工程师到现场,他一看,发现监听程序缓慢,就立马定位了问题:
listner.log日志文件达到4G了。
这一刻,深刻地领悟到,所有的问题,都需要查日志啊!!!
但后来想想,即便我当时查看了日志,也不能意识到是因为日志满了没法往里写的原因吧。
但需要说明的是,
查日志是非常有必要的也是非常高效的解决问题的方法!
说这是Oracle数据库在Windows操作系统中的bug。
BUG号为9879101
参考文档如下:
ID 1319797.1 :
WINDOWS: Listener Hangs & Lsnrctl Commands Are Slow or Hang
You can solve this problem by deleting the large listener in
$ORACLE_BASE\diag\tnslsnr<hostname>\listener\trace<listener_name>.log
- Stop the listener process using the command line or Control Panel Service.
- 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 - 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
当时工程师的做法是:
- 关闭监听 lsrnctl stop
- 删监听日志文件
- 删除监听、重建监听
- Cmd中,lsrntrl
Lsnctl> set logfile new_logfile
Lsnctl> set current_listener listener(新监听的名字)
Lsnctl> set log_status OFF
Lsnctl> save_config - 然后在服务里,重启了下监听服务
- 连接就成功了。
在4中, 工程师用 set log_status OFF把监听日志关闭了
这样从根本上断绝了该问题再次发生的可能。
但从另一方面讲,有日志才有源可溯,所以,可以在
Lsnctl> set log_status ON
等下次再出现这个问题,再重复上述操作就是喽~