ORACLE GOLDENGATE 監(jiān)控腳本

ORACLE GOLDENGATE MONITOR

1. 背景

很多需要使用Oracle Godengate來(lái)進(jìn)行容災(zāi),雖然Oracle官方有自己的OGG監(jiān)控產(chǎn)品和數(shù)據(jù)對(duì)比產(chǎn)品,如GoldenGate Veridata、GoldenGate Director,但是由于其是需要單獨(dú)收費(fèi)的,且安裝操作使用復(fù)雜,于是開(kāi)發(fā)了適應(yīng)客戶需求的監(jiān)控腳本。

2.環(huán)境信息

Oracle Goldengate 環(huán)境:

源端 DB01_SOURCE 192.168.1.50

目標(biāo)端 DB01_TARGET 192.168.1.51

OGG版本: ogg11g

數(shù)據(jù)庫(kù)版本:Oracle 11.2.0.4

監(jiān)控服務(wù)器

DB0Monitor 192.168.1.16

數(shù)據(jù)庫(kù)版本:Oracle 11.2.0.4

存放監(jiān)控信息表:ggate.gg_check_his

3.監(jiān)控腳本編寫(xiě)配置

3.1 GoldenGate日常監(jiān)控的總調(diào)度腳本

#!/usr/bin/ksh

########

##說(shuō)明

## 本腳本由crontab自動(dòng)調(diào)度,為GoldenGate日常監(jiān)控的總調(diào)度腳本

## 本腳本作用在于設(shè)計(jì)各種環(huán)境變量、調(diào)度采集信息的巡檢腳本、將巡檢腳本結(jié)果錄入歷史表

########

########

##獲取本腳本執(zhí)行的時(shí)間

##此時(shí)間用于判定所執(zhí)行的子腳本以及定義臨時(shí)文件名

########

export EXE_DATE_D=`date +%Y%m%d`

export EXE_DATE_H=`date +%H`

export EXE_DATE_M=`date +%M`

########

##監(jiān)控對(duì)象標(biāo)識(shí)

##現(xiàn)有的監(jiān)控對(duì)象有DB01_SOURCE、DB01_TARGET

########

##DB01_SOURCE DB01_TARGET

export V_iden_str="DB01_SOURCE"

########

##本監(jiān)控腳本根目錄

########

export MON_HOME=/ggs/ogg11/gg_mon

########

##GoldenGate安裝目錄

########

export GGS_HOME=/ggs/ogg11

########

##JAVA_AGENT路徑

########

export V_JAGENT_PATH="/gg/veragent/agent/JavaAgent.jar"

########

##待檢查的文件系統(tǒng)路徑

########

export V_DF_PATH="/oracle/arch"

########

##數(shù)據(jù)庫(kù)登陸信息

## TNS_ADMIN TNS_NAME R_USERNAME R_PASSWORD 指向存儲(chǔ)巡檢歷史信息的數(shù)據(jù)庫(kù)

## ORACLE_SID L_USERNAME L_PASSWORD 執(zhí)向本地?cái)?shù)據(jù)庫(kù)

## 本地同步用戶列表USERLIST

## 指向生產(chǎn)庫(kù)的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=""

########

##存放長(zhǎng)事務(wù)參數(shù)

########

#抽取進(jìn)程名字

export V_EXTRACT_NAME="EITPUB01"

#時(shí)間

export V_DURATION="55m"

########

##存放采集信息的表

########

export V_HIS_TABLE="ggate.gg_check_his"

########

##臨時(shí)文件

## DATA_FILE存儲(chǔ)采集回來(lái)的結(jié)果存放成txt格式

## SQL_FILE存放通過(guò)將DATA_FILE轉(zhuǎn)換成的sql語(yǔ)句

########

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

########

##定義各個(gè)列值

########

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進(jìn)程信息腳本

########

sh $MON_HOME/check_mgr.sh > $MON_HOME/check_mgr.sh.out 2>&1

########

##采集ER進(jìn)程信息腳本

## ER即EXTRACT和REPLICATE進(jìn)程

## 采集信息包括ER進(jìn)程運(yùn)行狀態(tài)以及時(shí)間延遲

########

sh $MON_HOME/check_er.sh > $MON_HOME/check_er.sh.out 2>&1

########

##采集JavaAgent進(jìn)程數(shù)腳本

