当前位置: 代码网 > it编程>数据库>Oracle > ORACLE GOLDENGATE监控脚本方式

ORACLE GOLDENGATE监控脚本方式

2026年05月11日 Oracle 我要评论
oracle goldengate monitor1、背景很多需要使用oracle godengate来进行容灾,虽然oracle官方有自己的ogg监控产品和数据对比产品,如goldengate ve

oracle goldengate monitor

1、背景

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

2、环境信息

oracle goldengate 环境:

  • 源端   db01_source 192.168.1.50
  • 目标端 db01_target 192.168.1.51
  • ogg版本: ogg11g
  • 数据库版本:oracle 11.2.0.4

监控服务器

  • db0monitor 192.168.1.16
  • 数据库版本:oracle 11.2.0.4
  • 存放监控信息表:ggate.gg_check_his

3、监控脚本编写配置

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

#!/usr/bin/ksh

########

##说明

## 本脚本由crontab自动调度,为goldengate日常监控的总调度脚本

## 本脚本作用在于设计各种环境变量、调度采集信息的巡检脚本、将巡检脚本结果录入历史表

########

########

##获取本脚本执行的时间

##此时间用于判定所执行的子脚本以及定义临时文件名

########

export exe_date_d=`date +%y%m%d`

export exe_date_h=`date +%h`

export exe_date_m=`date +%m`

########

##监控对象标识

##现有的监控对象有db01_source、db01_target

########

##db01_source db01_target

export v_iden_str="db01_source"

########

##本监控脚本根目录

########

export mon_home=/ggs/ogg11/gg_mon

########

##goldengate安装目录

########

export ggs_home=/ggs/ogg11

########

##java_agent路径

########

export v_jagent_path="/gg/veragent/agent/javaagent.jar"

########

##待检查的文件系统路径

########

export v_df_path="/oracle/arch"

########

##数据库登陆信息

## tns_admin tns_name r_username r_password 指向存储巡检历史信息的数据库

## oracle_sid l_username l_password 执向本地数据库

## 本地同步用户列表userlist

## 指向生产库的dblink dbl

########

export oracle_base=/oracle/app/oracle

export oracle_home=$oracle_base/product/11.2.0

export ld_library_path=$oracle_home/lib:$ggs_home:/lib:/usr/lib

export nls_lang=american_america.zhs16gbk

export tns_admin=$mon_home

export tns_name="ggmon"

export r_username="ggate"

export r_password="ggate"

export oracle_sid=db01

export l_username="ggate"

export l_password="ggate"

##export dbl=""

##export userlist=""

########

##存放长事务参数

########

#抽取进程名字

export v_extract_name="eitpub01"

#时间

export v_duration="55m"

########

##存放采集信息的表

########

export v_his_table="ggate.gg_check_his"

########

##临时文件

## data_file存储采集回来的结果存放成txt格式

## sql_file存放通过将data_file转换成的sql语句

########

export data_file=$mon_home"/coll_data_"$exe_date_d$exe_date_h$exe_date_m".txt"

export sql_file=$mon_home"/insert_data_"$exe_date_d$exe_date_h$exe_date_m".sql"

cat /dev/null>$data_file

cat /dev/null>$sql_file

########

##定义各个列值

########

export v_coll_type="not define"

export v_coll_name="not define"

export v_coll_value="not collect"

export v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##采集mgr进程信息脚本

########

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

########

##采集er进程信息脚本

## er即extract和replicate进程

## 采集信息包括er进程运行状态以及时间延迟

########

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

########

##采集javaagent进程数脚本

## 采集的是巡检的数据库对应javaagent进程数

########

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

########

##采集discard文件ora-报错脚本

##注意check_discard.sh脚本 discard文件存放的路径不一样需要根据实际环境修改

## 采集的是巡检的数据库对应javaagent进程数

########

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

########

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

## 采集的是文件系统使用率

########

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

########

##采集表空间使用率

## 采集的是数据库表空间使用率

########

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

########

##采集长事务

########

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

##将采集的结果格式转换为sql语句

########

echo "alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';">>$sql_file

echo "select sysdate from dual;">>$sql_file

