ページの先頭行へ戻る
Linkexpress Replication optionV5.0L27 導入運用ガイド

H.4.4 DR_ONLINE_RCV4.sh

事前に用意するDR_ONLINE_RCV4.shについて説明します。

[名称]

複写先システムのRLP環境とデータベースの復旧

[形式]

DR_ONLINE_RCV4.sh

[機能説明]

複写先システムのRDBディクショナリを復旧し、すべてのユーザロググループのRDBディレクトリファイルを復旧します。
監査ログデータベース運用を行っている場合は、監査ログデータベースを一旦削除し再作成します。
スケーラブルディレクトリ運用の場合は、SET SYSTEM PARAMETER文で、監査ログの取得範囲や監査ログデータベースが満杯時の対処方法を設定したDDL文を作成し定義します。
ロググループに存在するDSIごとにDSIを復旧します。
RLP環境を復旧し、複写先システムのRERUNログの取得開始とDRレプリケーション業務の起動を行います。

[注意事項]

[復帰値]

0:正常終了

0以外:異常終了

[スクリプト内容]

本シェルスクリプトの内容を以下に示します。

#!/bin/sh
PATH=/opt/FJSVrdb2b/bin:/opt/FJSVrdb2b/sbin:/opt/FJSVlnkexp/bin:/opt/FJSVlnkre/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin;export PATH
LD_LIBRARY_PATH=/opt/FJSVrdb2b/lib:/opt/FJSVlnkre/lib;export LD_LIBRARY_PATH

CUR=$PWD
source ${CUR}/DR_ONLINERCV_ENV.def
source /opt/FJSVlnkre/sbin/lxrepdrcom.sh

#
# Define
#
INSTPATH="/opt/FJSVrdb2b"
DELMNDBALL_FLG=0
WKADTFILE=${WORKPATH}/dr_dbcopy_${RDBNAME:='RDBII'}_adt.$$.wk;export WKADTFILE
WKFILE=${WORKPATH}/dr_dbcopy_${RDBNAME:='RDBII'}.$$.wk;export WKFILE
ERRFILE=${WORKPATH}/dr_dbcopy_${RDBNAME:='RDBII'}.$$.err;export ERRFILE

#
# Recovery of RLP
#
for DRREP_DEFFILE_TMP in ${DRREP_DEFFILE_LIST[@]}
do
	DRREP_DEFFILE=`echo ${DRREP_DEFFILE_TMP} | cut -f 1 -d ","`
	RLPNAME=`echo ${DRREP_DEFFILE_TMP} | cut -f 2 -d ","`

	lxrepdrrlp -V -O -p ${RLPNAME} > ${WKFILE} 2>&1
	if [ $? -eq 0 ]; then
		RLP_MODE=`grep "Online/Offline" ${WKFILE} | awk '{print $3}'`
		if [ "${RLP_MODE}" = "build" -o "${RLP_MODE}" = "online" ]; then
			lxrepdrrlp -V -D -p ${RLPNAME} > ${WKFILE} 2> /dev/null
			if [ $? -eq 0 ]; then
				RLC_FIN_PATH=`tail -n 2 ${WKFILE} | head -n 1 | awk '{print $2}'`
				if [ -f ${RLC_FIN_PATH} ]; then
					rm ${WKFILE}
					continue
				fi
			fi
		fi
	else
		grep "qdg20230u" ${WKFILE} > /dev/null 2>&1
		if [ $? -eq 0 ]; then
			RLPDEF_FILE="`get_parameter ${DRREP_DEFFILE} RLPDEF`"
			RLM_OWN_SEND_DEVICE="`get_parameter ${RLPDEF_FILE} RLM_OWN_SEND_DEVICE`"
			rm ${RLM_OWN_SEND_DEVICE} > /dev/null 2>&1
			
			RLM_OWN_RECV_DEVICE="`get_parameter ${RLPDEF_FILE} RLM_OWN_RECV_DEVICE`"
			rm ${RLM_OWN_RECV_DEVICE} > /dev/null 2>&1
			
			RLC_NUM="`get_parameter ${RLPDEF_FILE} RLC_NUM`"
			i=1
			while [ ${i} -le ${RLC_NUM} ]
			do
				RLC_OWN_DEVICE="`get_parameter ${RLPDEF_FILE} RLC_OWN_DEVICE${i}`"
				rm ${RLC_OWN_DEVICE} > /dev/null 2>&1
				i=$(( i + 1 ))
			done
		fi
	fi
	rm ${WKFILE} > /dev/null 2>&1
	lxrepdrrlpcr -p ${RLPNAME} -G -k reflect -d ${DRREP_DEFFILE}
	if [ $? -ne 0 ]; then
		echo "ERROR: lxrepdrrlpcr -G (RLPname:${RLPNAME}) is failed."
		exit 1
	fi
