您好,登錄后才能下訂單哦!
小編給大家分享一下Oracle性能問(wèn)題排查自動(dòng)化腳本怎么寫(xiě),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
進(jìn)入 Oracle Performance troubleshooting automation scripts: Perfbot Maria
功能:定期執(zhí)行該腳本,對(duì)SQL執(zhí)行超過(guò)n分鐘的SQL語(yǔ)句的等待事件以及相關(guān)的執(zhí)行計(jì)劃和SQL monitor的信息以郵件的形式發(fā)給運(yùn)維者。
主要腳本:pbm_wait.sh
#!/bin/bash
export ORACLE_SID=$1
export SQL='sqlplus / as sysdba'
export EXEC_MIN=5
export ORACLE_HOME=/opt/app/oracle/product/11GR2
export PATH=$PATH:$ORACLE_HOME/bin
export DIR=/home/oracle/dba/pb_maria
#export MY_DATE=`date '+%d%b%y_%k%M'`
export LOG=${DIR}/pbm_${ORACLE_SID}_wait.log
export RESULT=pbm_${ORACLE_SID}_wait.result
export TEMP_RESULT=pbm_${ORACLE_SID}_wait_temp.result
export FINAL_RESULT=pbm_wait_${ORACLE_SID}_final.result
export GRACE=pbm_${ORACLE_SID}_grace.log
export COUNT=1
export MAIL='mailx -s "Perfbot maria report of DB $ORACLE_SID"'
cd $DIR
$SQL > /dev/null << EOF
spool ${LOG}
@wait.sql
spool off
EOF
sed -i '1d;2d;$d' $LOG
awk '{if($3>ENVIRON["EXEC_MIN"]) {print $0} }' $LOG > $RESULT
for i in `awk '{print $2}' $RESULT`
do
array[$COUNT]=$i;
COUNT=$(($COUNT+1));
done
if [ $COUNT -ne 1 ]
then
for ((i=1; i<${COUNT}; i++))
do
grep -q ${array[$i]} $GRACE;
if [ $? -eq 1 ]; then
echo ${array[$i]} >> $TEMP_RESULT
fi
done
fi
if [[ -e $TEMP_RESULT ]]; then
sort -u $TEMP_RESULT > $FINAL_RESULT
COUNT=1
for i in `awk '{print $1}' $FINAL_RESULT`
do
array[$COUNT]=$i
COUNT=$(($COUNT+1));
done
for ((i=1; i<${COUNT}; i++))
do
$SQL > /dev/null << EOF
spool ${DIR}/${ORACLE_SID}_${array[$i]}_sql.rpt
@sm.sql ${array[$i]}
spool off
EOF
sed -i '1d;$d' ${DIR}/${ORACLE_SID}_${array[i]}_sql.rpt
done
for ((i=1; i<${COUNT}; i++))
do
export MAIL=$MAIL" -a "${DIR}/${ORACLE_SID}_${array[$i]}"_sql.rpt"
done
export MAIL=$MAIL" 234924619@qq.com < "${DIR}/$RESULT" "
eval $MAIL
mv *.rpt reports/
fi
awk '{print $2}' $RESULT > $GRACE
mv *.result results/
腳本使用方法: /home/oracle/dba/pb_maria/pbm_wait.sh
其中 EXEC_MIN 參數(shù)控制著多少分鐘以上的SQL會(huì)被寫(xiě)入郵件。
細(xì)心的朋友會(huì)發(fā)現(xiàn),腳本中加入了GRACE機(jī)制,即上一次告警過(guò)的SQL不會(huì)接連告警,可能會(huì)隔次告警,減少無(wú)謂的告警騷擾。
調(diào)用的sql 腳本也附上:
wait.sql
set line 220 pages 50000
set heading off
set feedback off
col username for a10
col event for a35
col program for a35
COLUMN elapsed_min FORMAT 999999999.99
select username,sql_id, ROUND(( sysdate - SQL_EXEC_START)*1440 , 2) elapsed_min
,program,event
FROM V$SESSION
WHERE USERNAME IS NOT NULL
AND WAIT_CLASS NOT LIKE 'Idle'
AND SQL_ID IS NOT NULL
AND ROUND(( sysdate - SQL_EXEC_START)*1440 , 2) IS NOT NULL
order by elapsed_min desc;
sm.sql
set pagesize 50000
set long 20000
select dbms_sqltune.report_sql_monitor(SQL_ID=>'&&1',TYPE=>'text') from dual
/
這里貌似不支持附件,注意點(diǎn)如下:
注意該腳本必須放在/home/oracle/dba/pb_maria路徑使用;在該路徑下創(chuàng)建results和reports路徑來(lái)存放歷史的信息。
cronjob我設(shè)置的是5分鐘一次。
這個(gè)腳本需要Oracle數(shù)據(jù)庫(kù)服務(wù)器能連上互聯(lián)網(wǎng),才能發(fā)郵件。如果是私網(wǎng)的機(jī)器,則可以考慮加一臺(tái)私網(wǎng)公網(wǎng)都在的mail服務(wù)器,將需要發(fā)的郵件的信息傳送到這臺(tái)mail服務(wù)器上,然后定時(shí)發(fā)出郵件。
以上是“Oracle性能問(wèn)題排查自動(dòng)化腳本怎么寫(xiě)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。