ORACLE GOLDENGATE 监控脚本

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>$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$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$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>$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 <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 < 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 监控脚本)