cat $data_file|awk -v table="$v_his_table" '{print "insert into "table" values('\''"$1"'\'','\''"$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'');"}'>>$sql_file

echo "commit;">>$sql_file

echo "exit;">>$sql_file

########

##将采集的结果录入数据库

########

${oracle_home}/bin/sqlplus -s ${r_username}/${r_password}@${tns_name} @${sql_file}

########

##清理临时文件

########

rm $data_file

rm $sql_file

3.2 采集mgr进程信息

#!/usr/bin/ksh

########

##说明

## 本脚本由collect_gg_info.sh脚本调度,属于goldengate日常监控脚本

## 本脚本作用在于通过goldengate命令确认mgr进程运行状态

########

########

##定义goldengate检查命令

########

cd $ggs_home

echo "info mgr">info_mgr

########

########

##设置各个值

########

v_coll_type="mgr"

v_coll_name="mgr"

v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##采集mgr进程状态

########

cd $ggs_home

v_coll_value=`./ggsci<info_mgr|grep "manager is"|awk '{print $3}'|tr "[a-z]" "[a-z]"`

########

##输出采集结果到data_file文件

########

echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date>>$data_file

3.3 采集er进程信息

#!/usr/bin/ksh

########

##说明

## 本脚本由collect_gg_info.sh脚本调度,属于goldengate日常监控脚本

## 本脚本作用在于通过goldengate命令确认er进程运行状态以及时间延迟信息

## er进程即extract和replicate进程

########

########

##goldengate检查命令

########

cd $ggs_home

echo "info all">info_all

########

##临时文件

## infoer_file存放通过info all命令所获取

########

export infoer_file=$mon_home"/info_er_"$exe_date_d$exe_date_h$exe_date_m".txt"

cat /dev/null>$infoer_file

########

##设置各个值

########

v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##通过info all命令获取进程状态

########

cd $ggs_home

./ggsci<info_all|grep -e "extract|replicat">$infoer_file

########

####输出采集结果到data_file文件

#### 脚本上半部分处理er进程状态、下半部分处理er进程lag信息

########

while read line

do

 ##er status

 v_coll_type="er"

 v_coll_name=`echo $line|awk '{print $3}'`

 v_coll_value=`echo $line|awk '{print $2}'`

 echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date>>$data_file

 ##er lag

 v_coll_type="lag"

 v_coll_name=`echo $line|awk '{print $3}'`

 v_coll_value=`echo $line|awk '{{split ($4,a,":")}{split ($5,b,":")}{print "(("a[1]"+"b[1]")*60+"a[2]"+"b[2]")*60+"a[3]"+"b[3]}}'|bc`

 echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date>>$data_file

done<$infoer_file

########

##清理临时文件

########

rm $infoer_file

3.4 采集javaagent进程信息

#!/usr/bin/ksh

########

##说明

## 本脚本由collect_gg_info.sh脚本调度,属于goldengate日常监控脚本

## 本脚本作用在于通过goldengate命令确认goldengate veridata java agent进程数

########

########

##设置各个值

########

v_coll_type="jagent"

v_coll_name="process_num"

v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##采集java agent进程状态

########

cd $ggs_home

v_coll_value=`ps -ef|grep $v_jagent_path|grep -v grep|wc -l`

########

##输出采集结果到data_file文件

########

echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date>>$data_file

3.5 采集discard文件ora-信息

#!/usr/bin/ksh

########

##说明

## 本脚本由collect_gg_info.sh脚本调度,属于goldengate日常监控脚本

## 本脚本作用在于通过检查goldengate discard日志,统计ora-报错个数

########

########

##goldengate检查命令

########

cd $ggs_home

echo "info all">info_all

########

##临时文件

## ername_file存放当前数据库中goldengate同步进程命名

########

export ername_file=$mon_home"/er_name_"$exe_date_d$exe_date_h$exe_date_m".txt"

cat /dev/null>$ername_file

########

##设置各个值

########

v_coll_type="discard"

v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##通过info all命令获取进程名

########

cd $ggs_home

./ggsci<info_all|grep -e "extract|replicat"|awk '{print $3}'>$ername_file

########

