• 数据库性能监控脚本


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

  • 相关阅读:
    恢复安装数据库的SCOTT用户的数据:
    SQL Server DATEDIFF() 函数
    MS SQL 日期格式转换
    cxGrid增加一栏显示checkBox的设置方法
    介绍JSP程序动态网站环境搭建的详细步骤
    SQL Server CONVERT() 函数
    最新JSP环境配置方法
    JSP语法(Jsp技术大全)1
    SQL字符串处理函数大全
    JSP数据库连接
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/15908272.html
Copyright © 2020-2023  润新知