ORACLE GOLDENGATE監(jiān)控腳本方式
ORACLE GOLDENGATE MONITOR
1、背景
很多需要使用Oracle Godengate來進行容災,雖然Oracle官方有自己的OGG監(jiān)控產品和數據對比產品,如GoldenGate Veridata、GoldenGate Director,但是由于其是需要單獨收費的,且安裝操作使用復雜,于是開發(fā)了適應客戶需求的監(jiān)控腳本。
2、環(huán)境信息
Oracle Goldengate 環(huán)境:
- 源端 DB01_SOURCE 192.168.1.50
- 目標端 DB01_TARGET 192.168.1.51
- OGG版本: ogg11g
- 數據庫版本:Oracle 11.2.0.4
監(jiān)控服務器
- DB0Monitor 192.168.1.16
- 數據庫版本:Oracle 11.2.0.4
- 存放監(jiān)控信息表:ggate.gg_check_his
3、監(jiān)控腳本編寫配置
3.1 GoldenGate日常監(jiān)控的總調度腳本
#!/usr/bin/ksh
########
##說明
## 本腳本由crontab自動調度,為GoldenGate日常監(jiān)控的總調度腳本
## 本腳本作用在于設計各種環(huán)境變量、調度采集信息的巡檢腳本、將巡檢腳本結果錄入歷史表
########
########
##獲取本腳本執(zhí)行的時間
##此時間用于判定所執(zhí)行的子腳本以及定義臨時文件名
########
export EXE_DATE_D=`date +%Y%m%d`
export EXE_DATE_H=`date +%H`
export EXE_DATE_M=`date +%M`
########
##監(jiān)控對象標識
##現(xiàn)有的監(jiān)控對象有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"
########
##數據庫登陸信息
## TNS_ADMIN TNS_NAME R_USERNAME R_PASSWORD 指向存儲巡檢歷史信息的數據庫
## ORACLE_SID L_USERNAME L_PASSWORD 執(zhí)向本地數據庫
## 本地同步用戶列表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進程運行狀態(tài)以及時間延遲
########
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文件存放的路徑不一樣需要根據實際環(huán)境修改
## 采集的是巡檢的數據庫對應JavaAgent進程數
########
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 $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日常監(jiān)控腳本
## 本腳本作用在于通過GoldenGate命令確認MGR進程運行狀態(tài)
########
########
##定義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進程狀態(tài)
########
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日常監(jiān)控腳本
## 本腳本作用在于通過GoldenGate命令確認ER進程運行狀態(tài)以及時間延遲信息
## 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命令獲取進程狀態(tài)
########
cd $GGS_HOME
./ggsci<INFO_ALL|grep -E "EXTRACT|REPLICAT">$INFOER_FILE
########
####輸出采集結果到DATA_FILE文件
#### 腳本上半部分處理ER進程狀態(tài)、下半部分處理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日常監(jiān)控腳本 ## 本腳本作用在于通過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進程狀態(tài) ######## 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日常監(jiān)控腳本
## 本腳本作用在于通過檢查GoldenGate Discard日志,統(tǒng)計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 采集文件系統(tǒng)目錄使用率
#!/usr/bin/ksh
########
##說明
## 本腳本由collect_gg_info.sh腳本調度,屬于GoldenGate日常監(jiān)控腳本
## 本腳本作用主要負責GoldenGate文件系統(tǒng)
########
##設置各個值
########
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命令獲取文件系統(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
#####刪除臨時文件
rm -rf $DF_FILE
3.7 采集表空間使用率
#!/usr/bin/ksh
########
##說明
## 本腳本由collect_gg_info.sh腳本調度,屬于GoldenGate日常監(jiān)控腳本
## 本腳本作用主要監(jiān)控表空間使用率
########
##設置各個值
########
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日常監(jiān)控腳本 ## 本腳本作用在于通過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日常運行狀態(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)控服務器準備存儲采集信息的表
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)控服務器配置告警腳本
#!/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% 時間延遲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"
#####創(chuàng)建臨時表,相關臨時表存儲最近一次采集的信息
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日常運行狀態(tài)采集腳本存在異常。${DB01_SOURCE}" >> ggmon.log
;;
DB01_TARGET) echo "WARNING "`date +%Y'-'%m'-'%d' '%H':'%M':'%S`" GoldenGate日常運行狀態(tài)采集腳本存在異常。${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進程狀態(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`" 生產中心以及災備中心上各GoldenGate進程狀態(tài)正常。" >>ggmon.log
fi
######Mode2######
###監(jiān)控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######
###監(jiā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
#過濾延遲信息
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######
###監(jiān)控長事務
##################
#獲取各長事務信息
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
#過濾文系統(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進程監(jiān)測到長事務,名字:"$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######
###監(jiān)控數據庫表空間
##################
#獲取各表空間使用率信息
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######
###監(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
#過濾文件使用率信息
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)使用率過高,名字:"$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`" 生產中心以及災備中心上各文件系統(tǒng)使用率正常。" >>ggmon.log
fi
#####Mode7######
###監(jiān)控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 ############
####監(jiān)控災備與主庫對比情況
#############################
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
#過濾文系統(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" 數據庫結構不一致,類型:"$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、運行結果
當有異常時候就會通過告警發(fā)送出來。
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進程狀態(tài)正常。 INFO 2020-02-21 03:26:01 生產中心以及災備中心上各GoldenGate進程時間延遲均在15分鐘內。 INFO 2020-02-21 03:26:01 生產中心以及災備中心上各數據庫表空間使用率正常。 INFO 2020-02-21 03:26:01 生產中心以及災備中心上各文件系統(tǒng)使用率正常。
8、總結
監(jiān)控腳本項目架構采用模塊化,思路清晰明了,每個監(jiān)控指標都是單獨一個腳本,便于修改,移植,調試。
前期部署調試好后,后期人工介入的時間很少,定時檢查同步狀態(tài)和日志狀態(tài),后期可以加入自動發(fā)送短信和郵件的功能,極大方便我們的日常維護。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Oracle數據庫安裝教程并實現(xiàn)公網遠程連接(內網穿透)
Oracle數據庫是用于處理數據存儲及大量數據計算的常用數據庫,下面這篇文章主要給大家介紹了關于Oracle數據庫安裝教程并實現(xiàn)公網遠程連接(內網穿透)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06
Oracle9i的全文檢索技術開發(fā)者網絡Oracle
Oracle9i的全文檢索技術開發(fā)者網絡Oracle...2007-03-03
windows環(huán)境下重建oracle監(jiān)聽方式
文章描述了數據庫監(jiān)聽啟動失敗的解決過程,包括修改listenr.ora文件、啟動監(jiān)聽、配置tnsnames.ora內容和注冊服務2026-01-01

