Oracle之備份和清理監聽日誌、告警日誌指令碼
#!/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
#############################################################################################################################
# 備份和清理監聽日誌、告警日誌
# 版本: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 跟蹤/告警/監聽日誌的清理指令碼Oracle指令碼
- oracle清理監聽日誌Oracle
- 定時清理監聽日誌的指令碼 。指令碼
- rac scan listener log 清理監聽日誌 oracleOracle
- RMAN備份歸檔日誌指令碼指令碼
- 刪除oracle 11g的警告日誌和監聽日誌Oracle
- Oracle 監聽器日誌解析Oracle
- 清理資料庫監聽日誌最好方法資料庫
- online清理oracle 監聽日誌推薦的做法Oracle
- Zabbix如何監控Oracle的告警日誌Oracle
- Oracle 監聽器日誌解析(續)Oracle
- Oracle之外部表監聽日誌Oracle
- ORACLE停止監聽日誌檔案Oracle
- oracle備份把日誌錯Oracle
- oracle自動備份,儲存每天備份日誌的指令碼編寫Oracle指令碼
- shell指令碼:自動記憶體監控及日誌備份指令碼記憶體
- 備份之歸檔重做日誌備份
- Oracle 監聽器日誌配置與管理Oracle
- 【聽海日誌】之SCN與OracleOracle
- oracle 審計日誌清理Oracle
- Oracle歸檔日誌清理Oracle
- oracle rman備份歸檔日誌需要先切換日誌嗎Oracle
- listener_scan1.log、listener.log監聽日誌清理
- 關閉監聽的日誌。
- Oracle 11g 檢視監聽日誌Oracle
- Oracle監聽日誌2g-監聽啟動報錯Oracle
- 【聽海日誌】之Oracle SQL*LOADEROracleSQL
- 【聽海日誌】之ORACLE恢復案例Oracle
- 日誌傳送事務日誌備份設定
- 備份歸檔日誌
- sqlserver的日誌備份SQLServer
- PHP慢指令碼日誌和Mysql的慢查詢日誌PHP指令碼MySql
- mysql清理日誌MySql
- 清理日誌 scripts
- 如何清理日誌
- Oracle告警日誌ora-04030Oracle
- oracle12告警日誌檔案?Oracle
- 使用外部表管理Oracle 告警日誌Oracle