##逐一分析各个进程的discard文件,并输出采集结果到data_file文件

########

cd $ggs_home/dirrpt

for v_coll_name in `cat $ername_file`

do

 #v_coll_value=`cat $(echo ${v_coll_name}.dsc | tr '[a-z]' '[a-z]')|grep ora-|wc -l`

 #自己实验使用下面这条

 v_coll_value=`cat $(echo ${v_coll_name}/${v_coll_name}.dsc | tr '[a-z]' '[a-z]')|grep ora-|wc -l`

 echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date >>$data_file

done

########

##清理临时文件

########

rm $ername_file

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

#!/usr/bin/ksh

########

##说明

## 本脚本由collect_gg_info.sh脚本调度,属于goldengate日常监控脚本

## 本脚本作用主要负责goldengate文件系统

########

##设置各个值

########

v_coll_type="df"

v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##临时文件

## df_file存放当前数据库中goldengate同步进程命名

########

export df_file=$mon_home"/df_"$exe_date_d$exe_date_h$exe_date_m".txt"

cat /dev/null>$df_file

########

##通过df命令获取文件系统使用率

##sed -n '2,$p' 打印第2行到最后一行

########

df -k $v_df_path |sed -n '2,$p'> $df_file

 while read i

do

 v_coll_name=`echo $i|awk '{print $6}'`

 v_coll_value=`echo $i|awk '{print $5}'`

 echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date >> $data_file

done < $df_file

#####删除临时文件

rm -rf $df_file

3.7 采集表空间使用率

#!/usr/bin/ksh

########

##说明

## 本脚本由collect_gg_info.sh脚本调度,属于goldengate日常监控脚本

## 本脚本作用主要监控表空间使用率

########

##设置各个值

########

v_coll_type="tablespace"

v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##临时文件

## tbs_file存放当前数据库中goldengate同步进程命名

########

export tbs_file=$mon_home"/tbs_"$exe_date_d$exe_date_h$exe_date_m".txt"

export tbs_file2=$mon_home"/tbs2_"$exe_date_d$exe_date_h$exe_date_m".txt"

cat /dev/null>$tbs_file

########

##通过sql命令获取表空间使用率

########

${oracle_home}/bin/sqlplus -s -l / as sysdba << eof  > $tbs_file

set lin 200 pagesize 1000

set heading off

col use_precent for 999.99

select 'tbs_to_grep' grep,b.tablespace_name,round(sum(b.bytes)/1024/1024,0) sum_mb, round(sum(nvl(a.bytes,0))/1024/1024,0) free_mb,

 to_char(round((sum(b.bytes)-sum(nvl(a.bytes,0)))/sum(b.bytes),4)*100,'990.00') use_precent

from (select tablespace_name,file_id,sum(bytes) bytes from dba_free_space group by tablespace_name,file_id ) a,

 dba_data_files b

where a.file_id(+)=b.file_id and a.tablespace_name(+)=b.tablespace_name

group by b.tablespace_name

order by 4;

eof

cat $tbs_file|grep tbs_to_grep>$tbs_file2

########

##将结果录入datafile

########

 while read i

do

 v_coll_name=`echo $i|awk '{print $2}'`

 v_coll_value=`echo $i|awk '{print $5}'`

 echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date >> $data_file

done < $tbs_file2

#####删除临时文件

rm -rf $tbs_file

rm -rf $tbs_file2

3.8 采集长事务信息

########

##说明

## 本脚本由collect_gg_info.sh脚本调度,属于goldengate日常监控脚本

## 本脚本作用在于通过goldengate命令检查长事务进程个数

########

########

##定义goldengate检查命令

########

cd $ggs_home

echo "send "$v_extract_name",showtrans duration "$v_duration>show_trans

########

########

##设置各个值

########

v_coll_type="longtrans"

v_coll_name="process_num"

v_coll_date=`date +%y'-'%m'-'%d':'%h':'%m':'%s`

########

##获取长事务数量

########

cd $ggs_home

v_coll_value=`./ggsci<show_trans|grep "xid:"|wc -l`

########

##输出采集结果到data_file文件

########

