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