事前に用意するDR_ONLINE_RCV4.shについて説明します。
[名称]
複写先システムのRLP環境とデータベースの復旧
[形式]
DR_ONLINE_RCV4.sh
[機能説明]
複写先システムのRDBディクショナリを復旧し、すべてのユーザロググループのRDBディレクトリファイルを復旧します。
監査ログデータベース運用を行っている場合は、監査ログデータベースを一旦削除し再作成します。
スケーラブルディレクトリ運用の場合は、SET SYSTEM PARAMETER文で、監査ログの取得範囲や監査ログデータベースが満杯時の対処方法を設定したDDL文を作成し定義します。
ロググループに存在するDSIごとにDSIを復旧します。
RLP環境を復旧し、複写先システムのRERUNログの取得開始とDRレプリケーション業務の起動を行います。
[注意事項]
本シェルスクリプトを実行する際、環境変数設定ファイルは本シェルスクリプトと同じディレクトリに配置してください。
本シェルスクリプトが異常終了した場合、出力されたSymfoware Serverのqdgメッセージに従い、エラー原因を排除したのち、本シェルスクリプトを再実行してください。
[復帰値]
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