done

#
# check rdb
#
rdbpid > /dev/null 2>&1
if [ $? -eq 0 ]; then
	rdbstop
	if [ $? -ne 0 ]; then
		echo "ERROR: RDB is active."
		exit 1
	fi
	sleep 1
fi

#
# do rdbrcvdic
#
if [ ! -f ${DIC_BK_DEV}/${RDBNAME:='RDBII'}.dicback.bk ]; then
	rdbrcvdic -L -f ${RDBNAME:='RDBII'}.dicback@${DIC_BK_DEV} -ddl
	if [ $? -ne 0 ]; then
		echo "ERROR: rdbrcvdic is failed."
		exit 1
	else
		mv ${DIC_BK_DEV}/${RDBNAME:='RDBII'}.dicback ${DIC_BK_DEV}/${RDBNAME:='RDBII'}.dicback.bk
		if [ $? -ne 0 ]; then
			echo "mv command is failed. Check the status of directory (${DIC_BK_DEV})."
			echo "Please execute the following command manually, and then re-run the script:"
			echo "\$ mv ${DIC_BK_DEV}/${RDBNAME:='RDBII'}.dicback ${DIC_BK_DEV}/${RDBNAME:='RDBII'}.dicback.bk"
			exit 1
		fi
	fi
fi

#
# Recovery for RDB Direvtory File
#
i=0
for RDBDIR in ${RDBDIR_LIST[@]}
do
	if [ "${LOGGRP_NAME}" == "system" ]; then
		i=$(( i + 1 ))
		continue
	fi

	LOGGRP_NAME=`echo $RDBDIR | cut -f 2 -d ","`
	RDBDIRFILE_PATH=`echo $RDBDIR | cut -f 1 -d ","`

	rdbscldir -A -g ${LOGGRP_NAME} ${RDBDIRFILE_PATH} > ${ERRFILE} 2>&1
	if [ $? -ne 0 ]; then
		grep "qdg13271u" ${ERRFILE} > /dev/null 2>&1
		if [ $? -ne 0 ]; then
			cat ${ERRFILE}
			echo "ERROR: rdbscldir (Loggroup name:${LOGGRP_NAME}) is failed."
			rm ${ERRFILE}
			exit 1
		fi
	fi
	rm ${ERRFILE}
	
	ls ${DSI_BK_DEV}/${LOGGRP_NAME}-*.dsiback.bk > /dev/null 2>&1
	if [ $? -ne 0 ]; then
		rdbrcvdic -L -ddl -g ${LOGGRP_NAME}
		if [ $? -ne 0 ]; then
			echo "ERROR: rdbrcvdic (Loggroup name:${LOGGRP_NAME}) is failed."
			exit 1
		fi
	fi

	i=$(( i + 1 ))

done

#
# rdbstart
#
rdbstart
if [ $? -ne 0 ]; then
	echo "ERROR: RDB is not active."
	exit 1
fi
sleep 1

#
# Get Loggroup List and RDB Directory PATH
#
LOGGRP_LST=( `ls ${ARC_BK_DEV}/${RDBNAME:='RDBII'}-*.arcback_* | rev | cut -f 1 -d "/" | rev | cut -f 2 -d "-" | cut -f 1 -d "." | sort | uniq` )

#
# Recovery Audit Log
#
rdblog -V -I | grep "^\#RDBII_ADTLOG\#" > /dev/null 2>&1
if [ $? -eq 0 ]; then
	rdbaudit -d

	if [ "${ADTDB_RAW_DEV}" != "" ]; then
		rdbaudit -c -n ${ADT_ELEMENT_NUM} -s ${ADT_ELEMENT_SIZE} -r ${ADTDB_RAW_DEV}
	else
		rdbaudit -c -n ${ADT_ELEMENT_NUM} -s ${ADT_ELEMENT_SIZE} -f ${ADTDB_FILE_PATH}
	fi
	if [ $? -ne 0 ]; then
		echo "ERROR: rdbaudit is failed."
		exit 1
	fi

	rdbscldir -V > /dev/null 2>&1
	if [ $? -eq 0 ]; then
		echo "SET SYSTEM PARAMETER" > ${WKADTFILE}
		if [ "${AUDIT_SESSION_SUCCESS}" != "" ]; then
			echo "AUDIT_SESSION_SUCCESS=${AUDIT_SESSION_SUCCESS}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_SESSION_FAIL}" != "" ]; then
			echo "AUDIT_SESSION_FAIL=${AUDIT_SESSION_FAIL}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_ACCESS_SUCCESS}" != "" ]; then
			echo "AUDIT_ACCESS_SUCCESS=${AUDIT_ACCESS_SUCCESS}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_ACCESS_FAIL}" != "" ]; then
			echo "AUDIT_ACCESS_FAIL=${AUDIT_ACCESS_FAIL}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_SQL}" != "" ]; then
			echo "AUDIT_SQL=${AUDIT_SQL}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_SQLBIND}" != "" ]; then
			echo "AUDIT_SQLBIND=${AUDIT_SQLBIND}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_MANAGE}" != "" ]; then
			echo "AUDIT_MANAGE=${AUDIT_MANAGE}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_ERROR}" != "" ]; then
			echo "AUDIT_ERROR=${AUDIT_ERROR}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT}" != "" ]; then
			echo "AUDIT=${AUDIT}," >> ${WKADTFILE}
		fi
		if [ "${AUDIT_LOG_FULL}" != "" ]; then
			echo "AUDIT_LOG_FULL=${AUDIT_LOG_FULL}," >> ${WKADTFILE}
		fi
		sed -i -e "$ s/,/;/g" ${WKADTFILE}
		if [ `wc -l ${WKADTFILE} | awk '{print $1}'` -gt 1 ]; then
			rdbddlex ${WKADTFILE}
			if [ $? -ne 0 ]; then
				echo "ERROR: SET SYSTEM PARAMETER is failed."
				rm ${WKADTFILE}
				exit 1
			fi
		fi

		rm ${WKADTFILE}
	fi
