listener log是一个比较有意思的东西,作为日常运维的一个点,多数的dba都知道清理的方式就是定期备份清下,而这小点子细挖下去会发现还是有些意思的。这里介绍几种日常的清理监听日志的方式以及关注点,我的观点是在做这方面清理的时候,日志有必要制定一个备份策略。
1.offline listener清理
这种方式主要是在停掉了监听或者直接停掉了业务数据库后,对listener.log进程mv或者backup的操作后新建listener.log,或者就是以清理文件内容的方式进行清理。
2.online listener清理
这种清理可以理解为在不影响业务的情况下清理log,这个以oracle角度来区分,区别在于是否禁止listener进程持续写日志上,关闭listener写日志命令如下:
LSNRCTL> set current_listener LSNRCTL> set log_status off --之后备分listener.log,清除log后恢复listener进程的日志记录, LSNRCTL> set log_status on
那么这里在清除log的系统命令上有多种,这里介绍下linux下的3种以及windows上的1种
linux/unix平台:
2.1 cat /dev/null > 要清空的文件
例:
cat /dev/null > /u01/oracle/product/db/network/log/listener.log
2.2 echo “” > 要清空的文件
例:
echo "" > /u01/oracle/product/db/network/log/listener.log
2.3 cp /dev/null 要清空的文件
例:
cp /dev/null /u01/oracle/product/db/network/log/listener.log
以上三种清理都支持在线直接清理日志,可以不禁止listener进程持续写日志的情况下直接执行,只是在考虑点上在前面所说的是否禁止listener进程持续写日志。我日常使用2.1的方式,从系统效率上cp /dev/null的方式会优于其他2种。
Windows平台
2.4 @echo.> 要清空的文件
例:
@echo.> D:\oracle\listener.log
3.rename file方式清理
这个方法在10g之前的版本可以使用,在11g由于adr的设置需要禁止adr后才能够使用,否则会遭遇“TNS-01251: Cannot set trace/log directory under ADR”的错误。
登陆listener控制台,命令如下:
LSNRCTL>set current_listener LSNRCTL>set log_file LSNRCTL>save_config
例:
LSNRCTL>set current_listener LISTENER1 LSNRCTL>set log_file listener1_1.log LSNRCTL>save_config
当执行完set log_file这个命令后,系统更新listener.ora文件,同时生成新的listener日志,此后就可以对老的listener.log进行处理。这种方式在sun的solaris蹭遭遇过bug导致监听进程offline,所以使用时候注意平台。还有一个注意点就是在多个监听下分别对每个监听的日志进行清理时候需要分开执行,因为save_config会覆盖当前设置之前的其他监听的设置,导致前面的设置失效。