问题描述
清理数据库监听日志的脚本
清理多个监听日志
清理文本和XML格式,自动判断
根据文本格式大小默认1GB
根据XML格式生成日期默认7天前
支持ORACLE用户同时安装DB 和GRID,listener in GRID HOME
机器名带域名
Tip: 在hpux 11.31 环境中shell 中的if -eq 比对数值大小时,如果数值大小超过Integer 类型的上限时使用的是String的ASCII码值比对,容易出现错误判断。
专家解答
#!/bin/sh
# file: lsnr_log_clear.sh
# author: weejar(anbob.com)
# date: 2017/2/7
# desc: automatic to wrap listener log if filesize bigger than xx
# version: 1.1
# note: to add crontab in listener owner
#
# I tested 11g, AIX 6, HPUX IA 11.31, EXADATA LINUX
# update history
# 0.1 2016/1/4 created
# ...
# 0.6 fix bug hpux 11.31 filesize over interger 2147483647 , do not work
# 0.7 fix bug hpux listener two processes, exclude "-inherit" one
# 0.8 fix bug hpux listener shadow processes get listener name wroung
# 0.9 fix bug filesize float type compare issue, to integer
# 1.0 fix LSNRRUNNING
# 1.1 fix not remove listener xml log file in GRID HOME
echo $0
echo `date "+%Y-%m-%d %H:%M:%S"`
echo "To clear listener log file begin..."
WorkDir="/tmp"
listeners="${WorkDir}/listeners"
lsnrcol5="${WorkDir}/lsnrcol5"
# unit Mb
FILESIZELIMIT=1024
# 0 not have xml, 1 have
XMLFLAG=0
# set env
if [[ -f ~/.profile ]]
then
. ~/.profile
fi
if [[ -f ~/.bash_profile ]]
then
. ~/.bash_profile
fi
if [[ ! -d $WorkDir ]]
then
mkdir -p $WorkDir
fi
OSV=`uname -s`
echo "Current OS:${OSV}"
LSNRRUNNING=`ps -ef | grep tnslsnr | grep -v grep`
if [ -n "${LSNRRUNNING}" ]
then
# filter ppid is 1
ps -ef | grep tnslsnr | grep -v grep | awk '$3==1 {print $5}' > ${lsnrcol5}
if [ $? -ne 0 ]
then
echo "ERROR: to create file ${lsnrcol5} faild!"
exit 90
fi
# Get listener names
for i in `cat ${lsnrcol5}`
do
case "${i}" in
"Jan"|"Feb"|"Mar"|"Apr"|"May"|"Jun"|"Jul"|"Aug"|"Sep"|"Oct"|"Nov"|"Dec")
ps -ef | grep tnslsnr | grep -v grep | grep -v -i scan | awk '$3==1 {print $10}' > ${listeners}
;;
*) ps -ef | grep tnslsnr | grep -v grep | grep -v -i scan | awk '{print $9}' > ${listeners}
;;
esac
done
# Check user is listener owner
if [ -s "${listeners}" ]
then
LSNROWNER=`ps -ef | grep tnslsnr | grep -v grep | grep -v -i scan|head -n 1|awk '{print $1}'`
echo "listener owner: ${LSNROWNER}"
USERID=`/usr/bin/id -u -nr`
if [ $? -ne 0 ]
then
echo "ERROR: unable to determine uid"
exit 99
fi
echo "current user: ${USERID}"
if [ "${USERID}" != "${LSNROWNER}" ]
then
echo "ERROR: This script must be run as listener owner: ${LSNROWNER}"
exit 98
fi
fi
if [ -s "${listeners}" ]
then
for i in `cat ${listeners}|grep -v inherit`
do
echo " "
echo "listener name: ${i}"
# if lsnrctl ORACLE HOME NOT CURRENT, i.e. grid and oracle soft all use oracle user
lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|head -n 1|awk '{ print $9 }'`
if [[ "Linux" = "${OSV}" ]]
then
lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|awk '{ print $8 }'`
fi
if [[ "AIX" = "${OSV}" ]]
then
lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|head -n 1|awk '{ print $9 }'`
fi
if [[ "HP-UX" = "${OSV}" ]]
then
lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|awk '$3==1 {print $9 }'|head -n 1 `
fi
echo "Listener Home path: ${lsnrp} $lsnrp"
if [ -n "${lsnrp}" ]
then
ORACLE_HOME=${lsnrp%/bin*}
fi
echo "oracle home: $ORACLE_HOME"
lsnrlog=`${ORACLE_HOME}/bin/lsnrctl status ${i} | grep "Listener Log" | awk '{print $4}'`
if [ ! -f "${lsnrlog}" ]
then
echo "${lsnrlog} does not exist"
exit 1
fi
echo "listener log file: ${lsnrlog}"
FILENAME=${lsnrlog##*/}
echo "listener filename: ${FILENAME}"
FILEEXT=${FILENAME#*.}
echo "listener file ext: ${FILEEXT}"
if [[ "log" = "${FILEEXT}" ]]
then
FILEPATH=`dirname ${lsnrlog}`
echo "listener file path: ${FILEPATH}"
FILESIZE=`ls -l ${lsnrlog}|awk '{ printf "%.0f", $5/1024/1024 }'`
echo "listener file size(MB):${FILESIZE}"
if [ ${FILESIZE} -gt ${FILESIZELIMIT} ];then
echo "listener log is bigger than ${FILESIZELIMIT} MB"
# cut listener log file
${ORACLE_HOME}/bin/lsnrctl <<EOF
set cur listener ${i}
set log_status off
exit
EOF
echo "cd ${FILEPATH}"
cd ${FILEPATH}
echo "mv -f ${FILENAME} ${FILENAME}_old"
mv -f ${FILENAME} ${FILENAME}_old
${ORACLE_HOME}/bin/lsnrctl <<EOF
set cur listener ${i}
set log_status on
exit
EOF
echo "gzip -f ${FILENAME}_old"
gzip -f ${FILENAME}_old
else
echo "listener log is litter than ${FILESIZELIMIT} MB"
fi
fi
if [[ "xml" = "$FILEEXT" ]]
then
LOGTXT="`echo ${i}|tr 'A-Z' 'a-z'`.log"
LOGTXTPATH=`dirname ${lsnrlog} |sed 's/alert$/trace/'`
LOGTXTFILE="$LOGTXTPATH/$LOGTXT"
echo "listener txt log file: ${LOGTXTFILE}"
FILESIZE=`ls -l ${LOGTXTFILE}|awk '{ printf "%.0f", $5/1024/1024 }'`
echo "listener file size(MB):${FILESIZE}"
LOGXMLPATH=`dirname ${lsnrlog}`
echo "listener xml log Home: ${LOGXMLPATH}"
# curt txt file large than $FILESIZELIMIT
if [ ${FILESIZE} -gt ${FILESIZELIMIT} ]
then
echo "listener log is bigger than ${FILESIZELIMIT} MB"
# cut listener log file
echo "mv -f ${LOGTXTFILE} ${LOGTXTFILE}_old "
mv -f ${LOGTXTFILE} ${LOGTXTFILE}_old
echo "cd ${LOGTXTPATH}"
cd ${LOGTXTPATH}
echo "gzip -f ${LOGTXT}_old"
gzip -f ${LOGTXT}_old
else
echo "listener log is litter than ${FILESIZELIMIT} MB"
fi
# curt xml logfile longer than 7 days.
echo "To remove listener file for xml format longer than 7 days..."
cd $LOGXMLPATH
find ./ -name "log*.xml" -mtime +7 -print -exec rm {} \;
#set flag
XMLFLAG=1
fi
done
## if [ ${XMLFLAG} -gt 0 ]
## then
## # remove listener file for xml format longer than 7 days
## HOSTNAME=`hostname`
## shortname=${HOSTNAME%%.*}
## echo "To remove listener file for xml format longer than 7 days..."
## cd $ORACLE_BASE/diag/tnslsnr/${shortname}
## # print deleted
## find ./ -name "log*.xml" -mtime +7 -print -exec rm {} \;
## fi
fi
else
printf "Unable to swap listener log files - Listener down\n"
echo "${HOST} Unable to swap listener log files - Listener down"
fi
echo `date "+%Y-%m-%d %H:%M:%S"`
echo "To clear listener log file complated!"
echo ""
echo ""「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




