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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Zabbix如何監控Oracle的告警日誌Oracle
- Oracle歸檔日誌清理Oracle
- Oracle告警日誌ora-04030Oracle
- oracle rman備份歸檔日誌需要先切換日誌嗎Oracle
- Oracle 自動化運維-Python監控Oracle告警日誌Oracle運維Python
- listener_scan1.log、listener.log監聽日誌清理
- MySQL日誌管理,備份和恢復MySql
- 【ELK】elastalert 日誌告警AST
- oracle 資料庫lsnrctl監聽的日誌路徑和trace檔案Oracle資料庫
- 日誌服務之告警接入與管理
- 基於Linux指令碼,對日誌進行定時壓縮備份Linux指令碼
- Oracle使用備份檔案集恢復歸檔日誌Oracle
- 在 Linux 上用 Bash 指令碼監控 messages 日誌Linux指令碼
- 監聽MySQL的binlog日誌工具分析:CanalMySql
- docker 容器日誌清理方案Docker
- oracle alert日誌Oracle
- ELK日誌告警elastalert2AST
- MySQL 日誌管理、備份與恢復MySql
- RMAN備份整庫和歸檔日誌的方法
- 跟我一起學docker(15)--監控日誌和日誌管理Docker
- 透過shell指令碼監控日誌切換頻率指令碼
- Oracle設定多個歸檔路徑生成多份歸檔日誌,Rman備份時也只備份其中的一份歸檔日誌Oracle
- 手工rm刪除歸檔日誌對備份歸檔日誌的影響
- 日誌檔案過大清理
- Docker 日誌自動輪轉和清理配置Docker
- 使用zabbix監控oracle的後臺日誌Oracle
- oracle刪除日誌Oracle
- oracle歸檔日誌Oracle
- Linux伺服器日誌備份到本地Linux伺服器
- 指令碼處理iOS的Crash日誌指令碼iOS
- 指令碼日誌的標準輸出指令碼
- 【REDO】Oracle 日誌挖掘,分析歸檔日誌線上日誌主要步驟Oracle
- 黑盒監控、日誌監控
- 【LOG】Oracle資料庫清理日誌、跟蹤檔案利器Oracle資料庫
- zookeeper 清理snapshot及事務日誌
- Mysql事件監控日誌MySql事件
- mysqldump全量備份+mysqlbinlog二進位制日誌增量備份MySql
- 歸檔oracle alert日誌Oracle
- linux中用shell指令碼對tomcat和nginx做日誌切割Linux指令碼TomcatNginx