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ù)。