码迷,mamicode.com
首页 > 其他好文 > 详细

我所不知道的的监听日志问题

时间:2016-06-22 00:06:59      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

今天,有开发人员向我反馈:“代码时有连不上数据库的情况发生”。在了解了一些基本情况之后,希望能通过查看监听日志获取问题线索。首先是通过如下方式确定监听日志的存放路径:

LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 21-JUN-2016 21:19:56

Copyright (c) 1991, 2007, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date                21-JUN-2016 12:02:41
Uptime                    0 days 9 hr. 17 min. 15 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/product/10.2.0/db_1/network/log/listener_rac1.log
Listening Endpoints Summary...

 

监听日志被用于记录客户端向服务端的建立连接的情况,同时也会记录监听注册和动态注册等方面的信息。在查看监听日志的过程中,发现日志文件较大,vi编辑器打开较慢,只好通过tail -10000 listener_rac1.log > view.txt的方式转储其内容,其中并无开发人员所描述的连接不上的情况记录。日志节选部分内容如下:

21-JUN-2016 21:22:13 * service_update * dsdb1 * 0
21-JUN-2016 21:22:13 * service_update * dsdb1 * 0
21-JUN-2016 21:22:33 * (CONNECT_DATA=(SID=dsdb1)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=198.168.9.53)(PORT=36304)) * establish * dsdb1 * 0
21-JUN-2016 21:22:33 * (CONNECT_DATA=(SID=dsdb1)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=198.168.9.53)(PORT=36303)) * establish * dsdb1 * 0
21-JUN-2016 21:23:03 * (CONNECT_DATA=(SID=dsdb1)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=198.168.9.53)(PORT=36907)) * establish * dsdb1 * 0

 

在寻找答案的过程中发现“LISTENER.LOG日志大小不能超过2GB,超过会导致LISTENER监听器无法处理新的连接”这样一条线索。但是又说该类问题“只是发生在老旧的32bit Linux或Unix系统下面,真实的原因是一些32bit OS自带的文件系统不支持2GB以上的文件,导致监听服务进程(tnslsnr)append write日志文件出错”。我的环境可是64位的Linux系统啊,不管怎么样,还是希望处理一下过大的日志文件(722MB)。那么该如何处理这个文件呢?是否可以基于处理alert日志的经验,直接删除或重命名文件呢?

实践证明,这样做是不可行的。尽管已经将日志文件重命名,但是连接信息依旧记录到了重命名后的日志文件中。怎样才是正确的截断监听日志的做法呢?其实大可不必去百度和Google,只用LSNRCTL的help就可以解决问题(有时候Oracle工具的内置帮助还是很贴心的):

LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:

start               stop                status              
services            version             reload              
save_config         trace               spawn               
change_password     quit                exit                
set*                show*               

没错。就是用set命令!set要怎么用呢?还可以继续help,方法如下:

LSNRCTL> set help
The following operations are available after set
An asterisk (*) denotes a modifier or extended command:

password                    rawmode                     
displaymode                 trc_file                    
trc_directory               trc_level                   
log_file                    log_directory               
log_status                  current_listener            
inbound_connect_timeout     startup_waittime            
save_config_on_stop         dynamic_registration        

所以,截断监听日志的正确做法应该按如下步骤进行:

1.停止监听服务进程记录日志:set log_status off 

2.重命名或删除监听日志文件

3.开启监听服务进程记录日志:set log_status on

log_file:用于指定监听日志的存放路径。通常,在截断监听日志之后,监听服务进程会在默认的路径下创建一个名为Listener.log的文件,但是在我的环境中,监听日志的的名字为Listener_rac1.log,所以会用到这个命令。另外还要注意一点的是,log_file命令只有在log_status为ON的状态下才能正确的使用。

一个小小的监听日志的截断就有这么多名堂,Oracle的复杂性还真是名不虚传!开发人员反馈的问题没有解决,但是也没有重现。学到了一些过去没有注意到的知识,权当是收获了! 

我所不知道的的监听日志问题

标签:

原文地址:http://www.cnblogs.com/sunmengxyz/p/5605222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!