共计 2492 个字符,预计需要花费 7 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 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 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 $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 性能问题排查自动化脚本怎么写”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!