Oracle-Listener log解读
Listener log 概述
在ORACLE數據庫中,如果不對監聽日志文件(listener.log)進行截斷,那么監聽日志文件(listener.log)會變得越來越大.
Listener log location
For oracle 9i/10g
在下面的目錄下:
$ORACLE_HOME/network/log/listener_$ORACLE_SID.logFor oracle 11g/12c
在下面的目錄下:
$ORACLE_BASE/diag/tnslsnr/主機名稱/listener/trace/listener.log或者通過 lsnrctl status 也可以查看位置
這里展示的是 xml格式的日志,跟.log并無區別。
或者11g可以通過 adrci 命令
oracle@entel2:[/oracle]$adrciADRCI: Release 11.2.0.4.0 - Production on Wed Nov 30 20:56:28 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.ADR base = "/oracle" adrci> help --help可以看幫助命令。輸入help show alert,可以看到show alert的詳細用法HELP [topic]Available Topics:CREATE REPORTECHOEXITHELPHOSTIPSPURGERUNSET BASESET BROWSERSET CONTROLSET ECHOSET EDITORSET HOMES | HOME | HOMEPATHSET TERMOUTSHOW ALERTSHOW BASESHOW CONTROLSHOW HM_RUNSHOW HOMES | HOME | HOMEPATHSHOW INCDIRSHOW INCIDENTSHOW PROBLEMSHOW REPORTSHOW TRACEFILESPOOLThere are other commands intended to be used directly by Oracle, type"HELP EXTENDED" to see the listadrci> show alert --顯示alert信息Choose the alert log from the following homes to view:1: diag/clients/user_oracle/host_880756540_80 2: diag/tnslsnr/procsdb2/listener_cc 3: diag/tnslsnr/entel2/sid_list_listener 4: diag/tnslsnr/entel2/listener_rb 5: diag/tnslsnr/entel2/listener 6: diag/tnslsnr/entel2/listener_cc 7: diag/tnslsnr/procsdb1/listener_rb 8: diag/rdbms/ccdg/ccdg 9: diag/rdbms/rb/rb 10: diag/rdbms/cc/cc Q: to quitPlease select option: 5 --輸入數字,查看對應日志 Output the results to file: /tmp/alert_13187_1397_listener_3.ado2016-06-27 09:15:45.164000 -04:00 Create Relation ADR_CONTROL Create Relation ADR_INVALIDATION Create Relation INC_METER_IMPT_DEF 2016-06-27 09:15:46.444000 -04:00 Create Relation INC_METER_PK_IMPTS System parameter file is /oracle/product/112/network/admin/listener.ora Log messages written to /oracle/diag/tnslsnr/entel2/listener/alert/log.xml Trace information written to /oracle/diag/tnslsnr/entel2/listener/trace/ora_16175_140656975550208.trc Trace level is currently 0Started with pid=16175 Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.45.7.198)(PORT=1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.123.1)(PORT=1521))) Listener completed notification to CRS on start ...... ...... ......Listener log日志文件清理
需要對監聽日志文件(listener.log)進行定期清理。
1:監聽日志文件(listener.log)變得越來越大,占用額外的存儲空間
2:監聽日志文件(listener.log)變得太大會帶來一些問題,查找起來也相當麻煩
3:監聽日志文件(listener.log)變得太大,給寫入、查看帶來的一些性能問題、麻煩
定期對監聽日志文件(listener.log)進行清理,另外一種說法叫截斷日志文件。
列舉一個錯誤的做法
oracle@entel2:[/oracle]$mv listener.log listener.log.20161201 oracle@entel2:[/oracle]$cp /dev/null listener.log oracle@entel2:[/oracle]$more listener.log如上所示,這樣截斷監聽日志(listener.log)后,監聽服務進程(tnslsnr)并不會將新的監聽信息寫入listener.log,而是繼續寫入listener.log.20161201
正確的做法
1:首先停止監聽服務進程(tnslsnr)記錄日志。
oracle@entel2:[/oracle]$lsnrctl set log_status off2:將監聽日志文件(listener.log)復制一份,以listener.log.yyyymmdd格式命名
oracle@entel2:[/oracle]$cp listener.log listener.log.201612013:將監聽日志文件(listener.log)清空。清空文件的方法有很多
oracle@entel2:[/oracle]$echo “” > listener.log 或者 oracle@entel2:[/oracle]$cp /dev/null listener.log 或者 oracle@entel2:[/oracle]$echo /dev/null > listener.log 或者 oracle@entel2:[/oracle]$>listener.log4:開啟監聽服務進程(tnslsnr)記錄日志
oracle@entel2:[/oracle]$lsnrctl set log_status on當然也可以移走監聽日志文件(listener.log),數據庫實例會自動創建一個listener.log文件。
oracle@entel2:[/oracle]$ lsnrctl set log_status offoracle@entel2:[/oracle]$mv listener.log listener.yyyymmddoracle@entel2:[/oracle]$lsnrctl set log_status on清理shell腳本
當然這些操作應該通過shell腳本來處理,然后結合crontab作業定期清理、截斷監聽日志文件。
簡單一點的(核心部分)
rq=` date +"%d" ` cp $ORACLE_HOME/network/log/listener.log $ORACLE_BACKUP/network/log/listener_$rq.log su - oracle -c "lsnrctl set log_status off" cp /dev/null $ORACLE_HOME/network/log/listener.log su - oracle -c "lsnrctl set log_status on"這樣的腳本還沒有解決一個問題,就是截斷的監聽日志文件保留多久的問題。比如我只想保留這些截斷的監聽日志一個月時間,我希望作業自動維護。不需要我去手工操作。有這樣一個腳本cls_oracle.sh可以完全做到這個,當然它還會歸檔、清理其它日志文件,例如告警文件(alert_sid.log)等等。功能非常強大。
#!/bin/bash # # Script used to cleanup any Oracle environment. # # Cleans: audit_log_dest # background_dump_dest # core_dump_dest # user_dump_dest # # Rotates: Alert Logs # Listener Logs # # Scheduling: 00 00 * * * /home/oracle/_cron/cls_oracle/cls_oracle.sh -d 31 > /home/oracle/_cron/cls_oracle/cls_oracle.log 2> &1 # # Created By: Tommy Wang 2012-09-10 # # History: #RM="rm -f" RMDIR="rm -rf" LS="ls -l" MV="mv" TOUCH="touch" TESTTOUCH="echo touch" TESTMV="echo mv" TESTRM=$LS TESTRMDIR=$LSSUCCESS=0 FAILURE=1 TEST=0 HOSTNAME=`hostname` ORAENV="oraenv" TODAY=`date +%Y%m%d` ORIGPATH=/usr/local/bin:$PATH ORIGLD=$LD_LIBRARY_PATH export PATH=$ORIGPATH# Usage function. f_usage(){echo "Usage: `basename $0` -d DAYS [-a DAYS] [-b DAYS] [-c DAYS] [-n DAYS] [-r DAYS] [-u DAYS] [-t] [-h]"echo " -d = Mandatory default number of days to keep log files that are not explicitly passed as parameters."echo " -a = Optional number of days to keep audit logs."echo " -b = Optional number of days to keep background dumps."echo " -c = Optional number of days to keep core dumps."echo " -n = Optional number of days to keep network log files."echo " -r = Optional number of days to keep clusterware log files."echo " -u = Optional number of days to keep user dumps."echo " -h = Optional help mode."echo " -t = Optional test mode. Does not delete any files." }if [ $# -lt 1 ]; thenf_usageexit $FAILURE fi# Function used to check the validity of days. f_checkdays(){if [ $1 -lt 1 ]; thenecho "ERROR: Number of days is invalid."exit $FAILUREfiif [ $? -ne 0 ]; thenecho "ERROR: Number of days is invalid."exit $FAILUREfi } # Function used to cut log files. f_cutlog(){# Set name of log file.LOG_FILE=$1CUT_FILE=${LOG_FILE}.${TODAY}FILESIZE=`ls -l $LOG_FILE | awk '{print $5}'`# Cut the log file if it has not been cut today.if [ -f $CUT_FILE ]; thenecho "Log Already Cut Today: $CUT_FILE"elif [ ! -f $LOG_FILE ]; thenecho "Log File Does Not Exist: $LOG_FILE"elif [ $FILESIZE -eq 0 ]; thenecho "Log File Has Zero Size: $LOG_FILE"else# Cut file.echo "Cutting Log File: $LOG_FILE"$MV $LOG_FILE $CUT_FILE$TOUCH $LOG_FILEfi }# Function used to delete log files. f_deletelog(){# Set name of log file.CLEAN_LOG=$1# Set time limit and confirm it is valid.CLEAN_DAYS=$2f_checkdays $CLEAN_DAYS# Delete old log files if they exist.find $CLEAN_LOG.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] -type f -mtime +$CLEAN_DAYS -exec $RM {} \; 2>/dev/null }# Function used to get database parameter values. f_getparameter(){if [ -z "$1" ]; thenreturnfiPARAMETER=$1sqlplus -s /nolog <<EOF | awk -F= "/^a=/ {print \$2}" set head off pagesize 0 feedback off linesize 200 whenever sqlerror exit 1 conn / as sysdba select 'a='||value from v\$parameter where name = '$PARAMETER'; EOF }# Function to get unique list of directories. f_getuniq(){if [ -z "$1" ]; thenreturnfiARRCNT=0MATCH=Nx=0for e in `echo $1`; doif [ ${#ARRAY[*]} -gt 0 ]; then# See if the array element is a duplicate.while [ $x -lt ${#ARRAY[*]} ]; doif [ "$e" = "${ARRAY[$x]}" ]; thenMATCH=Yfidonefiif [ "$MATCH" = "N" ]; thenARRAY[$ARRCNT]=$eARRCNT=`expr $ARRCNT+1`fix=`expr $x + 1`doneecho ${ARRAY[*]} }# Parse the command line options. while getopts a:b:c:d:n:r:u:th OPT; docase $OPT ina) ADAYS=$OPTARG;;b) BDAYS=$OPTARG;;c) CDAYS=$OPTARG;;d) DDAYS=$OPTARG;;n) NDAYS=$OPTARG;;r) RDAYS=$OPTARG;;u) UDAYS=$OPTARG;;t) TEST=1;;h) f_usageexit 0;;*) f_usageexit 2;;esac done shift $(($OPTIND - 1))# Ensure the default number of days is passed. if [ -z "$DDAYS" ]; thenecho "ERROR: The default days parameter is mandatory."f_usageexit $FAILURE fi f_checkdays $DDAYSecho "`basename $0` Started `date`."# Use test mode if specified. if [ $TEST -eq 1 ] thenRM=$TESTRMRMDIR=$TESTRMDIRMV=$TESTMVTOUCH=$TESTTOUCHecho "Running in TEST mode." fi# Set the number of days to the default if not explicitly set. ADAYS=${ADAYS:-$DDAYS}; echo "Keeping audit logs for $ADAYS days."; f_checkdays $ADAYS BDAYS=${BDAYS:-$DDAYS}; echo "Keeping background logs for $BDAYS days."; f_checkdays $BDAYS CDAYS=${CDAYS:-$DDAYS}; echo "Keeping core dumps for $CDAYS days."; f_checkdays $CDAYS NDAYS=${NDAYS:-$DDAYS}; echo "Keeping network logs for $NDAYS days."; f_checkdays $NDAYS RDAYS=${RDAYS:-$DDAYS}; echo "Keeping clusterware logs for $RDAYS days."; f_checkdays $RDAYS UDAYS=${UDAYS:-$DDAYS}; echo "Keeping user logs for $UDAYS days."; f_checkdays $UDAYS# Check for the oratab file. if [ -f /var/opt/oracle/oratab ]; thenORATAB=/var/opt/oracle/oratab elif [ -f /etc/oratab ]; thenORATAB=/etc/oratab elseecho "ERROR: Could not find oratab file."exit $FAILURE fi# Build list of distinct Oracle Home directories. OH=`egrep -i ":Y|:N" $ORATAB | grep -v "^#" | grep -v "\*" | cut -d":" -f2 | sort | uniq`# Exit if there are not Oracle Home directories. if [ -z "$OH" ]; thenecho "No Oracle Home directories to clean."exit $SUCCESS fi# Get the list of running databases. SIDS=`ps -e -o args | grep pmon | grep -v grep | awk -F_ '{print $3}' | sort`# Gather information for each running database. for ORACLE_SID in `echo $SIDS` do# Set the Oracle environment.ORAENV_ASK=NOexport ORACLE_SID. $ORAENVif [ $? -ne 0 ]; thenecho "Could not set Oracle environment for $ORACLE_SID."elseexport LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORIGLDORAENV_ASK=YESecho "ORACLE_SID: $ORACLE_SID"# Get the audit_dump_dest.ADUMPDEST=`f_getparameter audit_dump_dest`if [ ! -z "$ADUMPDEST" ] && [ -d "$ADUMPDEST" 2>/dev/null ]; thenecho " Audit Dump Dest: $ADUMPDEST"ADUMPDIRS="$ADUMPDIRS $ADUMPDEST"fi# Get the background_dump_dest.BDUMPDEST=`f_getparameter background_dump_dest`echo " Background Dump Dest: $BDUMPDEST"if [ ! -z "$BDUMPDEST" ] && [ -d "$BDUMPDEST" ]; thenBDUMPDIRS="$BDUMPDIRS $BDUMPDEST"fi# Get the core_dump_dest.CDUMPDEST=`f_getparameter core_dump_dest`echo " Core Dump Dest: $CDUMPDEST"if [ ! -z "$CDUMPDEST" ] && [ -d "$CDUMPDEST" ]; thenCDUMPDIRS="$CDUMPDIRS $CDUMPDEST"fi# Get the user_dump_dest.UDUMPDEST=`f_getparameter user_dump_dest`echo " User Dump Dest: $UDUMPDEST"if [ ! -z "$UDUMPDEST" ] && [ -d "$UDUMPDEST" ]; thenUDUMPDIRS="$UDUMPDIRS $UDUMPDEST"fifi done# Do cleanup for each Oracle Home. for ORAHOME in `f_getuniq "$OH"` do# Get the standard audit directory if present.if [ -d $ORAHOME/rdbms/audit ]; thenADUMPDIRS="$ADUMPDIRS $ORAHOME/rdbms/audit"fi# Get the Cluster Ready Services Daemon (crsd) log directory if present.if [ -d $ORAHOME/log/$HOSTNAME/crsd ]; thenCRSLOGDIRS="$CRSLOGDIRS $ORAHOME/log/$HOSTNAME/crsd"fi# Get the Oracle Cluster Registry (OCR) log directory if present.if [ -d $ORAHOME/log/$HOSTNAME/client ]; thenOCRLOGDIRS="$OCRLOGDIRS $ORAHOME/log/$HOSTNAME/client"fi# Get the Cluster Synchronization Services (CSS) log directory if present.if [ -d $ORAHOME/log/$HOSTNAME/cssd ]; thenCSSLOGDIRS="$CSSLOGDIRS $ORAHOME/log/$HOSTNAME/cssd"fi# Get the Event Manager (EVM) log directory if present.if [ -d $ORAHOME/log/$HOSTNAME/evmd ]; thenEVMLOGDIRS="$EVMLOGDIRS $ORAHOME/log/$HOSTNAME/evmd"fi# Get the RACG log directory if present.if [ -d $ORAHOME/log/$HOSTNAME/racg ]; thenRACGLOGDIRS="$RACGLOGDIRS $ORAHOME/log/$HOSTNAME/racg"fidone# Clean the audit_dump_dest directories. if [ ! -z "$ADUMPDIRS" ]; thenfor DIR in `f_getuniq "$ADUMPDIRS"`; doif [ -d $DIR ]; thenecho "Cleaning Audit Dump Directory: $DIR"find $DIR -type f -name "*.aud" -mtime +$ADAYS -exec $RM {} \; 2>/dev/nullfidone fi# Clean the background_dump_dest directories. if [ ! -z "$BDUMPDIRS" ]; thenfor DIR in `f_getuniq "$BDUMPDIRS"`; doif [ -d $DIR ]; thenecho "Cleaning Background Dump Destination Directory: $DIR"# Clean up old trace files.find $DIR -type f -name "*.tr[c,m]" -mtime +$BDAYS -exec $RM {} \; 2>/dev/nullfind $DIR -type d -name "cdmp*" -mtime +$BDAYS -exec $RMDIR {} \; 2>/dev/nullfiif [ -d $DIR ]; then# Cut the alert log and clean old ones.for f in `find $DIR -type f -name "alert\_*.log" ! -name "alert_[0-9A-Z]*.[0-9]*.log" 2>/dev/null`; doecho "Alert Log: $f"f_cutlog $ff_deletelog $f $BDAYSdonefidone fi# Clean the core_dump_dest directories. if [ ! -z "$CDUMPDIRS" ]; thenfor DIR in `f_getuniq "$CDUMPDIRS"`; doif [ -d $DIR ]; thenecho "Cleaning Core Dump Destination: $DIR"find $DIR -type d -name "core*" -mtime +$CDAYS -exec $RMDIR {} \; 2>/dev/nullfidone fi# Clean the user_dump_dest directories. if [ ! -z "$UDUMPDIRS" ]; thenfor DIR in `f_getuniq "$UDUMPDIRS"`; doif [ -d $DIR ]; thenecho "Cleaning User Dump Destination: $DIR"find $DIR -type f -name "*.trc" -mtime +$UDAYS -exec $RM {} \; 2>/dev/nullfidone fi# Cluster Ready Services Daemon (crsd) Log Files for DIR in `f_getuniq "$CRSLOGDIRS $OCRLOGDIRS $CSSLOGDIRS $EVMLOGDIRS $RACGLOGDIRS"`; doif [ -d $DIR ]; thenecho "Cleaning Clusterware Directory: $DIR"find $DIR -type f -name "*.log" -mtime +$RDAYS -exec $RM {} \; 2>/dev/nullfi done# Clean Listener Log Files. # Get the list of running listeners. It is assumed that if the listener is not running, the log file does not need to be cut. ps -e -o args | grep tnslsnr | grep -v grep | while read LSNR; do# Derive the lsnrctl path from the tnslsnr process path.TNSLSNR=`echo $LSNR | awk '{print $1}'`ORACLE_PATH=`dirname $TNSLSNR`ORACLE_HOME=`dirname $ORACLE_PATH`PATH=$ORACLE_PATH:$ORIGPATHLD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORIGLDLSNRCTL=$ORACLE_PATH/lsnrctlecho "Listener Control Command: $LSNRCTL"# Derive the listener name from the running process.LSNRNAME=`echo $LSNR | awk '{print $2}' | tr "[:upper:]" "[:lower:]"`echo "Listener Name: $LSNRNAME"# Get the listener version.LSNRVER=`$LSNRCTL version | grep "LSNRCTL" | grep "Version" | awk '{print $5}' | awk -F. '{print $1}'`echo "Listener Version: $LSNRVER"# Get the TNS_ADMIN variable.echo "Initial TNS_ADMIN: $TNS_ADMIN"unset TNS_ADMINTNS_ADMIN=`$LSNRCTL status $LSNRNAME | grep "Listener Parameter File" | awk '{print $4}'`if [ ! -z $TNS_ADMIN ]; thenexport TNS_ADMIN=`dirname $TNS_ADMIN`elseexport TNS_ADMIN=$ORACLE_HOME/network/adminfiecho "Network Admin Directory: $TNS_ADMIN"# If the listener is 11g, get the diagnostic dest, etc...if [ $LSNRVER -ge 11 ]; then# Get the listener log file directory. LSNRDIAG=`$LSNRCTL<<EOF | grep log_directory | awk '{print $6}' set current_listener $LSNRNAME show log_directory EOF`echo "Listener Diagnostic Directory: $LSNRDIAG"# Get the listener trace file name.LSNRLOG=`lsnrctl<<EOF | grep trc_directory | awk '{print $6"/"$1".log"}' set current_listener $LSNRNAME show trc_directory EOF`echo "Listener Log File: $LSNRLOG"# If 10g or lower, do not use diagnostic dest.else# Get the listener log file location.LSNRLOG=`$LSNRCTL status $LSNRNAME | grep "Listener Log File" | awk '{print $4}'`fi# See if the listener is logging.if [ -z "$LSNRLOG" ]; thenecho "Listener Logging is OFF. Not rotating the listener log."# See if the listener log exists.elif [ ! -r "$LSNRLOG" ]; thenecho "Listener Log Does Not Exist: $LSNRLOG"# See if the listener log has been cut today.elif [ -f $LSNRLOG.$TODAY ]; thenecho "Listener Log Already Cut Today: $LSNRLOG.$TODAY"# Cut the listener log if the previous two conditions were not met.else# Remove old 11g+ listener log XML files.if [ ! -z "$LSNRDIAG" ] && [ -d "$LSNRDIAG" ]; thenecho "Cleaning Listener Diagnostic Dest: $LSNRDIAG"find $LSNRDIAG -type f -name "log\_[0-9]*.xml" -mtime +$NDAYS -exec $RM {} \; 2>/dev/nullfi# Disable logging.$LSNRCTL <<EOF set current_listener $LSNRNAME set log_status off EOF# Cut the listener log file.f_cutlog $LSNRLOG# Enable logging.$LSNRCTL <<EOF set current_listener $LSNRNAME set log_status on EOF# Delete old listener logs.f_deletelog $LSNRLOG $NDAYSfi doneecho "`basename $0` Finished `date`."exit在crontab中設置一個作業,每天晚上凌晨零點運行這個腳本,日志文件保留31天。
00 00 * * * /home/oracle/_cron/cls_oracle/cls_oracle.sh -d 31 > /home/oracle/_cron/cls_oracle/cls_oracle.sh.log 2>&1總結
以上是生活随笔為你收集整理的Oracle-Listener log解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle-Materialized
- 下一篇: Shell脚本攻略01-简介/终端打印