小编给大家分享一下Oracle性能问题排查自动化脚本怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
进入 Oracle Performance troubleshooting automation scripts: Perfbot Maria
功能:定期执行该脚本,对SQL执行超过n分钟的SQL语句的等待事件以及相关的执行计划和SQL monitor的信息以邮件的形式发给运维者。
主要脚本: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 参数控制着多少分钟以上的SQL会被写入邮件。
细心的朋友会发现,脚本中加入了GRACE机制,即上一次告警过的SQL不会接连告警,可能会隔次告警,减少无谓的告警骚扰。
调用的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
-
/
这里貌似不支持附件,注意点如下:
注意该脚本必须放在/home/oracle/dba/pb_maria路径使用;在该路径下创建results和reports路径来存放历史的信息。
cronjob我设置的是5分钟一次。
这个脚本需要Oracle数据库服务器能连上互联网,才能发邮件。如果是私网的机器,则可以考虑加一台私网公网都在的mail服务器,将需要发的邮件的信息传送到这台mail服务器上,然后定时发出邮件。
以上是“Oracle性能问题排查自动化脚本怎么写”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/204904.html