[Shell] monitor oracle alert.log file and sendmail
自己寫的每隔一分鐘檢測alert.log檔案是否有錯誤,如果有錯誤,則mail出來。
第一次寫,有很多地方沒有考慮到。
以後多加改善
[mon@oracle6 source]$ more mon_alert_log
#!/bin/bash
alertlog=/u01/oracle/diag/rdbms/xxxxxdb/xxxxxdb/trace/alert_xxxxxdb.log #alert file location
datetime=`date +"%Y/%m/%d %H:%M:%S"`
mondate=`date -d "-1min"`
logdir=/tmp
file=`echo ${alertlog##*/}`
daystr=`date +"%d"`
count=1000
grepstr="ora-|alter|not|close|open|shutdown" #錯誤關鍵字
echo $mondate ,,, $file
mondate1=`echo $mondate | awk -F ":" 'BEGIN{OFS=":"}{print $1,$2}'`
mondate1_1=`echo $mondate1 | awk '{print $1,$2}'`
mondate1_2=`echo $mondate1 | awk '{print $4}'`
mondate1=${mondate1_1}" "${daystr}" "${mondate1_2}
echo "mondate1:$mondate1"
mondate2=`date | awk -F ":" 'BEGIN{OFS=":"}{print $1,$2}'`
mondate2_1=`echo $mondate2 | awk '{print $1,$2}'`
mondate2_2=`echo $mondate2 | awk '{print $4}'`
mondate2=${mondate2_1}" "${daystr}" "${mondate2_2}
echo "mondate2:$mondate2"
tail -$count $alertlog > $logdir/"$file"$$
firstrow=`cat $logdir/"$file"$$ | grep -n "" | grep "$mondate1" | head -1 | cut -d ":" -f1`
echo "firstrow:$firstrow"
lastrow=`cat $logdir/"$file"$$ | grep -n "" | grep "$mondate2" | head -1 | cut -d ":" -f1`
echo "lastrow:$lastrow"
if [ -s $firstrow ];then #make sure this time have alert message
echo "$datetime no alert log in $file"
rm -rf $logdir/"$file"$$
exit
fi
if [ -s $lastrow ];then #make sure last is exist
echo "output `expr $count + 1 - $firstrow` to alert.log"
tail -`expr $count + 1 - $firstrow` $logdir/"$file"$$ > $logdir/"$file"$$_tmp
chmod 777 $logdir/"$file"$$_tmp
tmp_rowcount=`expr $count - $firstrow`
else
echo "output1 `expr $lastrow - $firstrow` to alert.log"
tail -`expr $count + 1 - $firstrow` $logdir/"$file"$$ | head -`expr $lastrow - $firstrow` > $logdir/"$file"$$_tmp
chmod 777 $logdir/"$file"$$_tmp
tmp_rowcount=`expr $lastrow - $firstrow`
fi
echo "tmp_rowcount:$tmp_rowcount"
rm -rf $logdir/"$file"$$
cat $logdir/"$file"$$_tmp | grep -n "" | grep "$mondate1" >> $logdir/"$file"$$_tmp1
tmp1_count=`cat $logdir/"$file"$$_tmp1 | wc -l`
for((j=1;j<=$tmp1_count;j++))
do
nextj=`expr $j + 1`
j_start=`cat $logdir/"$file"$$_tmp1 | head -$j | tail -1 | cut -d : -f1`
j_end=`cat $logdir/"$file"$$_tmp1 | head -$nextj | tail -1 | cut -d : -f1`
if [ $j -eq $tmp1_count ];then
j_end=`cat $logdir/"$file"$$_tmp | wc -l`
j_end=`expr $j_end + 1`
fi
j_row=`expr $j_end - $j_start`
headrow=`expr $j_end - 1`
warn_count=`cat $logdir/"$file"$$_tmp | head -$headrow | tail -$j_row | egrep -i "$grepstr" | wc -l`
if [ $warn_count -gt 0 ];then
cat $logdir/"$file"$$_tmp | head -$headrow | tail -$j_row >> /home/mon/log/mon_alert_log.log
cat $logdir/"$file"$$_tmp | head -`expr $j_end - 1` | tail -$j_row | mutt -s "[Oracle6]Oracle Database Alert Log Warning" tolilong@163.com
echo "=============================================================================="
fi
done
rm -rf $logdir/"$file"$$_tmp
rm -rf $logdir/"$file"$$_tmp1
新增crontab定時任務,一分鐘執行一次
[mon@oracle6 source]$ crontab -l
###############mon oracle alert.log###########
* * * * * /home/mon/source/mon_alert_log >> /home/mon/log/mon_alertlog.log
第一次寫,有很多地方沒有考慮到。
以後多加改善
[mon@oracle6 source]$ more mon_alert_log
#!/bin/bash
alertlog=/u01/oracle/diag/rdbms/xxxxxdb/xxxxxdb/trace/alert_xxxxxdb.log #alert file location
datetime=`date +"%Y/%m/%d %H:%M:%S"`
mondate=`date -d "-1min"`
logdir=/tmp
file=`echo ${alertlog##*/}`
daystr=`date +"%d"`
count=1000
grepstr="ora-|alter|not|close|open|shutdown" #錯誤關鍵字
echo $mondate ,,, $file
mondate1=`echo $mondate | awk -F ":" 'BEGIN{OFS=":"}{print $1,$2}'`
mondate1_1=`echo $mondate1 | awk '{print $1,$2}'`
mondate1_2=`echo $mondate1 | awk '{print $4}'`
mondate1=${mondate1_1}" "${daystr}" "${mondate1_2}
echo "mondate1:$mondate1"
mondate2=`date | awk -F ":" 'BEGIN{OFS=":"}{print $1,$2}'`
mondate2_1=`echo $mondate2 | awk '{print $1,$2}'`
mondate2_2=`echo $mondate2 | awk '{print $4}'`
mondate2=${mondate2_1}" "${daystr}" "${mondate2_2}
echo "mondate2:$mondate2"
tail -$count $alertlog > $logdir/"$file"$$
firstrow=`cat $logdir/"$file"$$ | grep -n "" | grep "$mondate1" | head -1 | cut -d ":" -f1`
echo "firstrow:$firstrow"
lastrow=`cat $logdir/"$file"$$ | grep -n "" | grep "$mondate2" | head -1 | cut -d ":" -f1`
echo "lastrow:$lastrow"
if [ -s $firstrow ];then #make sure this time have alert message
echo "$datetime no alert log in $file"
rm -rf $logdir/"$file"$$
exit
fi
if [ -s $lastrow ];then #make sure last is exist
echo "output `expr $count + 1 - $firstrow` to alert.log"
tail -`expr $count + 1 - $firstrow` $logdir/"$file"$$ > $logdir/"$file"$$_tmp
chmod 777 $logdir/"$file"$$_tmp
tmp_rowcount=`expr $count - $firstrow`
else
echo "output1 `expr $lastrow - $firstrow` to alert.log"
tail -`expr $count + 1 - $firstrow` $logdir/"$file"$$ | head -`expr $lastrow - $firstrow` > $logdir/"$file"$$_tmp
chmod 777 $logdir/"$file"$$_tmp
tmp_rowcount=`expr $lastrow - $firstrow`
fi
echo "tmp_rowcount:$tmp_rowcount"
rm -rf $logdir/"$file"$$
cat $logdir/"$file"$$_tmp | grep -n "" | grep "$mondate1" >> $logdir/"$file"$$_tmp1
tmp1_count=`cat $logdir/"$file"$$_tmp1 | wc -l`
for((j=1;j<=$tmp1_count;j++))
do
nextj=`expr $j + 1`
j_start=`cat $logdir/"$file"$$_tmp1 | head -$j | tail -1 | cut -d : -f1`
j_end=`cat $logdir/"$file"$$_tmp1 | head -$nextj | tail -1 | cut -d : -f1`
if [ $j -eq $tmp1_count ];then
j_end=`cat $logdir/"$file"$$_tmp | wc -l`
j_end=`expr $j_end + 1`
fi
j_row=`expr $j_end - $j_start`
headrow=`expr $j_end - 1`
warn_count=`cat $logdir/"$file"$$_tmp | head -$headrow | tail -$j_row | egrep -i "$grepstr" | wc -l`
if [ $warn_count -gt 0 ];then
cat $logdir/"$file"$$_tmp | head -$headrow | tail -$j_row >> /home/mon/log/mon_alert_log.log
cat $logdir/"$file"$$_tmp | head -`expr $j_end - 1` | tail -$j_row | mutt -s "[Oracle6]Oracle Database Alert Log Warning" tolilong@163.com
echo "=============================================================================="
fi
done
rm -rf $logdir/"$file"$$_tmp
rm -rf $logdir/"$file"$$_tmp1
新增crontab定時任務,一分鐘執行一次
[mon@oracle6 source]$ crontab -l
###############mon oracle alert.log###########
* * * * * /home/mon/source/mon_alert_log >> /home/mon/log/mon_alertlog.log
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24237320/viewspace-2074310/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 效能調優工具:SQL MonitorOracleSQL
- Oracle SQL調優系列之SQL Monitor ReportOracleSQL
- 安裝和配置sendmailAI
- Oracle:db file scattered readOracle
- hdfs file system shell的簡單使用
- Oracle ASM Cluster File Systems (ACOracleASM
- Oracle 12C Database File Mapping for Oracle ASM FilesOracleDatabaseAPPASM
- MIT-6.828-JOS-lab5:File system, Spawn and ShellMIT
- MIT6.828 La5 File system, Spawn and ShellMIT
- Oracle 18.3 Resize operation completed for file#Oracle
- 2Gb - File limits in Oracle(轉)MITOracle
- Shell重定向&>file、2>&1、1>&2的區別
- Linux基礎命令---sendmail傳送郵件LinuxAI
- 2788647047_monitor
- [20220128]Check the datapump file header information in Oracle.txtHeaderORMOracle
- oracle ORA-01157: cannot identify/lock data file 64OracleIDE
- 【STACKX】Oracle core file分析利器STACKX 使用指南Oracle
- Oracle RAC+DG 調整redo/standby log fileOracle
- Postman的Monitor功能Postman
- Verilog 監控 Monitor
- oracle 匯入報錯:field in data file exceeds maximum lengthOracle
- Oracle RAC 重置db_recovery_file_dest_size引數Oracle
- 【TUNE_ORACLE】等待事件之日誌等待“log file sync”Oracle事件
- shell指令碼編碼格式問題,bin/sh^M: bad interpreter: No such file or directory指令碼
- Azure Monitor(二)Log Analytics
- 選擇代替Sendmail的郵件伺服器軟體AI伺服器
- 【TUNE_ORACLE】等待事件之日誌等待“log file parallel write”Oracle事件Parallel
- 【ASM】Oracle RAC css啟動報錯"Duplicate voting file found"ASMOracleCSS
- 【TUNE_ORACLE】等待事件之IO等待“db file scattered read”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“db file sequential read”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“db file parallel write”Oracle事件Parallel
- synchronized的monitor監視器synchronized
- Oracle啟動報錯:ORA-03113: end-of-file on communication channelOracle
- oracle12.2 adg ORA-46952: standby database format mismatch for password fileOracleDatabaseORM
- crond不斷喚起sendmail導致資源耗盡的排查AI
- plsql developer工具生成sql monitor reportSQLDeveloper
- Oracle資料庫由dataguard備庫引起的log file sync等待Oracle資料庫
- 使用sql monitor獲取更加詳細的執行計劃 - dbms_sqltune.report_sql_monitorSQL
- file-max設定過小導致oracle資料庫hang住Oracle資料庫