echo $v_iden_str" "$v_coll_type" "$v_coll_name" "$v_coll_value" "$v_coll_date>>$data_file

4、ogg源端目标端配置采集脚本定时任务

配置定时任务

####goldengate日常运行状态采集脚本

0,5,10,15,20,25,30,35,40,45,50,55 * * * * sh /ggs/ogg11/gg_mon/collect_gg_info.sh 1>/ggs/ogg11/gg_mon/collect_gg_info.sh.out 2>&1

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

create tablespace "ggate"

logging

datafile '/u01/oradata/db01/ggate01.dbf' size 50m

autoextend off;

create table ggate.gg_check_his(

 iden_str varchar2(20),

 coll_type varchar2(20),

 coll_name varchar2(20),

 coll_value varchar2(50),

 coll_date date

) tablespace ggate;

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

#!/usr/bin/ksh

#####shell for display the alert and ok informations

#####add by 2020/02/15

#####define enviroment

exe_date_h=`date +%h`

exe_date_m=`date +%m`

##文件系统使用率85% 表空间使用率95% 时间延迟15%

df_lim=85

tbs_lim=95

lag_lim=15

##定义是否报告正常信息

if_report_dis="no"

if_report_long="no"

if_report_jagent="no"

if_report_struct="no"

if [ $exe_date_h == 08 -o $exe_date_h == 17 ]

 then

 if_report_dis="yes"

 if_report_jagent="yes"

 if_report_struct="yes"

fi

if [ $exe_date_m -ge 0 -a $exe_date_m -lt 5 ]

 then

 if_report_long="yes"

fi

echo "###############################excute start time: `date` ##############################">> send_mail_msg

#. $home/.profile

export oracle_sid=db01

monitor_home=/home/oracle/testmon

#####define identifier

db01_source="(生产中心|db_name: db01|ip: 192.168.1.50 |gg_home: /ggs/ogg11/gg_mon)"

db01_target="(灾备中心|db_name: db01|ip: 192.168.1.51 |gg_home: /ggs/ogg11/gg_mon)"

iden="db01_source db01_target"

#####创建临时表,相关临时表存储最近一次采集的信息

sqlplus -s -l / as sysdba <<eof >create_tmp_table.tmp

drop table ggate.gg_check_his_temp;

create table ggate.gg_check_his_temp as

select * from ggate.gg_check_his

where coll_date between sysdate-1/24/60*5 and sysdate;

eof

#####辨别主机采集是否正常,若异常则输出

sqlplus -s -l / as sysdba <<eof > host_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

 col coll_value for a20

select iden_str from ggate.gg_check_his_temp group by iden_str having count(distinct coll_type)>7;

eof

cd $monitor_home

cat /dev/null>host_info

cat /dev/null>host_all

if [ `cat host_info_sql.tmp|wc -l` -eq 2 ]

then

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上各采集进程运行正常。" >>ggmon.log

else

 cat /dev/null>host.tmp

 for i in $iden

 do

 echo $i>>host.tmp

 done

 cat host.tmp|sort -u>host_all

 rm host.tmp

 cat host_info_sql.tmp |sort -u > host_info

 diff host_all host_info|grep '^<'|awk '{print $nf}' > no_collect_info.tmp

 while read i

do

 case $i in

 db01_source) echo "warning "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" goldengate日常运行状态采集脚本存在异常。${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "warning "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" goldengate日常运行状态采集脚本存在异常。${db01_target}" >> ggmon.log

 ;;

 *) exit

 ;;

 esac

 done < no_collect_info.tmp

 fi

#######下面是根据标识符从数据库获取信息

#######mode1#######各主机获取goldengate进程信息

sqlplus -s -l / as sysdba << eof >pro_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

 col coll_value for a20

select iden_str,coll_type,coll_name,coll_value,to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp where coll_type in ('mgr','er') order by 1,2,3,4;

eof

#####过滤进程信息

cd $monitor_home

cat /dev/null>pro_ok.tmp

cat /dev/null>pro_warning.tmp

cat /dev/null>mail_msg_pro_warning.tmp

