#!/bin/ksh
#############################################################################################################################
# 备份和清理监听日志、告警日志
# 版本:1.0
# 日期: 2014/03/31
# 说明:
# 1.此脚本工具能自动备份alert和listener日志文件,
# 同时
清理alert和listener日志文件udump、bdump下20天之前并且没有进程再用的trc\trm文件
# 2.oracle 10g和oracle 11g版本测试通过
# 3.linux :bash shell 测试通过
# 4.脚本逻辑:
# a.ps查看smon存在的sid来获取,通过sid和sid对应实例的拥有者owner,切换到owner(各自都配置了profile),连接oracle
# 查看background_dump_dest、user_dump_dest、startup_time等参数的值,从而得到相应的位置
# b.lsnrctl status|grep log|awk '{print $4}'|sed 's!/alert/log.xml!/trace/*log!得到listenert.log的位置
# c.find background_dump_dest\user_dump_dest位置下20天之前(-mtime 20)的trc、trm文件,
# 依次对20天之前的文件fuser来判断是否有进程暂用 #
# d.备份清理log:cp old_file new_file && cat /dev/null > old_file
#############################################################################################################################
##################################
# 获取监听log位置
#############################
#如果sunos则使用nawk
case $(uname) in
SunOS) alias awk=nawk
;;
esac
#1.root用户下,ORACLE_HOME/bin/lsnrctl
#location_listener_root()
#{
# ls `$ORACLE_HOME/bin/lsnrctl status|grep log|awk '{print $4}'|sed 's!/alert/log.xml!/trace/listener.log!'`>>/tmp/listener.tmp
#}
#2.无法得到oracle_home,得到oracle_user和oralce_sid
#location_listener_ouser()
#{
# ls `su - $ouser -c "lsnrctl status"|grep log|awk '{print $4}'|sed 's!/alert/log.xml!/trace/listener.log!'`>>/tmp/listener.tmp
#}
##################################
#获取alert_sid.log、udump、bdump位置,instance启动时间
###########################
location_alert_log()
{
su - $ouser -c "ORACLE_SID=$osid;export ORACLE_SID;sqlplus / as sysdba" << EOF >/tmp/$ORACLE_SID\_bdump.tmp
set line 170
col aa for a170
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select 'startup_time@'||startup_time st from v\$instance;
SELECT 'alert_log:'||VALUE aa FROM v\$parameter WHERE NAME='background_dump_dest';
#select 'cnt_day@'||trunc(sysdate+1-startup_time) st from v\$instance;
SELECT 'udump:'||VALUE aa FROM v\$parameter WHERE NAME='user_dump_dest';
EOF
#bdump的位置
bdump_dest=$(grep -i alert_log /tmp/$ORACLE_SID\_bdump.tmp|awk -F [:] '{print $2}')
#udump的位置
udump_dest=$(grep -i udump /tmp/$ORACLE_SID\_bdump.tmp|awk -F [:] '{print $2}')
#instance startup_time
startup_time=$(grep -i startup_time /tmp/$ORACLE_SID\_bdump.tmp|awk -F [@] '{print $2}')
#实例已经启动的天数
#dis_day=$(grep -i cnt_day /tmp/$ORACLE_SID\_bdump.tmp|awk -F [@] '{print $2}')
echo "Instance $ORACLE_SID startup_time : "$startup_time
echo "Instance $ORACLE_SID udump_dest : "$(ls -d $udump_dest)
echo "Instance $ORACLE_SID bdump_dest : "$(ls -d $bdump_dest)
echo "Instance $ORACLE_SID Alert Log : "$(ls $bdump_dest/alert_$ORACLE_SID.log)
#清理alertlog
cd $bdump_dest
#echo `pwd`
#删除bak的log
rm -f alert_$ORACLE_SID.log.bak
#拷贝new 为 bak的
cp alert_$ORACLE_SID.log alert_$ORACLE_SID.log.bak
#情况alert.log
cat /dev/null > alert_$ORACLE_SID.log
chown $ouser alert_$ORACLE_SID.log.bak
#调用bdump_startup_time函数,显示满足条件的trc trm文件
echo "bg_dumpfile_list :"
bdump_before_20day
#如budmp和udump的位置不一致,则接下来显示满足条件的udump下的文件
if [ $udump_dest"aaa" != $bdump_dest"aaa" ];then
echo "user_dumpfile_list :"
udump_before_20day
fi
#删除临时文件
rm -f /tmp/$ORACLE_SID\_bdump.tmp
}
###############################################
#获取20天之前并且没有被进程暂用的bdump、udump文件
#########################################
bdump_before_20day()
{
#判断bdump目录是否存在
if [ ! -d "$bdump_dest" ]; then
echo "$bdump_dest don't exist!!!"
else
#若bdump目录下的trc trm有20天之前的文件,则列出
if [ `find $bdump_dest -type f -name "*.tr[cm]" -mtime +20|wc -l` -gt 2 ];then
file_list=$(find $bdump_dest -type f -name "*.tr[cm]" -mtime +20|xargs ls -l|awk '{print $6"-"$7"-"$8"-"$9}'|sort)
else
unset file_list
echo "!!!Not Found Before 20 day"
fi
fi
for list in $file_list
do
file=$(echo $list|awk -F [-] '{print $NF}')
num=$(echo $(fuser $file)|awk '{print $1}')
num=$(($num+0))
if [ $num -gt 0 ];then
echo $list "is used"
else
#删除满足条件的trc、trm文件
cd $bdump_dest
rm -f $(basename $list)
echo $list "is deleted"
fi
done
}
udump_before_20day()
{
#判断udump目录是否存在
if [ ! -d "$udump_dest" ]; then
echo "$udump_dest don't exist!!!"
else
#若udump目录下的trc trm有20天之前的文件,则列出
if [ `find $udump_dest -type f -name "*.tr[cm]" -mtime +20|wc -l` -gt 2 ];then
file_list=$(find $udump_dest -type f -name "*.tr[cm]" -mtime +20|xargs ls -l|awk '{print $6"-"$7"-"$8"-"$9}'|sort)
else
unset file_list
echo "!!!Not Found Before 20 day"
fi
fi
for list in $file_list
do
file=$(echo $list|awk -F [-] '{print $NF}')
num=$(echo $(fuser $file)|awk '{print $1}')
num=$(($num+0))
if [ $num -gt 0 ];then
echo $list "is used"
else
cd $udump_dest
rm -f $(basename $list)
echo $list "is deleted"
fi
done
}
###########################
#执行备份和清理操作
############################
echo "##########################################"
echo "# `date` #"
echo "# Oracle Database(s) Status `hostname` : #"
echo "##########################################"
for j in `ps -ef|grep smon_|grep -v grep|awk '{print $1"_"$NF}'|awk -F [\_] '{print $1":"$4}'`
do
#截取owner
ouser=`echo $j|awk -F [\:] {'print $1'}`
#截取sid
osid=`echo $j|awk -F [\:] {'print $2'}`
export ORACLE_SID=$osid
#location_listener_ouser
#echo
#echo
location_alert_log
done
######################################
#去重监听log文件:防止重复操作
##############################
#echo "#########################################"
#echo "# Listener Log(s) #"
#echo "#########################################"
#echo "*************************************"
#for lsnr in `cat /tmp/listener.tmp |sort|uniq`
#do
# ouser=$(ls -l $lsnr|awk '{print $3}')
# echo $lsnr
# cd $(dirname $lsnr)
# #echo $(basename $lsnr)
# #echo `pwd`
# rm -f listener.log.bak
# cp $(basename $lsnr) listener.log.bak
# cat /dev/null > $(basename $lsnr)
# chown $ouser listener.log.bak
# echo "*************************************"
#done
#rm -f /tmp/listener.tmp
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27000195/viewspace-1364818/,如需转载,请注明出处,否则将追究法律责任。