fi

#
# Recovery DSI
#
for LOGGRP_NAME in ${LOGGRP_LST[@]}
do
	i=1
	unset ARC_CMD_LINE
	ARC_FILE_NO_LIST=( `ls ${ARC_BK_DEV}/${RDBNAME:='RDBII'}-${LOGGRP_NAME}.arcback_* | rev | cut -f 1 -d "/" | rev | cut -f 2 -d "_" | sort -n` )
	for ARC_FILE_NO in ${ARC_FILE_NO_LIST[@]}
	do
		ARC_FILE_NAME="${RDBNAME:='RDBII'}-${LOGGRP_NAME}.arcback_${ARC_FILE_NO}"
		if [ ${i} -eq ${#ARC_FILE_NO_LIST[@]} ]; then
			ARC_CMD_LINE="${ARC_CMD_LINE}${ARC_FILE_NAME}@${ARC_BK_DEV}"
		else
			ARC_CMD_LINE="${ARC_CMD_LINE}${ARC_FILE_NAME}@${ARC_BK_DEV}:"
		fi
		i=$(( i + 1 ))
	done

	ls ${DSI_BK_DEV}/${LOGGRP_NAME}-*.dsiback > /dev/null 2>&1
	if [ $? -ne 0 ]; then
		continue
	fi
	DSI_BK_LIST=( `ls ${DSI_BK_DEV}/${LOGGRP_NAME}-*.dsiback` )
	for DSI_BK_PATH in ${DSI_BK_LIST[@]}
	do
		DSI_BK_FILE_NAME=`basename ${DSI_BK_PATH}`
		DB_NAME=`echo ${DSI_BK_FILE_NAME} | cut -f 2 -d "-"`
		DSI_NAME=`echo ${DSI_BK_FILE_NAME} | cut -f 1 -d "." | cut -f 3 -d "-"`
		
		rdbrcv -F -i ${DB_NAME}.${DSI_NAME} -f ${DSI_BK_FILE_NAME}@${DSI_BK_DEV} -a ${ARC_CMD_LINE} -w ${WORKPATH} -E ${RCV_P_NAME}
		if [ $? -ne 0 ]; then
			echo "ERROR: rdbrcv is failed."
			exit 1
		else
			mv ${DSI_BK_DEV}/${DSI_BK_FILE_NAME} ${DSI_BK_DEV}/${DSI_BK_FILE_NAME}.bk
			if [ $? -ne 0 ]; then
				echo "mv command is failed. Check the status of directory (${DSI_BK_DEV})."
				echo "Please execute the following command manually, and then re-run the script:"
				echo "\$ mv ${DSI_BK_DEV}/${DSI_BK_FILE_NAME} ${DSI_BK_DEV}/${DSI_BK_FILE_NAME}.bk"
				exit 1
			fi
		fi
	done
done


#
# Delete BCMNDB
#
case X${RDBNAME} in
X)
	SYSCONFIG=${INSTPATH}/etc/rdbsysconfig
	;;
*)
	SYSCONFIG=${INSTPATH}/etc/${RDBNAME}.cfg
	;;
esac

BCENV="`get_parameter ${SYSCONFIG} RDBBC`"

BCMNDB="`get_parameter ${BCENV} BCMNDB`"
if [ "${BCMNDB}" = "" ];then
	echo "ERROR: BCMNDB parameter is not found in BC onfiguration parameter file."
	exit 1
fi

