美文网首页
ORACLE GOLDENGATE 监控脚本

ORACLE GOLDENGATE 监控脚本

作者: Hardy小叶 | 来源:发表于2020-02-24 00:58 被阅读0次

    ORACLE GOLDENGATE MONITOR

    1. 背景

    很多需要使用Oracle Godengate来进行容灾,虽然Oracle官方有自己的OGG监控产品和数据对比产品,如GoldenGate Veridata、GoldenGate Director,但是由于其是需要单独收费的,且安装操作使用复杂,于是开发了适应客户需求的监控脚本。

    2.环境信息

    Oracle Goldengate 环境:

    源端 DB01_SOURCE 192.168.1.50

    目标端 DB01_TARGET 192.168.1.51

    OGG版本: ogg11g

    数据库版本:Oracle 11.2.0.4

    监控服务器

    DB0Monitor 192.168.1.16

    数据库版本:Oracle 11.2.0.4

    存放监控信息表:ggate.gg_check_his

    3.监控脚本编写配置

    3.1 GoldenGate日常监控的总调度脚本

    #!/usr/bin/ksh
    
    ########
    
    ##说明
    
    ## 本脚本由crontab自动调度,为GoldenGate日常监控的总调度脚本
    
    ## 本脚本作用在于设计各种环境变量、调度采集信息的巡检脚本、将巡检脚本结果录入历史表
    
    ########
    
    ########
    
    ##获取本脚本执行的时间
    
    ##此时间用于判定所执行的子脚本以及定义临时文件名
    
    ########
    
    export EXE_DATE_D=`date +%Y%m%d`
    
    export EXE_DATE_H=`date +%H`
    
    export EXE_DATE_M=`date +%M`
    
    ########
    
    ##监控对象标识
    
    ##现有的监控对象有DB01_SOURCE、DB01_TARGET
    
    ########
    
    ##DB01_SOURCE DB01_TARGET
    
    export V_iden_str="DB01_SOURCE"
    
    ########
    
    ##本监控脚本根目录
    
    ########
    
    export MON_HOME=/ggs/ogg11/gg_mon
    
    ########
    
    ##GoldenGate安装目录
    
    ########
    
    export GGS_HOME=/ggs/ogg11
    
    ########
    
    ##JAVA_AGENT路径
    
    ########
    
    export V_JAGENT_PATH="/gg/veragent/agent/JavaAgent.jar"
    
    ########
    
    ##待检查的文件系统路径
    
    ########
    
    export V_DF_PATH="/oracle/arch"
    
    ########
    
    ##数据库登陆信息
    
    ## TNS_ADMIN TNS_NAME R_USERNAME R_PASSWORD 指向存储巡检历史信息的数据库
    
    ## ORACLE_SID L_USERNAME L_PASSWORD 执向本地数据库
    
    ## 本地同步用户列表USERLIST
    
    ## 指向生产库的DBLINK DBL
    
    ########
    
    export ORACLE_BASE=/oracle/app/oracle
    
    export ORACLE_HOME=$ORACLE_BASE/product/11.2.0
    
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$GGS_HOME:/lib:/usr/lib
    
    export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
    
    export TNS_ADMIN=$MON_HOME
    
    export TNS_NAME="ggmon"
    
    export R_USERNAME="ggate"
    
    export R_PASSWORD="ggate"
    
    export ORACLE_SID=db01
    
    export L_USERNAME="ggate"
    
    export L_PASSWORD="ggate"
    
    ##export DBL=""
    
    ##export USERLIST=""
    
    ########
    
    ##存放长事务参数
    
    ########
    
    #抽取进程名字
    
    export V_EXTRACT_NAME="EITPUB01"
    
    #时间
    
    export V_DURATION="55m"
    
    ########
    
    ##存放采集信息的表
    
    ########
    
    export V_HIS_TABLE="ggate.gg_check_his"
    
    ########
    
    ##临时文件
    
    ## DATA_FILE存储采集回来的结果存放成txt格式
    
    ## SQL_FILE存放通过将DATA_FILE转换成的sql语句
    
    ########
    
    export DATA_FILE=$MON_HOME"/coll_data_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"
    
    export SQL_FILE=$MON_HOME"/insert_data_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".sql"
    
    cat /dev/null>$DATA_FILE
    
    cat /dev/null>$SQL_FILE
    
    ########
    
    ##定义各个列值
    
    ########
    
    export V_coll_type="NOT DEFINE"
    
    export V_coll_name="NOT DEFINE"
    
    export V_coll_value="NOT COLLECT"
    
    export V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##采集MGR进程信息脚本
    
    ########
    
    sh $MON_HOME/check_mgr.sh > $MON_HOME/check_mgr.sh.out 2>&1
    
    ########
    
    ##采集ER进程信息脚本
    
    ## ER即EXTRACT和REPLICATE进程
    
    ## 采集信息包括ER进程运行状态以及时间延迟
    
    ########
    
    sh $MON_HOME/check_er.sh > $MON_HOME/check_er.sh.out 2>&1
    
    ########
    
    ##采集JavaAgent进程数脚本
    
    ## 采集的是巡检的数据库对应JavaAgent进程数
    
    ########
    
    sh $MON_HOME/check_jagent.sh > $MON_HOME/check_jagent.sh.out 2>&1
    
    ########
    
    ##采集DISCARD文件ORA-报错脚本
    
    ##注意check_discard.sh脚本 discard文件存放的路径不一样需要根据实际环境修改
    
    ## 采集的是巡检的数据库对应JavaAgent进程数
    
    ########
    
    sh $MON_HOME/check_discard.sh > $MON_HOME/check_discard.sh.out 2>&1
    
    ########
    
    ##采集文件系统目录使用率
    
    ## 采集的是文件系统使用率
    
    ########
    
    sh $MON_HOME/check_df.sh > $MON_HOME/check_df.sh.out 2>&1
    
    ########
    
    ##采集表空间使用率
    
    ## 采集的是数据库表空间使用率
    
    ########
    
    sh $MON_HOME/check_tbs.sh > $MON_HOME/check_tbs.sh.out 2>&1
    
    ########
    
    ##采集长事务
    
    ########
    
    sh $MON_HOME/get_trans.sh > $MON_HOME/get_trans.sh.out 2>&1
    
    ##将采集的结果格式转换为SQL语句
    
    ########
    
    echo "alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';">>$SQL_FILE
    
    echo "select sysdate from dual;">>$SQL_FILE
    
    cat $DATA_FILE|awk -v table="$V_HIS_TABLE" '{print "insert into "table" values('\''"$1"'\'','\''"$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'');"}'>>$SQL_FILE
    
    echo "commit;">>$SQL_FILE
    
    echo "exit;">>$SQL_FILE
    
    ########
    
    ##将采集的结果录入数据库
    
    ########
    
    ${ORACLE_HOME}/bin/sqlplus -S ${R_USERNAME}/${R_PASSWORD}@${TNS_NAME} @${SQL_FILE}
    
    ########
    
    ##清理临时文件
    
    ########
    
    rm $DATA_FILE
    
    rm $SQL_FILE
    
    

    3.2 采集MGR进程信息

    
    #!/usr/bin/ksh
    
    ########
    
    ##说明
    
    ## 本脚本由collect_gg_info.sh脚本调度,属于GoldenGate日常监控脚本
    
    ## 本脚本作用在于通过GoldenGate命令确认MGR进程运行状态
    
    ########
    
    ########
    
    ##定义GoldenGate检查命令
    
    ########
    
    cd $GGS_HOME
    
    echo "info mgr">INFO_MGR
    
    ########
    
    ########
    
    ##设置各个值
    
    ########
    
    V_coll_type="MGR"
    
    V_coll_name="MGR"
    
    V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##采集MGR进程状态
    
    ########
    
    cd $GGS_HOME
    
    V_coll_value=`./ggsci<INFO_MGR|grep "Manager is"|awk '{print $3}'|tr "[a-z]" "[A-Z]"`
    
    ########
    
    ##输出采集结果到DATA_FILE文件
    
    ########
    
    echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date>>$DATA_FILE
    
    

    3.3 采集ER进程信息

    
    #!/usr/bin/ksh
    
    ########
    
    ##说明
    
    ## 本脚本由collect_gg_info.sh脚本调度,属于GoldenGate日常监控脚本
    
    ## 本脚本作用在于通过GoldenGate命令确认ER进程运行状态以及时间延迟信息
    
    ## ER进程即EXTRACT和REPLICATE进程
    
    ########
    
    ########
    
    ##GoldenGate检查命令
    
    ########
    
    cd $GGS_HOME
    
    echo "info all">INFO_ALL
    
    ########
    
    ##临时文件
    
    ## INFOER_FILE存放通过INFO ALL命令所获取
    
    ########
    
    export INFOER_FILE=$MON_HOME"/info_er_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"
    
    cat /dev/null>$INFOER_FILE
    
    ########
    
    ##设置各个值
    
    ########
    
    V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##通过info all命令获取进程状态
    
    ########
    
    cd $GGS_HOME
    
    ./ggsci<INFO_ALL|grep -E "EXTRACT|REPLICAT">$INFOER_FILE
    
    ########
    
    ####输出采集结果到DATA_FILE文件
    
    #### 脚本上半部分处理ER进程状态、下半部分处理ER进程LAG信息
    
    ########
    
    while read LINE
    
    do
    
     ##ER STATUS
    
     V_coll_type="ER"
    
     V_coll_name=`echo $LINE|awk '{print $3}'`
    
     V_coll_value=`echo $LINE|awk '{print $2}'`
    
     echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date>>$DATA_FILE
    
     ##ER LAG
    
     V_coll_type="LAG"
    
     V_coll_name=`echo $LINE|awk '{print $3}'`
    
     V_coll_value=`echo $LINE|awk '{{split ($4,A,":")}{split ($5,B,":")}{print "(("A[1]"+"B[1]")*60+"A[2]"+"B[2]")*60+"A[3]"+"B[3]}}'|bc`
    
     echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date>>$DATA_FILE
    
    done<$INFOER_FILE
    
    ########
    
    ##清理临时文件
    
    ########
    
    rm $INFOER_FILE
    
    

    3.4采集JavaAgent进程信息

    
    #!/usr/bin/ksh
    
    ########
    
    ##说明
    
    ## 本脚本由collect_gg_info.sh脚本调度,属于GoldenGate日常监控脚本
    
    ## 本脚本作用在于通过GoldenGate命令确认GoldenGate Veridata Java Agent进程数
    
    ########
    
    ########
    
    ##设置各个值
    
    ########
    
    V_coll_type="JAGENT"
    
    V_coll_name="PROCESS_NUM"
    
    V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##采集JAVA AGENT进程状态
    
    ########
    
    cd $GGS_HOME
    
    V_coll_value=`ps -ef|grep $V_JAGENT_PATH|grep -v grep|wc -l`
    
    ########
    
    ##输出采集结果到DATA_FILE文件
    
    ########
    
    echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date>>$DATA_FILE
    
    

    3.5采集DISCARD文件ORA-信息

    
    #!/usr/bin/ksh
    
    ########
    
    ##说明
    
    ## 本脚本由collect_gg_info.sh脚本调度,属于GoldenGate日常监控脚本
    
    ## 本脚本作用在于通过检查GoldenGate Discard日志,统计ORA-报错个数
    
    ########
    
    ########
    
    ##GoldenGate检查命令
    
    ########
    
    cd $GGS_HOME
    
    echo "info all">INFO_ALL
    
    ########
    
    ##临时文件
    
    ## ERNAME_FILE存放当前数据库中GoldenGate同步进程命名
    
    ########
    
    export ERNAME_FILE=$MON_HOME"/er_name_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"
    
    cat /dev/null>$ERNAME_FILE
    
    ########
    
    ##设置各个值
    
    ########
    
    V_coll_type="DISCARD"
    
    V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##通过info all命令获取进程名
    
    ########
    
    cd $GGS_HOME
    
    ./ggsci<INFO_ALL|grep -E "EXTRACT|REPLICAT"|awk '{print $3}'>$ERNAME_FILE
    
    ########
    
    ##逐一分析各个进程的discard文件,并输出采集结果到DATA_FILE文件
    
    ########
    
    cd $GGS_HOME/dirrpt
    
    for V_coll_name in `cat $ERNAME_FILE`
    
    do
    
     #V_coll_value=`cat $(echo ${V_coll_name}.DSC | tr '[A-Z]' '[a-z]')|grep ORA-|wc -l`
    
     #自己实验使用下面这条
    
     V_coll_value=`cat $(echo ${V_coll_name}/${V_coll_name}.DSC | tr '[A-Z]' '[a-z]')|grep ORA-|wc -l`
    
     echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date >>$DATA_FILE
    
    done
    
    ########
    
    ##清理临时文件
    
    ########
    
    rm $ERNAME_FILE
    
    

    3.6 采集文件系统目录使用率

    
    #!/usr/bin/ksh
    
    ########
    
    ##说明
    
    ## 本脚本由collect_gg_info.sh脚本调度,属于GoldenGate日常监控脚本
    
    ## 本脚本作用主要负责GoldenGate文件系统
    
    ########
    
    ##设置各个值
    
    ########
    
    V_coll_type="DF"
    
    V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##临时文件
    
    ## DF_FILE存放当前数据库中GoldenGate同步进程命名
    
    ########
    
    export DF_FILE=$MON_HOME"/df_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"
    
    cat /dev/null>$DF_FILE
    
    ########
    
    ##通过df命令获取文件系统使用率
    
    ##sed -n '2,$p' 打印第2行到最后一行
    
    ########
    
    df -k $V_DF_PATH |sed -n '2,$p'> $DF_FILE
    
     while read i
    
    do
    
     V_coll_name=`echo $i|awk '{print $6}'`
    
     V_coll_value=`echo $i|awk '{print $5}'`
    
     echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date >> $DATA_FILE
    
    done < $DF_FILE
    
    #####删除临时文件
    
    rm -rf $DF_FILE
    
    

    3.7 采集表空间使用率

    
    #!/usr/bin/ksh
    
    ########
    
    ##说明
    
    ## 本脚本由collect_gg_info.sh脚本调度,属于GoldenGate日常监控脚本
    
    ## 本脚本作用主要监控表空间使用率
    
    ########
    
    ##设置各个值
    
    ########
    
    V_coll_type="TABLESPACE"
    
    V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##临时文件
    
    ## TBS_FILE存放当前数据库中GoldenGate同步进程命名
    
    ########
    
    export TBS_FILE=$MON_HOME"/tbs_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"
    
    export TBS_FILE2=$MON_HOME"/tbs2_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"
    
    cat /dev/null>$TBS_FILE
    
    ########
    
    ##通过SQL命令获取表空间使用率
    
    ########
    
    ${ORACLE_HOME}/bin/sqlplus -s -l / as sysdba << EOF  > $TBS_FILE
    
    set lin 200 pagesize 1000
    
    set heading off
    
    col use_precent for 999.99
    
    select 'TBS_TO_GREP' grep,b.tablespace_name,round(sum(b.bytes)/1024/1024,0) sum_MB, round(sum(nvl(a.bytes,0))/1024/1024,0) free_MB,
    
     to_char(round((sum(b.bytes)-sum(nvl(a.bytes,0)))/sum(b.bytes),4)*100,'990.00') use_precent
    
    from (select tablespace_name,file_id,sum(bytes) bytes from dba_free_space group by tablespace_name,file_id ) a,
    
     dba_data_files b
    
    where a.file_id(+)=b.file_id and a.tablespace_name(+)=b.tablespace_name
    
    group by b.tablespace_name
    
    order by 4;
    
    EOF
    
    cat $TBS_FILE|grep TBS_TO_GREP>$TBS_FILE2
    
    ########
    
    ##将结果录入DATAFILE
    
    ########
    
     while read i
    
    do
    
     V_coll_name=`echo $i|awk '{print $2}'`
    
     V_coll_value=`echo $i|awk '{print $5}'`
    
     echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date >> $DATA_FILE
    
    done < $TBS_FILE2
    
    #####删除临时文件
    
    rm -rf $TBS_FILE
    
    rm -rf $TBS_FILE2
    
    

    3.8 采集长事务信息

    
    ########
    
    ##说明
    
    ## 本脚本由collect_gg_info.sh脚本调度,属于GoldenGate日常监控脚本
    
    ## 本脚本作用在于通过GoldenGate命令检查长事务进程个数
    
    ########
    
    ########
    
    ##定义GoldenGate检查命令
    
    ########
    
    cd $GGS_HOME
    
    echo "send "$V_EXTRACT_NAME",SHOWTRANS DURATION "$V_DURATION>SHOW_TRANS
    
    ########
    
    ########
    
    ##设置各个值
    
    ########
    
    V_coll_type="LONGTRANS"
    
    V_coll_name="PROCESS_NUM"
    
    V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`
    
    ########
    
    ##获取长事务数量
    
    ########
    
    cd $GGS_HOME
    
    V_coll_value=`./ggsci<SHOW_TRANS|grep "XID:"|wc -l`
    
    ########
    
    ##输出采集结果到DATA_FILE文件
    
    ########
    
    echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date>>$DATA_FILE
    
    

    4.OGG源端目标端配置采集脚本定时任务

    配置定时任务

    ####GoldenGate日常运行状态采集脚本
    
    0,5,10,15,20,25,30,35,40,45,50,55 * * * * sh /ggs/ogg11/gg_mon/collect_gg_info.sh 1>/ggs/ogg11/gg_mon/collect_gg_info.sh.out 2>&1
    
    

    5.监控服务器准备存储采集信息的表

    
    CREATE TABLESPACE "GGATE"
    
    LOGGING
    
    DATAFILE '/u01/oradata/db01/ggate01.dbf' SIZE 50M
    
    AUTOEXTEND OFF;
    
    CREATE TABLE GGATE.gg_check_his(
    
     IDEN_STR VARCHAR2(20),
    
     COLL_TYPE VARCHAR2(20),
    
     COLL_NAME VARCHAR2(20),
    
     COLL_VALUE VARCHAR2(50),
    
     COLL_DATE DATE
    
    ) TABLESPACE GGATE;
    
    

    6.监控服务器配置告警脚本

    
    #!/usr/bin/ksh
    
    #####Shell for Display the alert and ok informations
    
    #####add by 2020/02/15
    
    #####Define Enviroment
    
    EXE_DATE_H=`date +%H`
    
    EXE_DATE_M=`date +%M`
    
    ##文件系统使用率85% 表空间使用率95% 时间延迟15%
    
    DF_LIM=85
    
    TBS_LIM=95
    
    LAG_LIM=15
    
    ##定义是否报告正常信息
    
    IF_REPORT_DIS="NO"
    
    IF_REPORT_LONG="NO"
    
    IF_REPORT_JAGENT="NO"
    
    IF_REPORT_STRUCT="NO"
    
    if [ $EXE_DATE_H == 08 -o $EXE_DATE_H == 17 ]
    
     then
    
     IF_REPORT_DIS="YES"
    
     IF_REPORT_JAGENT="YES"
    
     IF_REPORT_STRUCT="YES"
    
    fi
    
    if [ $EXE_DATE_M -ge 0 -a $EXE_DATE_M -lt 5 ]
    
     then
    
     IF_REPORT_LONG="YES"
    
    fi
    
    echo "###############################Excute Start Time: `date` ##############################">> send_mail_msg
    
    #. $HOME/.profile
    
    export ORACLE_SID=db01
    
    MONITOR_HOME=/home/oracle/testmon
    
    #####Define Identifier
    
    DB01_SOURCE="(生产中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)"
    
    DB01_TARGET="(灾备中心|DB_NAME: db01|IP: 192.168.1.51 |GG_HOME: /ggs/ogg11/gg_mon)"
    
    iden="DB01_SOURCE DB01_TARGET"
    
    #####创建临时表,相关临时表存储最近一次采集的信息
    
    sqlplus -s -l / as sysdba <<EOF >create_tmp_table.tmp
    
    drop table ggate.gg_check_his_temp;
    
    create table ggate.gg_check_his_temp as
    
    select * from ggate.gg_check_his
    
    where COLL_DATE between sysdate-1/24/60*5 and sysdate;
    
    EOF
    
    #####辨别主机采集是否正常,若异常则输出
    
    sqlplus -s -l / as sysdba <<EOF > host_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
     col COLL_VALUE for a20
    
    select IDEN_STR from ggate.gg_check_his_temp group by IDEN_STR having count(distinct COLL_TYPE)>7;
    
    EOF
    
    cd $MONITOR_HOME
    
    cat /dev/null>host_info
    
    cat /dev/null>host_all
    
    if [ `cat host_info_sql.tmp|wc -l` -eq 2 ]
    
    then
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上各采集进程运行正常。" >>ggmon.log
    
    else
    
     cat /dev/null>host.tmp
    
     for i in $iden
    
     do
    
     echo $i>>host.tmp
    
     done
    
     cat host.tmp|sort -u>host_all
    
     rm host.tmp
    
     cat host_info_sql.tmp |sort -u > host_info
    
     diff host_all host_info|grep '^<'|awk '{print $NF}' > no_collect_info.tmp
    
     while read i
    
    do
    
     case $i in
    
     DB01_SOURCE) echo "WARNING "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" GoldenGate日常运行状态采集脚本存在异常。${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "WARNING "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" GoldenGate日常运行状态采集脚本存在异常。${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *) exit
    
     ;;
    
     esac
    
     done < no_collect_info.tmp
    
     fi
    
    #######下面是根据标识符从数据库获取信息
    
    #######Mode1#######各主机获取GoldenGate进程信息
    
    sqlplus -s -l / as sysdba << EOF >pro_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
     col COLL_VALUE for a20
    
    select IDEN_STR,COLL_TYPE,COLL_NAME,COLL_VALUE,to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp where COLL_TYPE in ('MGR','ER') order by 1,2,3,4;
    
    EOF
    
    #####过滤进程信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>pro_ok.tmp
    
    cat /dev/null>pro_warning.tmp
    
    cat /dev/null>mail_msg_pro_warning.tmp
    
    while 
    
     read i
    
     do
    
     if [ "`echo $i|awk '{print $4}'`"x == "RUNNING"x ]
    
     then
    
     echo $i >> pro_ok.tmp
    
     else
    
     echo $i >> pro_warning.tmp
    
     fi
    
     done < pro_info_sql.tmp
    
    #####1#####过滤生成进程运行信息
    
    ###GoldenGate 进程正常,输出信息
    
     if [ -s $MONITOR_HOME/pro_warning.tmp ]
    
     then
    
     cat pro_warning.tmp > mail_msg_pro_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "ERROR "$5" "$6" GoldenGate进程状态异常,名字:"$3",状态:"$4"。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
     DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_pro_warning.tmp
    
     else
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上各GoldenGate进程状态正常。" >>ggmon.log
    
     fi
    
    ######Mode2######
    
    ###监控Discard文件是否有ORA-报错
    
    ##################
    
    #获取Discard文件信息
    
    sqlplus -s -l / as sysdba << EOF >ora_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
     col COLL_VALUE for a20
    
    select IDEN_STR,COLL_TYPE,COLL_NAME,COLL_VALUE,to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp
    
    where COLL_TYPE='DISCARD' order by 1,2,3,4;
    
    EOF
    
    #过滤ORA信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>ora_ok.tmp
    
    cat /dev/null>ora_warning.tmp
    
    while 
    
     read i
    
     do
    
     if [ `echo $i|awk '{print $4}'` -eq 0 ]
    
     then
    
     echo $i >> ora_ok.tmp
    
     else
    
     echo $i >> ora_warning.tmp
    
     fi
    
     done < ora_info_sql.tmp
    
    #生成邮件信息
    
    if [ -s $MONITOR_HOME/ora_warning.tmp ]
    
     then
    
     cat ora_warning.tmp > mail_msg_ora_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "WARNING "$5" "$6" GoldenGate进程discard文件报错,名字:"$3",数量:"$4"。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
     DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_ora_warning.tmp
    
     else
    
     if [ $IF_REPORT_DIS == "YES" ]
    
     then
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上各GoldenGate进程discard文件正常。" >>ggmon.log
    
     fi
    
    fi
    
    ######Mode3######
    
    ###监控进程延迟
    
    ##################
    
    #获取延迟信息
    
    sqlplus -s -l / as sysdba << EOF >lag_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
    select IDEN_STR,COLL_TYPE,COLL_NAME,round(COLL_VALUE/60,0) ,to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp
    
    where COLL_TYPE ='LAG' order by 1,2,3,4;
    
    EOF
    
    #过滤延迟信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>lag_ok.tmp
    
    cat /dev/null>lag_warning.tmp
    
    cat /dev/null>mail_msg_lag_warning.tmp
    
    while 
    
     read i
    
     do
    
     if [ `echo $i|awk '{print $4}'` -lt $LAG_LIM ]
    
     then
    
     echo $i >> lag_ok.tmp
    
     else
    
     echo $i >> lag_warning.tmp
    
     fi
    
     done < lag_info_sql.tmp
    
    #生成邮件信息
    
     if [ -s $MONITOR_HOME/lag_warning.tmp ]
    
     then
    
     cat lag_warning.tmp > mail_msg_lag_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "WARNING "$5" "$6" GoldenGate进程存在时间延迟,名字:"$3",分钟:"$4"。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
     DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_lag_warning.tmp
    
     else
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上各GoldenGate进程时间延迟均在"$LAG_LIM"分钟内。" >>ggmon.log         
    
     fi
    
    ######Mode4######
    
    ###监控长事务
    
    ##################
    
    #获取各长事务信息
    
    sqlplus -s -l / as sysdba << EOF >long_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
     col COLL_VALUE for a20
    
    select IDEN_STR,COLL_TYPE,COLL_NAME, COLL_VALUE,to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp
    
     where COLL_TYPE ='LONGTRANS' order by 1,2,3,4;
    
    EOF
    
    #过滤文系统信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>long_ok.tmp
    
    cat /dev/null>long_warning.tmp
    
    cat /dev/null>mail_msg_long_warning.tmp
    
    while 
    
     read i
    
     do
    
     if [ ` echo $i|awk '{print $4}'` -eq 0 ]
    
     then
    
     echo $i >> long_ok.tmp
    
     else
    
     echo $i >> long_warning.tmp
    
     fi
    
     done < long_info_sql.tmp
    
    #生成邮件信息
    
     if [ -s $MONITOR_HOME/long_warning.tmp ]
    
     then
    
     cat long_warning.tmp > mail_msg_long_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "WARNING "$5" "$6" GoldenGate进程监测到长事务,名字:"$3",数量:"$4"。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
     DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_long_warning.tmp
    
     else
    
     if [ $IF_REPORT_LONG == "YES" ]
    
     then
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心上各GoldenGate进程对应数据库均无长事务。" >>ggmon.log
    
     fi
    
     fi
    
    ######Mode5######
    
    ###监控数据库表空间
    
    ##################
    
    #获取各表空间使用率信息
    
    sqlplus -s -l / as sysdba << EOF >tb_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
    select IDEN_STR,COLL_TYPE,COLL_NAME, round(COLL_VALUE,0),to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp
    
    where COLL_TYPE ='TABLESPACE' order by 1,2,3,4;
    
    EOF
    
    #过滤各表空间使用率信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>tb_ok.tmp
    
    cat /dev/null>tb_warning.tmp
    
    cat /dev/null>mail_msg_tb_warning.tmp
    
    while 
    
     read i
    
     do
    
     if [ `echo $i|awk '{print $4}'` -le $TBS_LIM ]
    
     then
    
     echo $i >> tb_ok.tmp
    
     else
    
     echo $i >> tb_warning.tmp
    
     fi
    
     done < tb_info_sql.tmp
    
    #生成邮件信息
    
     if [ -s $MONITOR_HOME/tb_warning.tmp ]
    
     then
    
     cat tb_warning.tmp > mail_msg_tb_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "WARNING "$5" "$6" 数据库表空间使用率过高,名字:"$3",使用率:"$4"。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
      DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_tb_warning.tmp
    
     else
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上各数据库表空间使用率正常。" >>ggmon.log
    
     fi
    
    ######Mode6######
    
    ###监控文件系统
    
    ##################
    
    #获取各文件系统使用率信息
    
    sqlplus -s -l / as sysdba << EOF >df_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
     col COLL_VALUE for a20
    
    select IDEN_STR,COLL_TYPE,COLL_NAME, COLL_VALUE,to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp
    
    where COLL_TYPE='DF' order by 1,2,3,4;
    
    EOF
    
    #过滤文件使用率信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>df_ok.tmp
    
    cat /dev/null>df_warning.tmp
    
    cat /dev/null>mail_msg_df_warning.tmp
    
    while 
    
     read i
    
     do
    
     if [ `echo $i|awk '{print $4}'|awk -F % '{print $1}'` -le $DF_LIM ]
    
     then
    
     echo $i >> df_ok.tmp
    
     else
    
     echo $i >> df_warning.tmp
    
     fi
    
     done < df_info_sql.tmp
    
    #生成邮件信息
    
     if [ -s $MONITOR_HOME/df_warning.tmp ]
    
     then
    
     cat df_warning.tmp > mail_msg_df_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "WARNING "$5" "$6" 文件系统使用率过高,名字:"$3",使用率:"$4"。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
     DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_df_warning.tmp
    
     else
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上各文件系统使用率正常。" >>ggmon.log
    
     fi
    
    #####Mode7######
    
    ###监控Veridata Java进程
    
    #################
    
    #获取JAGENT文件信息
    
    sqlplus -s -l / as sysdba << EOF >java_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
     col COLL_VALUE for a20
    
    select IDEN_STR,COLL_TYPE,COLL_NAME,COLL_VALUE,to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp 
    
    where COLL_TYPE ='JAGENT' order by 1,2,3,4;
    
    EOF
    
    #过滤JAGENT信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>java_ok.tmp
    
    cat /dev/null>java_warning.tmp
    
    cat /dev/null>mail_msg_java_warning.tmp
    
    while 
    
     read i
    
     do
    
     if [ `echo $i|awk '{print $4}'` -eq 1 ]
    
     then
    
     echo $i >> java_ok.tmp
    
     else
    
     echo $i >> java_warning.tmp
    
     fi
    
     done < java_info_sql.tmp
    
    #生成邮件信息
    
    if [ -s $MONITOR_HOME/java_warning.tmp ]
    
     then
    
     cat java_warning.tmp > mail_msg_java_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "ERROR "$5" "$6" GoldenGate Veridata Java Agent没有启动。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
     DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_java_warning.tmp
    
     else
    
     if [ $IF_REPORT_JAGENT == "YES" ]
    
     then
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上GoldenGate Veridata Java Agent正常。" >>ggmon.log
    
     fi
    
     fi
    
    #########Mode 8 ############
    
    ####监控灾备与主库对比情况
    
    #############################
    
    sqlplus -s -l / as sysdba << EOF >object_info_sql.tmp
    
     set serveroutput off
    
     set pagesize 2000
    
     set linesize 1000
    
     set feedback off
    
     set heading off
    
     set newpage none
    
     set term off
    
     set trims on
    
     set trim on
    
     col COLL_TYPE for a10
    
     col COLL_VALUE for a20
    
    select IDEN_STR,COLL_TYPE,COLL_NAME, COLL_VALUE,to_char(COLL_DATE,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp
    
     where COLL_TYPE='OBJECT' order by 1,2,3,4;
    
    EOF
    
    #过滤文系统信息
    
    cd $MONITOR_HOME
    
    cat /dev/null>object_ok.tmp
    
    cat /dev/null>object_warning.tmp
    
    cat /dev/null>mail_msg_object_warning.tmp
    
    while 
    
      read i
    
     do
    
     if [ `echo $i|awk '{print $4}'` -eq 0 ]
    
     then
    
     echo $i >> object_ok.tmp
    
     else
    
     echo $i >> object_warning.tmp
    
     fi
    
     done < object_info_sql.tmp
    
    #生成邮件信息
    
     if [ -s $MONITOR_HOME/object_warning.tmp ]
    
     then
    
     cat object_warning.tmp > mail_msg_object_warning.tmp
    
    while read line
    
    do
    
     veritify_col=`echo $line |awk '{print "WARNING "$5" "$6" 数据库结构不一致,类型:"$3",数量:"$4"。"}'`
    
     veritify=`echo $line |awk '{print $1}'`
    
     case $veritify in
    
     DB01_SOURCE) echo "${veritify_col}${DB01_SOURCE}" >> ggmon.log
    
     ;;
    
     DB01_TARGET) echo "${veritify_col}${DB01_TARGET}" >> ggmon.log
    
     ;;
    
     *)
    
     ;;
    
     esac
    
     done < mail_msg_object_warning.tmp
    
     else
    
     if [ $IF_REPORT_STRUCT == "YES" ]
    
     then
    
     echo "INFO "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" 生产中心以及灾备中心上结构对比正常。" >>ggmon.log
    
     fi
    
     fi
    
    #########Mode End###########
    
    ####生成正式邮件文本
    
    #############################
    
    cat *ok > send_mail_msg.tmp.ok
    
    cat ggmon.log >> send_mail_msg.tmp
    
    #如果 FILE 存在且大小不为0
    
    if [ -s $MONITOR_HOME/send_mail_msg.tmp ]
    
    then
    
     cat send_mail_msg.tmp >> send_mail_msg
    
     else
    
     cat send_mail_msg.tmp.ok >> send_mail_msg
    
     fi
    
    ###清理临时文件
    
    cd $MONITOR_HOME
    
     rm -rf *tmp
    
     rm -rf *ok
    
     rm -rf mail*
    
     echo "###############################Excute End Time: `date` ##############################">> send_mail_msg
    
    echo "                                                                                ">> send_mail_msg
    
    

    7.运行结果

    当有异常时候就会通过告警发送出来。

    
    ERROR 2020-02-21 02:03:32 GoldenGate Veridata Java Agent没有启动。(生产中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)
    
    WARNING 2020-02-21 02:03:32 GoldenGate进程discard文件报错,名字:RITPUB10,数量:2。(生产中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)
    
    WARNING 2020-02-21 02:05:01 GoldenGate进程discard文件报错,名字:RITPUB10,数量:2。(生产中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)
    
    WARNING 2020-02-21 02:03:32 GoldenGate进程存在时间延迟,名字:PITPUB01,分钟:16334。(生产中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)
    
    WARNING 2020-02-21 02:03:32 数据库表空间使用率过高,名字:SYSTEM,使用率:97。(生产中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)
    
    WARNING 2020-02-21 02:01:42 数据库表空间使用率过高,名字:SYSTEM,使用率:100。(灾备中心|DB_NAME: db01|IP: 192.168.1.51 |GG_HOME: /ggs/ogg11/gg_mon)
    
    WARNING 2020-02-21 02:05:01 数据库表空间使用率过高,名字:SYSTEM,使用率:100。(灾备中心|DB_NAME: db01|IP: 192.168.1.51  |GG_HOME: /ggs/ogg11/gg_mon)
    
    WARNING 2020-02-21 02:03:29 数据库表空间使用率过高,名字:SYSTEM,使用率:100。(灾备中心|DB_NAME: db01|IP: 192.168.1.51 |GG_HOME: /ggs/ogg11/gg_mon)
    
    INFO 2020-02-21 03:26:01 生产中心以及灾备中心上各GoldenGate进程状态正常。
    
    INFO 2020-02-21 03:26:01 生产中心以及灾备中心上各GoldenGate进程时间延迟均在15分钟内。
    
    INFO 2020-02-21 03:26:01 生产中心以及灾备中心上各数据库表空间使用率正常。
    
    INFO 2020-02-21 03:26:01 生产中心以及灾备中心上各文件系统使用率正常。
    
    

    8.小结

    监控脚本项目架构采用模块化,思路清晰明了,每个监控指标都是单独一个脚本,便于修改,移植,调试。前期部署调试好后,后期人工介入的时间很少,定时检查同步状态和日志状态,后期可以加入自动发送短信和邮件的功能,极大方便我们的日常维护。

    相关文章

      网友评论

          本文标题:ORACLE GOLDENGATE 监控脚本

          本文链接:https://www.haomeiwen.com/subject/vajyqhtx.html