## 采集的是巡檢的數(shù)據(jù)庫(kù)對(duì)應(yīng)JavaAgent進(jìn)程數(shù)

########

sh $MON_HOME/check_jagent.sh > $MON_HOME/check_jagent.sh.out 2>&1

########

##采集DISCARD文件ORA-報(bào)錯(cuò)腳本

##注意check_discard.sh腳本 discard文件存放的路徑不一樣需要根據(jù)實(shí)際環(huán)境修改

## 采集的是巡檢的數(shù)據(jù)庫(kù)對(duì)應(yīng)JavaAgent進(jìn)程數(shù)

########

sh $MON_HOME/check_discard.sh > $MON_HOME/check_discard.sh.out 2>&1

########

##采集文件系統(tǒng)目錄使用率

## 采集的是文件系統(tǒng)使用率

########

sh $MON_HOME/check_df.sh > $MON_HOME/check_df.sh.out 2>&1

########

##采集表空間使用率

## 采集的是數(shù)據(jù)庫(kù)表空間使用率

########

sh $MON_HOME/check_tbs.sh > $MON_HOME/check_tbs.sh.out 2>&1

########

##采集長(zhǎng)事務(wù)

########

sh $MON_HOME/get_trans.sh > $MON_HOME/get_trans.sh.out 2>&1

##將采集的結(jié)果格式轉(zhuǎn)換為SQL語(yǔ)句

########

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

########

##將采集的結(jié)果錄入數(shù)據(jù)庫(kù)

########

${ORACLE_HOME}/bin/sqlplus -S ${R_USERNAME}/${R_PASSWORD}@${TNS_NAME} @${SQL_FILE}

########

##清理臨時(shí)文件

########

rm $DATA_FILE

rm $SQL_FILE

3.2 采集MGR進(jìn)程信息


#!/usr/bin/ksh

########

##說(shuō)明

## 本腳本由collect_gg_info.sh腳本調(diào)度,屬于GoldenGate日常監(jiān)控腳本

## 本腳本作用在于通過(guò)GoldenGate命令確認(rèn)MGR進(jìn)程運(yùn)行狀態(tài)

########

########

##定義GoldenGate檢查命令

########

cd $GGS_HOME

echo "info mgr">INFO_MGR

########

########

##設(shè)置各個(gè)值

########

V_coll_type="MGR"

V_coll_name="MGR"

V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`

########

##采集MGR進(jìn)程狀態(tài)

########

cd $GGS_HOME

V_coll_value=`./ggsci<INFO_MGR|grep "Manager is"|awk '{print $3}'|tr "[a-z]" "[A-Z]"`

########

##輸出采集結(jié)果到DATA_FILE文件

########

echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date>>$DATA_FILE

3.3 采集ER進(jìn)程信息


#!/usr/bin/ksh

########

##說(shuō)明

## 本腳本由collect_gg_info.sh腳本調(diào)度,屬于GoldenGate日常監(jiān)控腳本

## 本腳本作用在于通過(guò)GoldenGate命令確認(rèn)ER進(jìn)程運(yùn)行狀態(tài)以及時(shí)間延遲信息

## ER進(jìn)程即EXTRACT和REPLICATE進(jìn)程

########

########

##GoldenGate檢查命令

########

cd $GGS_HOME

echo "info all">INFO_ALL

########

##臨時(shí)文件

## INFOER_FILE存放通過(guò)INFO ALL命令所獲取

########

export INFOER_FILE=$MON_HOME"/info_er_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"

cat /dev/null>$INFOER_FILE

########

##設(shè)置各個(gè)值

########

V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`

########

##通過(guò)info all命令獲取進(jìn)程狀態(tài)

########

cd $GGS_HOME

./ggsci<INFO_ALL|grep -E "EXTRACT|REPLICAT">$INFOER_FILE

########

####輸出采集結(jié)果到DATA_FILE文件

#### 腳本上半部分處理ER進(jìn)程狀態(tài)、下半部分處理ER進(jìn)程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

########

##清理臨時(shí)文件

########

rm $INFOER_FILE

3.4采集JavaAgent進(jìn)程信息


#!/usr/bin/ksh

########

##說(shuō)明

## 本腳本由collect_gg_info.sh腳本調(diào)度,屬于GoldenGate日常監(jiān)控腳本

## 本腳本作用在于通過(guò)GoldenGate命令確認(rèn)GoldenGate Veridata Java Agent進(jìn)程數(shù)

