Oracle之備份和清理監聽日誌、告警日誌指令碼

jx_yu發表於2014-12-11
#!/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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章