• Oracle 性能问题排查自动化脚本


    Oracle 性能问题排查自动化脚本

    简介:

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

  • 相关阅读:
    “2O9”学习小组第十三周学习总结
    2020—2021—1学期20202408董怡文《网络空间安全导论》第十三周学习总结
    2020—2021—1学期20202408董怡文《网络空间安全导论》第十二周学习总结
    “2O9”学习小组第十一周学习总结
    2020—2021—1学期20202408董怡文《网络空间安全导论》第十一周学习总结
    “2O9”学习小组第十周学习总结(网空导论第3章)
    2020—2021—1学期20202408董怡文《网络空间安全导论》第十周学习总结
    2020—2021—1学期20202408董怡文《网络空间安全导论》第九周学习总结
    2020—2021—1学期 20202408《网络空间安全导论》第八周学习总结
    “2O9”学习小组第八周学习总结(网空导论1,2,6,9章,7章(1))
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/15591164.html
Copyright © 2020-2023  润新知