########

########

##設(shè)置各個(gè)值

########

V_coll_type="JAGENT"

V_coll_name="PROCESS_NUM"

V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`

########

##采集JAVA AGENT進(jìn)程狀態(tài)

########

cd $GGS_HOME

V_coll_value=`ps -ef|grep $V_JAGENT_PATH|grep -v grep|wc -l`

########

##輸出采集結(jié)果到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

########

##說(shuō)明

## 本腳本由collect_gg_info.sh腳本調(diào)度,屬于GoldenGate日常監(jiān)控腳本

## 本腳本作用在于通過(guò)檢查GoldenGate Discard日志,統(tǒng)計(jì)ORA-報(bào)錯(cuò)個(gè)數(shù)

########

########

##GoldenGate檢查命令

########

cd $GGS_HOME

echo "info all">INFO_ALL

########

##臨時(shí)文件

## ERNAME_FILE存放當(dāng)前數(shù)據(jù)庫(kù)中GoldenGate同步進(jìn)程命名

########

export ERNAME_FILE=$MON_HOME"/er_name_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"

cat /dev/null>$ERNAME_FILE

########

##設(shè)置各個(gè)值

########

V_coll_type="DISCARD"

V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`

########

##通過(guò)info all命令獲取進(jìn)程名

########

cd $GGS_HOME

./ggsci<INFO_ALL|grep -E "EXTRACT|REPLICAT"|awk '{print $3}'>$ERNAME_FILE

########

##逐一分析各個(gè)進(jìn)程的discard文件,并輸出采集結(jié)果到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`

 #自己實(shí)驗(yàn)使用下面這條

 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

########

##清理臨時(shí)文件

########

rm $ERNAME_FILE

3.6 采集文件系統(tǒng)目錄使用率


#!/usr/bin/ksh

########

##說(shuō)明

## 本腳本由collect_gg_info.sh腳本調(diào)度,屬于GoldenGate日常監(jiān)控腳本

## 本腳本作用主要負(fù)責(zé)GoldenGate文件系統(tǒng)

########

##設(shè)置各個(gè)值

########

V_coll_type="DF"

V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`

########

##臨時(shí)文件

## DF_FILE存放當(dāng)前數(shù)據(jù)庫(kù)中GoldenGate同步進(jìn)程命名

########

export DF_FILE=$MON_HOME"/df_"$EXE_DATE_D$EXE_DATE_H$EXE_DATE_M".txt"

cat /dev/null>$DF_FILE

########

##通過(guò)df命令獲取文件系統(tǒng)使用率

##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

#####刪除臨時(shí)文件

rm -rf $DF_FILE

3.7 采集表空間使用率


#!/usr/bin/ksh

########

##說(shuō)明

## 本腳本由collect_gg_info.sh腳本調(diào)度,屬于GoldenGate日常監(jiān)控腳本

## 本腳本作用主要監(jiān)控表空間使用率

########

##設(shè)置各個(gè)值

########

V_coll_type="TABLESPACE"

V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`

########

##臨時(shí)文件

## TBS_FILE存放當(dāng)前數(shù)據(jù)庫(kù)中GoldenGate同步進(jìn)程命名

########

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

########

##通過(guò)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

########

##將結(jié)果錄入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

#####刪除臨時(shí)文件

rm -rf $TBS_FILE

rm -rf $TBS_FILE2

3.8 采集長(zhǎng)事務(wù)信息


########

##說(shuō)明

## 本腳本由collect_gg_info.sh腳本調(diào)度,屬于GoldenGate日常監(jiān)控腳本

## 本腳本作用在于通過(guò)GoldenGate命令檢查長(zhǎng)事務(wù)進(jìn)程個(gè)數(shù)

########

########

##定義GoldenGate檢查命令

########

cd $GGS_HOME

echo "send "$V_EXTRACT_NAME",SHOWTRANS DURATION "$V_DURATION>SHOW_TRANS

########

########

##設(shè)置各個(gè)值

########

V_coll_type="LONGTRANS"

V_coll_name="PROCESS_NUM"

V_coll_date=`date +%Y'-'%m'-'%d':'%H':'%M':'%S`

########

##獲取長(zhǎng)事務(wù)數(shù)量

########

cd $GGS_HOME

V_coll_value=`./ggsci<SHOW_TRANS|grep "XID:"|wc -l`

########

