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、总结
监控脚本项目架构采用模块化,思路清晰明了,每个监控指标都是单独一个脚本,便于修改,移植,调试。
前期部署调试好后,后期人工介入的时间很少,定时检查同步状态和日志状态,后期可以加入自动发送短信和邮件的功能,极大方便我们的日常维护。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论