while 

 read i

 do

 if [ "`echo $i|awk '{print $4}'`"x == "running"x ]

 then

 echo $i >> pro_ok.tmp

 else

 echo $i >> pro_warning.tmp

 fi

 done < pro_info_sql.tmp

#####1#####过滤生成进程运行信息

###goldengate 进程正常,输出信息

 if [ -s $monitor_home/pro_warning.tmp ]

 then

 cat pro_warning.tmp > mail_msg_pro_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "error "$5" "$6" goldengate进程状态异常,名字:"$3",状态:"$4"。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

 db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_pro_warning.tmp

 else

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上各goldengate进程状态正常。" >>ggmon.log

 fi

######mode2######

###监控discard文件是否有ora-报错

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

#获取discard文件信息

sqlplus -s -l / as sysdba << eof >ora_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

 col coll_value for a20

select iden_str,coll_type,coll_name,coll_value,to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp

where coll_type='discard' order by 1,2,3,4;

eof

#过滤ora信息

cd $monitor_home

cat /dev/null>ora_ok.tmp

cat /dev/null>ora_warning.tmp

while 

 read i

 do

 if [ `echo $i|awk '{print $4}'` -eq 0 ]

 then

 echo $i >> ora_ok.tmp

 else

 echo $i >> ora_warning.tmp

 fi

 done < ora_info_sql.tmp

#生成邮件信息

if [ -s $monitor_home/ora_warning.tmp ]

 then

 cat ora_warning.tmp > mail_msg_ora_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "warning "$5" "$6" goldengate进程discard文件报错,名字:"$3",数量:"$4"。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

 db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_ora_warning.tmp

 else

 if [ $if_report_dis == "yes" ]

 then

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上各goldengate进程discard文件正常。" >>ggmon.log

 fi

fi

######mode3######

###监控进程延迟

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

#获取延迟信息

sqlplus -s -l / as sysdba << eof >lag_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

select iden_str,coll_type,coll_name,round(coll_value/60,0) ,to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp

where coll_type ='lag' order by 1,2,3,4;

eof

#过滤延迟信息

cd $monitor_home

cat /dev/null>lag_ok.tmp

cat /dev/null>lag_warning.tmp

cat /dev/null>mail_msg_lag_warning.tmp

while 

 read i

 do

 if [ `echo $i|awk '{print $4}'` -lt $lag_lim ]

 then

 echo $i >> lag_ok.tmp

 else

 echo $i >> lag_warning.tmp

 fi

 done < lag_info_sql.tmp

#生成邮件信息

 if [ -s $monitor_home/lag_warning.tmp ]

 then

 cat lag_warning.tmp > mail_msg_lag_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "warning "$5" "$6" goldengate进程存在时间延迟,名字:"$3",分钟:"$4"。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

 db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_lag_warning.tmp

 else

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上各goldengate进程时间延迟均在"$lag_lim"分钟内。" >>ggmon.log         

 fi

######mode4######

###监控长事务

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

#获取各长事务信息

sqlplus -s -l / as sysdba << eof >long_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

 col coll_value for a20

select iden_str,coll_type,coll_name, coll_value,to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp

 where coll_type ='longtrans' order by 1,2,3,4;

eof

#过滤文系统信息

cd $monitor_home

cat /dev/null>long_ok.tmp

cat /dev/null>long_warning.tmp

cat /dev/null>mail_msg_long_warning.tmp

while 

 read i

 do

 if [ ` echo $i|awk '{print $4}'` -eq 0 ]

 then

 echo $i >> long_ok.tmp

 else

 echo $i >> long_warning.tmp

 fi

 done < long_info_sql.tmp

#生成邮件信息

 if [ -s $monitor_home/long_warning.tmp ]

 then

 cat long_warning.tmp > mail_msg_long_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "warning "$5" "$6" goldengate进程监测到长事务,名字:"$3",数量:"$4"。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

 db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_long_warning.tmp

 else

 if [ $if_report_long == "yes" ]

 then

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心上各goldengate进程对应数据库均无长事务。" >>ggmon.log

 fi

 fi

######mode5######

###监控数据库表空间

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

#获取各表空间使用率信息

sqlplus -s -l / as sysdba << eof >tb_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