##輸出采集結(jié)果到DATA_FILE文件

########

echo $V_iden_str" "$V_coll_type" "$V_coll_name" "$V_coll_value" "$V_coll_date>>$DATA_FILE

4.OGG源端目標(biāo)端配置采集腳本定時(shí)任務(wù)

配置定時(shí)任務(wù)

####GoldenGate日常運(yùn)行狀態(tài)采集腳本

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.監(jiān)控服務(wù)器準(zhǔn)備存儲(chǔ)采集信息的表


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.監(jiān)控服務(wù)器配置告警腳本


#!/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`

##文件系統(tǒng)使用率85% 表空間使用率95% 時(shí)間延遲15%

DF_LIM=85

TBS_LIM=95

LAG_LIM=15

##定義是否報(bào)告正常信息

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="(生產(chǎn)中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)"

DB01_TARGET="(災(zāi)備中心|DB_NAME: db01|IP: 192.168.1.51 |GG_HOME: /ggs/ogg11/gg_mon)"

iden="DB01_SOURCE DB01_TARGET"

#####創(chuàng)建臨時(shí)表,相關(guān)臨時(shí)表存儲(chǔ)最近一次采集的信息

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

#####辨別主機(jī)采集是否正常,若異常則輸出

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`" 生產(chǎn)中心以及災(zāi)備中心上各采集進(jìn)程運(yùn)行正常。" >>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日常運(yùn)行狀態(tài)采集腳本存在異常。${DB01_SOURCE}" >> ggmon.log

 ;;

 DB01_TARGET) echo "WARNING "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" GoldenGate日常運(yùn)行狀態(tài)采集腳本存在異常。${DB01_TARGET}" >> ggmon.log

 ;;

 *) exit

 ;;

 esac

 done < no_collect_info.tmp

 fi

#######下面是根據(jù)標(biāo)識(shí)符從數(shù)據(jù)庫(kù)獲取信息

#######Mode1#######各主機(jī)獲取GoldenGate進(jìn)程信息

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

#####過(guò)濾進(jìn)程信息

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#####過(guò)濾生成進(jìn)程運(yùn)行信息

###GoldenGate 進(jìn)程正常,輸出信息

 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進(jìn)程狀態(tài)異常,名字:"$3",狀態(tài):"$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`" 生產(chǎn)中心以及災(zāi)備中心上各GoldenGate進(jìn)程狀態(tài)正常。" >>ggmon.log

 fi

######Mode2######

###監(jiān)控Discard文件是否有ORA-報(bào)錯(cuò)

##################

#獲取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

#過(guò)濾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進(jìn)程discard文件報(bào)錯(cuò),名字:"$3",數(shù)量:"$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`" 生產(chǎn)中心以及災(zāi)備中心上各GoldenGate進(jìn)程discard文件正常。" >>ggmon.log

 fi

fi

######Mode3######

###監(jiān)控進(jìn)程延遲

##################

#獲取延遲信息

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

#過(guò)濾延遲信息

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進(jìn)程存在時(shí)間延遲,名字:"$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`" 生產(chǎn)中心以及災(zāi)備中心上各GoldenGate進(jìn)程時(shí)間延遲均在"$LAG_LIM"分鐘內(nèi)。" >>ggmon.log         

 fi

######Mode4######

###監(jiān)控長(zhǎng)事務(wù)

##################

#獲取各長(zhǎng)事務(wù)信息

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

#過(guò)濾文系統(tǒng)信息

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進(jìn)程監(jiān)測(cè)到長(zhǎng)事務(wù),名字:"$3",數(shù)量:"$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`" 生產(chǎn)中心上各GoldenGate進(jìn)程對(duì)應(yīng)數(shù)據(jù)庫(kù)均無(wú)長(zhǎng)事務(wù)。" >>ggmon.log

 fi

 fi

######Mode5######

###監(jiān)控?cái)?shù)據(jù)庫(kù)表空間

##################

#獲取各表空間使用率信息

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

#過(guò)濾各表空間使用率信息

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" 數(shù)據(jù)庫(kù)表空間使用率過(guò)高,名字:"$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`" 生產(chǎn)中心以及災(zāi)備中心上各數(shù)據(jù)庫(kù)表空間使用率正常。" >>ggmon.log

 fi

######Mode6######

###監(jiān)控文件系統(tǒng)

##################

#獲取各文件系統(tǒng)使用率信息

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

#過(guò)濾文件使用率信息

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" 文件系統(tǒng)使用率過(guò)高,名字:"$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`" 生產(chǎn)中心以及災(zāi)備中心上各文件系統(tǒng)使用率正常。" >>ggmon.log

 fi