rdbprt -m DB > ${WKFILE} 2> /dev/null
if [ $? -eq 0 ]; then
	tail -n +3 ${WKFILE} | awk '{print $2}' | grep "^${BCMNDB}$" > /dev/null 2>&1
	if [ $? -eq 0 ]; then
		DELMNDBALL_FLG=1
	fi
else
	DELMNDBALL_FLG=1
fi
for DRREP_DEFFILE_TMP in ${DRREP_DEFFILE_LIST[@]}
do
	DRREP_DEFFILE=`echo ${DRREP_DEFFILE_TMP} | cut -f 1 -d ","`
	MAPFILE_PATH=`get_parameter ${DRREP_DEFFILE} MAPFILE`
	
	if [ -f ${MAPFILE_PATH}.bk ]; then
		DELMNDBALL_FLG=0
		break
	fi
done
if [ ${DELMNDBALL_FLG} -eq 1 ]; then
	lxrepdrdelmndball -w ${WORKPATH} > ${ERRFILE} 2>&1
	if [ $? -ne 0 ]; then
		grep "JYP2901E" ${ERRFILE} > /dev/null 2>&1
		if [ $? -ne 0 ]; then
			cat ${ERRFILE}
			echo "ERROR: lxrepdrdelmndball is failed."
			rm ${ERRFILE}
			exit 1
		fi
	else
		cat ${ERRFILE}
	fi
	rm ${ERRFILE}
fi


#
# Create BCMNDB
#
for DRREP_DEFFILE_TMP in ${DRREP_DEFFILE_LIST[@]}
do
	DRREP_DEFFILE=`echo ${DRREP_DEFFILE_TMP} | cut -f 1 -d ","`
	RLPNAME=`echo ${DRREP_DEFFILE_TMP} | cut -f 2 -d ","`

	lxrepdrrlp -V -D -p ${RLPNAME} > ${WKFILE} 2>&1
	if [ $? -eq 0 ];then
		RLPID=`grep "RLPid" ${WKFILE} | awk '{print$3}'`
		rdbinf -i ${BCMNDB}.BC_DSI_"${RLPID}"_TL_CODE > ${WKFILE} 2>&1
		if [ $? -eq 0 ];then
			rm ${WKFILE}
			continue
		fi
	fi
	rm ${WKFILE} > /dev/null 2>&1
	lxrepdrcrt -p ${RLPNAME} -m mndb -k reflect -d ${DRREP_DEFFILE} -e nocntf
	if [ $? -ne 0 ]; then
		echo "ERROR: lxrepdrcrt -m mndb (RLPname:${RLPNAME}) is failed."
		exit 1
	fi
done

#
# Extract map
#
for DRREP_DEFFILE_TMP in ${DRREP_DEFFILE_LIST[@]}
do
	DRREP_DEFFILE=`echo ${DRREP_DEFFILE_TMP} | cut -f 1 -d ","`
	RLPNAME=`echo ${DRREP_DEFFILE_TMP} | cut -f 2 -d ","`
	MAPFILE_PATH=`get_parameter ${DRREP_DEFFILE} MAPFILE`
	
	if [ ! -f ${MAPFILE_PATH}.bk ]; then
		lxrepdrmap -p ${RLPNAME} -R ${MAPFILE_PATH}
		if [ $? -ne 0 ]; then
			echo "ERROR: lxrepdrmap (RLPname:${RLPNAME}) is failed."
			exit 1
		else
			mv ${MAPFILE_PATH} ${MAPFILE_PATH}.bk
			if [ $? -ne 0 ]; then
				echo "mv command is failed. Check the status of directory (`dirname ${MAPFILE_PATH}`)."
				echo "Please execute the following command manually, and then re-run the script:"
				echo "\$ mv ${MAPFILE_PATH} ${MAPFILE_PATH}.bk"
				exit 1
			fi
		fi
	fi
done

#
# RLP Online
#
for RLPNAME in ${RLPNAME_LIST[@]}
do
	lxrepdrrlp -V -O -p ${RLPNAME} > ${WKFILE} 2>&1
	if [ $? -eq 0 ]; then
		if [ "`grep "Online/Offline" ${WKFILE} | awk '{print $3}'`" = "online" ]; then
			rm ${WKFILE}
			continue
		fi
	fi
	rm ${WKFILE}
	lxrepdrena -p ${RLPNAME} -k reflect
	if [ $? -ne 0 ]; then
		echo "ERROR: lxrepdrena (RLPname:${RLPNAME}) is failed."
		exit 1
	fi
done

#
# Start DR Replication work
#
for RLPNAME in ${RLPNAME_LIST[@]}
do
	lxrepdrrep -p ${RLPNAME} -a start -k reflect
	if [ $? -ne 0 ]; then
		echo "ERROR: lxrepdrrep -a start (RLPname:${RLPNAME}) is failed."
		exit 1
	fi
done

exit 0