select iden_str,coll_type,coll_name, round(coll_value,0),to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp

where coll_type ='tablespace' order by 1,2,3,4;

eof

#过滤各表空间使用率信息

cd $monitor_home

cat /dev/null>tb_ok.tmp

cat /dev/null>tb_warning.tmp

cat /dev/null>mail_msg_tb_warning.tmp

while 

 read i

 do

 if [ `echo $i|awk '{print $4}'` -le $tbs_lim ]

 then

 echo $i >> tb_ok.tmp

 else

 echo $i >> tb_warning.tmp

 fi

 done < tb_info_sql.tmp

#生成邮件信息

 if [ -s $monitor_home/tb_warning.tmp ]

 then

 cat tb_warning.tmp > mail_msg_tb_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "warning "$5" "$6" 数据库表空间使用率过高,名字:"$3",使用率:"$4"。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

  db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_tb_warning.tmp

 else

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上各数据库表空间使用率正常。" >>ggmon.log

 fi

######mode6######

###监控文件系统

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

#获取各文件系统使用率信息

sqlplus -s -l / as sysdba << eof >df_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

 col coll_value for a20

select iden_str,coll_type,coll_name, coll_value,to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp

where coll_type='df' order by 1,2,3,4;

eof

#过滤文件使用率信息

cd $monitor_home

cat /dev/null>df_ok.tmp

cat /dev/null>df_warning.tmp

cat /dev/null>mail_msg_df_warning.tmp

while 

 read i

 do

 if [ `echo $i|awk '{print $4}'|awk -f % '{print $1}'` -le $df_lim ]

 then

 echo $i >> df_ok.tmp

 else

 echo $i >> df_warning.tmp

 fi

 done < df_info_sql.tmp

#生成邮件信息

 if [ -s $monitor_home/df_warning.tmp ]

 then

 cat df_warning.tmp > mail_msg_df_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "warning "$5" "$6" 文件系统使用率过高,名字:"$3",使用率:"$4"。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

 db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_df_warning.tmp

 else

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上各文件系统使用率正常。" >>ggmon.log

 fi

#####mode7######

###监控veridata java进程

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

#获取jagent文件信息

sqlplus -s -l / as sysdba << eof >java_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

 col coll_value for a20

select iden_str,coll_type,coll_name,coll_value,to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp 

where coll_type ='jagent' order by 1,2,3,4;

eof

#过滤jagent信息

cd $monitor_home

cat /dev/null>java_ok.tmp

cat /dev/null>java_warning.tmp

cat /dev/null>mail_msg_java_warning.tmp

while 

 read i

 do

 if [ `echo $i|awk '{print $4}'` -eq 1 ]

 then

 echo $i >> java_ok.tmp

 else

 echo $i >> java_warning.tmp

 fi

 done < java_info_sql.tmp

#生成邮件信息

if [ -s $monitor_home/java_warning.tmp ]

 then

 cat java_warning.tmp > mail_msg_java_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "error "$5" "$6" goldengate veridata java agent没有启动。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

 db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_java_warning.tmp

 else

 if [ $if_report_jagent == "yes" ]

 then

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上goldengate veridata java agent正常。" >>ggmon.log

 fi

 fi

#########mode 8 ############

####监控灾备与主库对比情况

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

sqlplus -s -l / as sysdba << eof >object_info_sql.tmp

 set serveroutput off

 set pagesize 2000

 set linesize 1000

 set feedback off

 set heading off

 set newpage none

 set term off

 set trims on

 set trim on

 col coll_type for a10

 col coll_value for a20

select iden_str,coll_type,coll_name, coll_value,to_char(coll_date,'yyyy-mm-dd hh24:mi:ss') from ggate.gg_check_his_temp

 where coll_type='object' order by 1,2,3,4;

eof

#过滤文系统信息

cd $monitor_home

cat /dev/null>object_ok.tmp

cat /dev/null>object_warning.tmp

cat /dev/null>mail_msg_object_warning.tmp

while 

  read i

 do

 if [ `echo $i|awk '{print $4}'` -eq 0 ]

 then

 echo $i >> object_ok.tmp

 else

 echo $i >> object_warning.tmp

 fi

 done < object_info_sql.tmp

