事前に用意する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