#####Mode7######

###監(jiān)控Veridata Java進(jìn)程

#################

#獲取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

#過(guò)濾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沒(méi)有啟動(dòng)。"}'`

 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`" 生產(chǎn)中心以及災(zāi)備中心上GoldenGate Veridata Java Agent正常。" >>ggmon.log

 fi

 fi

#########Mode 8 ############

####監(jiān)控災(zāi)備與主庫(kù)對(duì)比情況

#############################

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

#過(guò)濾文系統(tǒng)信息

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" 數(shù)據(jù)庫(kù)結(jié)構(gòu)不一致,類(lèi)型:"$3",數(shù)量:"$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`" 生產(chǎn)中心以及災(zāi)備中心上結(jié)構(gòu)對(duì)比正常。" >>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

###清理臨時(shí)文件

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.運(yùn)行結(jié)果

當(dāng)有異常時(shí)候就會(huì)通過(guò)告警發(fā)送出來(lái)。


ERROR 2020-02-21 02:03:32 GoldenGate Veridata Java Agent沒(méi)有啟動(dòng)。(生產(chǎn)中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)

WARNING 2020-02-21 02:03:32 GoldenGate進(jìn)程discard文件報(bào)錯(cuò),名字:RITPUB10,數(shù)量:2。(生產(chǎn)中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)

WARNING 2020-02-21 02:05:01 GoldenGate進(jìn)程discard文件報(bào)錯(cuò),名字:RITPUB10,數(shù)量:2。(生產(chǎn)中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)

WARNING 2020-02-21 02:03:32 GoldenGate進(jìn)程存在時(shí)間延遲,名字:PITPUB01,分鐘:16334。(生產(chǎn)中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)

WARNING 2020-02-21 02:03:32 數(shù)據(jù)庫(kù)表空間使用率過(guò)高,名字:SYSTEM,使用率:97。(生產(chǎn)中心|DB_NAME: db01|IP: 192.168.1.50 |GG_HOME: /ggs/ogg11/gg_mon)

WARNING 2020-02-21 02:01:42 數(shù)據(jù)庫(kù)表空間使用率過(guò)高,名字:SYSTEM,使用率:100。(災(zāi)備中心|DB_NAME: db01|IP: 192.168.1.51 |GG_HOME: /ggs/ogg11/gg_mon)

WARNING 2020-02-21 02:05:01 數(shù)據(jù)庫(kù)表空間使用率過(guò)高,名字:SYSTEM,使用率:100。(災(zāi)備中心|DB_NAME: db01|IP: 192.168.1.51  |GG_HOME: /ggs/ogg11/gg_mon)

WARNING 2020-02-21 02:03:29 數(shù)據(jù)庫(kù)表空間使用率過(guò)高,名字:SYSTEM,使用率:100。(災(zāi)備中心|DB_NAME: db01|IP: 192.168.1.51 |GG_HOME: /ggs/ogg11/gg_mon)

INFO 2020-02-21 03:26:01 生產(chǎn)中心以及災(zāi)備中心上各GoldenGate進(jìn)程狀態(tài)正常。

INFO 2020-02-21 03:26:01 生產(chǎn)中心以及災(zāi)備中心上各GoldenGate進(jìn)程時(shí)間延遲均在15分鐘內(nèi)。

INFO 2020-02-21 03:26:01 生產(chǎn)中心以及災(zāi)備中心上各數(shù)據(jù)庫(kù)表空間使用率正常。

INFO 2020-02-21 03:26:01 生產(chǎn)中心以及災(zāi)備中心上各文件系統(tǒng)使用率正常。

8.小結(jié)

監(jiān)控腳本項(xiàng)目架構(gòu)采用模塊化,思路清晰明了,每個(gè)監(jiān)控指標(biāo)都是單獨(dú)一個(gè)腳本,便于修改,移植,調(diào)試。前期部署調(diào)試好后,后期人工介入的時(shí)間很少,定時(shí)檢查同步狀態(tài)和日志狀態(tài),后期可以加入自動(dòng)發(fā)送短信和郵件的功能,極大方便我們的日常維護(hù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容