Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192728
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 542
  • 用 户 组: 普通用户
  • 注册时间: 2017-07-25 14:45
文章分类
文章存档

2018年(64)

2017年(20)

我的朋友

分类: 高性能计算

2018-01-19 15:23:54

最近对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服务器上,然后定时发出邮件。

阅读原文


阅读(1736) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~