#生成邮件信息

 if [ -s $monitor_home/object_warning.tmp ]

 then

 cat object_warning.tmp > mail_msg_object_warning.tmp

while read line

do

 veritify_col=`echo $line |awk '{print "warning "$5" "$6" 数据库结构不一致,类型:"$3",数量:"$4"。"}'`

 veritify=`echo $line |awk '{print $1}'`

 case $veritify in

 db01_source) echo "${veritify_col}${db01_source}" >> ggmon.log

 ;;

 db01_target) echo "${veritify_col}${db01_target}" >> ggmon.log

 ;;

 *)

 ;;

 esac

 done < mail_msg_object_warning.tmp

 else

 if [ $if_report_struct == "yes" ]

 then

 echo "info "`date +%y'-'%m'-'%d' '%h':'%m':'%s`" 生产中心以及灾备中心上结构对比正常。" >>ggmon.log

 fi

 fi

#########mode end###########

####生成正式邮件文本

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

cat *ok > send_mail_msg.tmp.ok

cat ggmon.log >> send_mail_msg.tmp

#如果 file 存在且大小不为0

if [ -s $monitor_home/send_mail_msg.tmp ]

then

 cat send_mail_msg.tmp >> send_mail_msg

 else

 cat send_mail_msg.tmp.ok >> send_mail_msg

 fi

###清理临时文件

cd $monitor_home

 rm -rf *tmp

 rm -rf *ok

 rm -rf mail*

 echo "###############################excute end time: `date` ##############################">> send_mail_msg

echo "                                                                                ">> send_mail_msg

7、运行结果

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

error 2020-02-21 02:03:32 goldengate veridata java agent没有启动。(生产中心|db_name: db01|ip: 192.168.1.50 |gg_home: /ggs/ogg11/gg_mon)

warning 2020-02-21 02:03:32 goldengate进程discard文件报错,名字:ritpub10,数量:2。(生产中心|db_name: db01|ip: 192.168.1.50 |gg_home: /ggs/ogg11/gg_mon)

warning 2020-02-21 02:05:01 goldengate进程discard文件报错,名字:ritpub10,数量:2。(生产中心|db_name: db01|ip: 192.168.1.50 |gg_home: /ggs/ogg11/gg_mon)

warning 2020-02-21 02:03:32 goldengate进程存在时间延迟,名字:pitpub01,分钟:16334。(生产中心|db_name: db01|ip: 192.168.1.50 |gg_home: /ggs/ogg11/gg_mon)

warning 2020-02-21 02:03:32 数据库表空间使用率过高,名字:system,使用率:97。(生产中心|db_name: db01|ip: 192.168.1.50 |gg_home: /ggs/ogg11/gg_mon)

warning 2020-02-21 02:01:42 数据库表空间使用率过高,名字:system,使用率:100。(灾备中心|db_name: db01|ip: 192.168.1.51 |gg_home: /ggs/ogg11/gg_mon)

warning 2020-02-21 02:05:01 数据库表空间使用率过高,名字:system,使用率:100。(灾备中心|db_name: db01|ip: 192.168.1.51  |gg_home: /ggs/ogg11/gg_mon)

warning 2020-02-21 02:03:29 数据库表空间使用率过高,名字:system,使用率:100。(灾备中心|db_name: db01|ip: 192.168.1.51 |gg_home: /ggs/ogg11/gg_mon)

info 2020-02-21 03:26:01 生产中心以及灾备中心上各goldengate进程状态正常。

info 2020-02-21 03:26:01 生产中心以及灾备中心上各goldengate进程时间延迟均在15分钟内。

info 2020-02-21 03:26:01 生产中心以及灾备中心上各数据库表空间使用率正常。

info 2020-02-21 03:26:01 生产中心以及灾备中心上各文件系统使用率正常。

8、总结

监控脚本项目架构采用模块化,思路清晰明了,每个监控指标都是单独一个脚本,便于修改,移植,调试。

前期部署调试好后,后期人工介入的时间很少,定时检查同步状态和日志状态,后期可以加入自动发送短信和邮件的功能,极大方便我们的日常维护。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com