Você está na página 1de 16

oracle@rdc1pldcora101:msafp]$cat primary_duplicate.

sh

#!/bin/bash

# THIS SCRIPT IS PART OF THE STANDBY SCRIPTS

# Author: Sebastian BONGE

# release version: 2.3.2

# release date : 20190607

# UPDATES:

#----------

# 20180425 Bonge : scp ${STANDBY_CONF_FILE} to ${STANDBY_SERVER}

# 20180912 - 2.0.2 - BONGE: adding backup archivelog after DB backup

# 20181116 - 2.0.2 - BONGE: comment setting of ARCHIVE_LAG_TARGET.

# 20181126 - 2.0.2 - BONGE: adding alter system checkpoint before the backup,

# to minimize the number of required archivelog when recovering

# Also, generating spfile from pfile.

cd `dirname ${0}`

CURR_DIR=${PWD}

[ -z "$ORACLE_HOME" ] && . ~/.bashrc

[ -z "$ORACLE_HOME" ] && . ~/.bash_profile

LIB_FILE=${CURR_DIR}/../lib/sby_lib.sh

if [ ! -f ${LIB_FILE} ]; then

echo "file ${LIB_FILE} not found"

exit 1

else

. ${LIB_FILE}

fi;

###############################################################################
# Fonctions communes

###############################################################################

f_usage() {

echo "syntax : ${0} [-options] <DBNAME> <action>"

echo "options :"

echo " -d: debug mode (log file will contain more detais)"

echo " -n: noprompt (you won't be asked for confirmation to go ahead)"

echo "actions :"

echo " backup: backup the primary DB for the standby"

echo " transfer: send the backup file to the standby server"

echo " create_standby: create standby DB from primary backups"

echo " activate_standby: activate transfer and recover daemons on standby"

echo " all: full duplicate (backup+transfer+create+activate)"

f_check() {

if [ $# -ne 2 ]; then

f_usage

exit 1

fi;

f_init_primary $*

###############################################################################

# Sauvegarde complète de la base de donnee primaire

###############################################################################

f_backup() {

f_log_display "This script will backup the primary for duplication"

f_wait_user
# f_check_DB_started primary ${ORACLE_SID} >> ${LOG_FILE}

# if [ $? -ne 0 ]; then

# f_log_display "Erreur : Base de donnee primaire non demarree. Sauvegarde de la base impossible."

# exit 1

# fik

if [ ! -d ${PRIMARY_BACKUPFILE_PATH} ]; then

mkdir -p ${PRIMARY_BACKUPFILE_PATH}

if [ ! -d ${PRIMARY_BACKUPFILE_PATH} ]; then

f_log_display "Erreur lors de la creation de ${PRIMARY_BACKUPFILE_PATH}"

exit 1

fi

fi;

# Creation du repertoire d'archive log PRIMARY_ARCLOG_PATH

if [ ! -d ${PRIMARY_ARCLOG_PATH} ]; then

mkdir -p ${PRIMARY_ARCLOG_PATH}

if [ ! -d ${PRIMARY_ARCLOG_PATH} ]; then

f_log_display "Erreur lors de la creation de ${PRIMARY_ARCLOG_PATH}"

exit 1

fi

fi;

# Checking ARCHIVELOG mode on primary

f_check_archivelog_mode

if [ "${LOG_MODE}" = "NOARCHIVELOG" ]; then

f_log_display " >> warning - ARCHIVELOG mode is not enabled."

f_set_archivelog_mode

if [ $? -eq 1 ]; then

f_log_display " >> Error when setting ARCHIVELOG mode. Exiting."

exit 1

fi
fi

f_log_display " >> ok - ARCHIVELOG mode is enabled on primary."

# Checking FORCE LOGGING on primary

f_check_force_logging

if [ "${FORCE_LOGGING}" = "N" ]; then

f_log_display " >> warning - FORCE LOGGING not enabled."

f_set_force_logging

if [ $? -eq 1 ]; then

f_log_display " >> Error when setting FORCE LOGGING mode. Exiting."

exit 1

fi

fi

f_log_display " >> ok - FORCE_LOGGING is enabled on primary."

#Do not force LOG_ARCHIVE_FORMAT on primary right now. It will be done once sync starts

#if_apply_numeric_parameter primary ARCHIVE_LAG_TARGET $((ARCHIVE_LAG_TARGET*60))

# Update parameter SERVICE_NAMES on primary

f_apply_string_parameter primary SERVICE_NAMES prim_${DBNAME},${DBNAME}_prim

# reset parameter ARCHIVE_LAG_TARGET on primary

f_apply_numeric_parameter primary ARCHIVE_LAG_TARGET 0

# Suppression des eventuels fichier de sauvegarde existant

f_log_display " "

f_log_display "Deleting all files in ${PRIMARY_BACKUPFILE_PATH}..."

find ${PRIMARY_BACKUPFILE_PATH} -type f -exec rm -f {} \;

if [ $? -eq 0 ]; then

f_log_display " >> Files are all deleted successfully"


else

f_log_display " >> Error during deletion . Please check."

fi

# Configuration de RMAN pour la sauvegarde complete (avec control files)

f_log_display " "

f_log_display "Configuring and cleaning rman repository..."

RMAN_OUT=${WORKING_PATH}/${DBNAME}_${SYSDATE}_rman_config.$$

rman target / log ${RMAN_OUT} <<EOF 1>/dev/null 2>&1

crosscheck copy;

delete noprompt expired copy;

crosscheck backup;

delete noprompt expired backup;

crosscheck archivelog all;

delete noprompt expired archivelog all;

exit

EOF

# Check for errors

f_log_check ${RMAN_OUT}

if [ $? -ge 1 ]; then

f_log_display " >> Errors have been found in ${RMAN_OUT}. Please check."

else

f_log_display " >> Rman repo configured and cleaned successfully"

fi

f_log_display " "

f_log_display "Backup will be executed now: please confirm you want to go ahead"

f_wait_user

###############################################################################

# start RMAN Backup


RMAN_OUT=${WORKING_PATH}/${DBNAME}_${SYSDATE}_rman_backup.$$

rman target / <<EOF | tee ${RMAN_OUT}

CONFIGURE RETENTION POLICY TO REDUNDANCY 1;

CONFIGURE BACKUP OPTIMIZATION ON;

CONFIGURE DEFAULT DEVICE TYPE TO DISK;

CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO


'${PRIMARY_BACKUPFILE_PATH}/%d_ctrl_%F.rman';

CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '${PRIMARY_BACKUPFILE_PATH}/${DBNAME}_db_%U.rman'


MAXPIECESIZE=10G;

CONFIGURE MAXSETSIZE TO UNLIMITED;

CONFIGURE SNAPSHOT CONTROLFILE NAME TO '${PRIMARY_BACKUPFILE_PATH}/snapctl.rman';

SQL "alter system checkpoint";

BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;

BACKUP current controlfile for standby format '${STANDBY_BKP_CTRLFILE}';

SQL "alter system archive log current";

BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL;

exit

EOF

# check for errors

f_log_check ${RMAN_OUT}

if [ $? -eq 0 ]; then

f_log_display " >> Rman backup completed successfully"

else

f_log_display " >> Errors found in output file ${RMAN_OUT}. Exiting"

exit 1

fi

}
###############################################################################

# Verification des utilisateurs connectes

###############################################################################

f_check_user_db(){

DBUSER_INFO=${WORKING_PATH}/${DBNAME}_${SYSDATE}_checkusers.$$

sqlplus -s /nolog <<EOF >${DBUSER_INFO}

connect / as sysdba

set echo off trim on trims on linesize 255 head off pagesize 0 term off

select s.sid, s.serial#, s.osuser, s.username, s.program

from v\$session s

where s.username is not null

and s.audsid != userenv('SESSIONID')

and s.type = 'USER'

order by s.osuser ;

exit

EOF

NB_USER=`sed '/^$/d' ${DBUSER_INFO} | grep "aucun" | wc -l`

if [ ${NB_USER} == 0 ]; then

f_log_display "USers are connected to instance ${ORACLE_SID}."

DISPLAY_RES=`cat ${DBUSER_INFO}`

f_log_display "${DISPLAY_RES}"

[ -f ${DBUSER_INFO} ] && rm -f ${DBUSER_INFO} > /dev/null

# Suppression des utilisateurs connectes

DBUSER_KILL=${WORKING_PATH}/${DBNAME}_${SYSDATE}_killusers.$$

sqlplus -s /nolog <<EOF >${DBUSER_KILL}


connect / as sysdba

set echo off

set trim on trims on linesize 255 head off pagesize 0 term off

select 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;'

from v\$session s

where s.username is not null

and s.audsid != userenv('SESSIONID')

and s.type = 'USER'

order by s.osuser ;

exit

EOF

DISPLAY_KILLCMD=`cat ${DBUSER_KILL}`

f_log_display "${DISPLAY_KILLCMD}"

echo -n "Supprimer les utilisateurs dans une autre fenetre puis appuyer sur entree pour continuer : "

read reponse

[ -f ${DBUSER_KILL} ] && rm -f ${DBUSER_KILL} > /dev/null

else

f_log_display "Aucun utilisateur est connecte a l'application (${ORACLE_SID})."

[ -f ${DBUSER_INFO} ] && rm -f ${DBUSER_INFO} > /dev/null

fi

return 0

}
###############################################################################

# Transfert des backup RMAN du serveur primaire au serveur de secours

###############################################################################

f_transfer_files() {

f_log_display "This script will send backup files to standby server ${STANDBY_SERVER}..."

f_log_display "Are you sure?"

f_wait_user

f_log_display " >> Check backup directory on ${STANDBY_SERVER}"

cmd="${REMOTE_SHELL_CMD} ${STANDBY_SERVER} mkdir -p ${STANDBY_BACKUPFILE_PATH}"

f_debug "$cmd"

eval $cmd

if [ $? -ge 1 ]; then

f_log_display " >> error - Impossible to create backup directory on ${STANDBY_SERVER}"

exit 1

fi

f_log_display " >> Rsync backup directory..."

cmd="rsync -zpq -e ${REMOTE_SHELL_CMD} -a --recursive --delete ${PRIMARY_BACKUPFILE_PATH}/


${STANDBY_SERVER}:${STANDBY_BACKUPFILE_PATH}"

f_debug "$cmd"

eval $cmd

if [ $? -ge 1 ]; then

f_log_display " >> error - Impossible to copy backup files to ${STANDBY_SERVER}:${STANDBY_BACKUPFILE_PATH} "

exit 1

fi

f_log_display " >> ok - backup files are copied on standby"

#prepare standby pfile (instance_name)

f_create_sby_pfile

if [ $? -eq 1 ]; then
f_log_display " >> Error when creating standby pfile. Exiting."

exit 1

fi

f_log_display " >> ok - Standby pfile is created"

STANDBY_PFILE=${ORACLE_HOME}/dbs/init${STANDBY_SID}.ora

echo "STANDBY_PFILE = ${STANDBY_PFILE}"

TMP_PFILE=${WORKING_PATH}/${DBNAME}_${SYSDATE}_sbypfile.$$

grep -iv "instance_name" ${STANDBY_PFILE} > ${TMP_PFILE}

cat ${TMP_PFILE} > ${STANDBY_PFILE}

echo "*.instance_name='${STANDBY_SID}'" >> ${STANDBY_PFILE}

f_log_display "Sending pfile to standby server ${STANDBY_SERVER}..."

cmd="${REMOTE_COPY_CMD} ${STANDBY_PFILE} ${STANDBY_SERVER}:${STANDBY_PFILE}"

f_debug "$cmd"

eval $cmd

if [ $? -ge 1 ]; then

f_log_display " >> error - Impossible to scp pfile to ${STANDBY_SERVER}"

exit 1

fi

f_log_display " >> ok - pfile sent to standby"

rm ${TMP_PFILE}

rm ${STANDBY_PFILE}

f_log_display "Sending password file to standby server ${STANDBY_SERVER}..."

cmd="${REMOTE_COPY_CMD} ${ORACLE_HOME}/dbs/orapw${ORACLE_SID}
${STANDBY_SERVER}:${ORACLE_HOME}/dbs/orapw${STANDBY_SID}"

f_debug "$cmd"

eval $cmd

if [ $? -ge 1 ]; then

f_log_display " >> error - Impossible to scp password file to ${STANDBY_SERVER}"


exit 1

fi

f_log_display " >> ok - password file sent to standby"

f_log_display "Sending standby_${DBNAME}.conf file to standby server ${STANDBY_SERVER}..."

cmd="${REMOTE_COPY_CMD} ${STANDBY_CONF_FILE} ${STANDBY_SERVER}:${STANDBY_CONF_FILE}"

f_debug "$cmd"

eval $cmd

if [ $? -ge 1 ]; then

f_log_display " >> error - Impossible to scp conf file to ${STANDBY_SERVER}"

exit 1

fi

f_log_display " >> ok - conf file sent to standby"

###############################################################################

# Creation standby database via rman - ssh

###############################################################################

f_create_standby () {

f_log_display "This script generate the standy database ${STANDBY_SID} on ${STANDBY_SERVER}..."

f_wait_user

#check standby instance is down

f_log_display "Checking that Standby db is down"

NBRPS=`${REMOTE_SHELL_CMD} ${STANDBY_SERVER} /sbin/pidof ora_smon_${STANDBY_SID}|wc -w`

if [ "${NBRPS}" != "0" ]; then # if1

f_log_display " >> shutting down the Standby instance.."

${REMOTE_SHELL_CMD} ${STANDBY_SERVER} /bin/sh << SSHPART

export ORACLE_SID=${STANDBY_SID}

export ORAENV_ASK=NO;. oraenv -s


sqlplus -s / as sysdba <<EOF 1>/dev/null 2>&1

shutdown abort

EOF

SSHPART

# checking result..

NBRPS=`${REMOTE_SHELL_CMD} ${STANDBY_SERVER} /sbin/pidof ora_smon_${STANDBY_SID}|wc -w`

if [ "${NBRPS}" != "0" ]; then

f_log_display " >> Error - Standby instance still running. Exiting"

exit 1

fi

fi # if1

f_log_display " >> ok - Standby db is down"

#check spfile is created and used

f_log_display "Creating standby spfile"

${REMOTE_SHELL_CMD} ${STANDBY_SERVER} /bin/sh << SSHPART

export ORACLE_SID=${STANDBY_SID}

export ORAENV_ASK=NO;. oraenv -s

sqlplus -s / as sysdba <<EOF 1>/dev/null 2>&1

create spfile from pfile;

EOF

SSHPART

if [ $? -eq 0 ]; then

f_log_display " >> ok - Spfile created"

else

f_log_display " >> warning - Spfile creation failed. please check."

fi

#create all standby directories that do not exist, cleaning if exists

#note: STANDBY_DBFILES_PATH includes ALL dir where files reside (even archivelogs)

[ -z "${STANDBY_FILES_PATH}" ] && f_log_display "No value for STANDBY_FILES_PATH. Exiting" && exit 1
f_log_display "Deleting all Standby files..."

err=0

for MYDIR in ${STANDBY_DBFILES_PATH}

do

f_log_display "Suppression des fichiers dans $MYDIR"

if ${REMOTE_SHELL_CMD} ${STANDBY_SERVER} [ -d "${MYDIR}" ]; then

${REMOTE_SHELL_CMD} ${STANDBY_SERVER} find ${MYDIR} -type f|xargs rm -f

else

${REMOTE_SHELL_CMD} ${STANDBY_SERVER} mkdir -p ${MYDIR}

fi

[ ! $? -eq 0 ] && err=err+1

done

[ ! $err -eq 0 ] && f_log_display >> "error - during standby system cleanup. Exiting" && exit 1

f_log_display " >> ok - Standby directories are ready for a new standby db!"

# Restore Standby

RMAN_LOG=${WORKING_PATH}/${DBNAME}_${SYSDATE}_restore_standby.$$

f_log_display "Restoring standby database through rman.."

${REMOTE_SHELL_CMD} ${STANDBY_SERVER} /bin/sh << SSHPART

echo "**** RESTORING STANDBY DATABASE ${DBNAME} ****" >> ${RMAN_LOG}

echo " ORACLE_SID = ${STANDBY_SID}" >> ${RMAN_LOG}

echo "" >> ${RMAN_LOG}

export ORACLE_SID=${STANDBY_SID}

export ORAENV_ASK=NO;. oraenv -s

rman target / <<EOF >> ${RMAN_LOG}

startup nomount;

catalog start with '${PRIMARY_BACKUPFILE_PATH}/*.rman';

restore standby controlfile from '${STANDBY_BKP_CTRLFILE}';

SQL "alter database mount standby database";

restore database;

recover database;
exit

EOF

SSHPART

${REMOTE_COPY_CMD} ${STANDBY_SERVER}:${RMAN_LOG} ${WORKING_PATH}

# Verification des erreurs dans le fichier log de RMAN

f_log_checkfilter ${RMAN_LOG}

if [ $? -ge 1 ]; then

f_log_display " >> errors found in ${RMAN_LOG}"

fi

f_log_display " >> ok - Standby database is now ready!"

###############################################################################

# Activation standby database via rman - ssh

###############################################################################

f_activate_standby () {

f_log_display "This script will launch Transfer + Recover daemons on standby


${STANDBY_SID}@${STANDBY_SERVER}..."

f_wait_user

${REMOTE_SHELL_CMD} ${STANDBY_SERVER} ${CURR_DIR}/../sync/sby_transfer.sh ${DBNAME} start_auto

sleep 3 # let some time to transfer archivelogs before recovering them

${REMOTE_SHELL_CMD} ${STANDBY_SERVER} ${CURR_DIR}/../sync/sby_recover.sh ${DBNAME} start_auto

###############################################################################

# Main

###############################################################################

DEBUG_MODE=false
while getopts ":dn" opt; do

case $opt in

d)

DEBUG_MODE=true ;;

n)

SILENT_MODE=Y;;

\?)

echo "Invalid option: -$OPTARG" >&2

exit 1;;

esac

done

shift "$((OPTIND - 1))"

if [ $# -lt 2 ]; then

echo "$0 : At least 2 arguments are required!"

f_usage

exit 1

fi;

f_init $1

f_check_primary_server

[ $? -ne 0 ] && exit 1

f_check_user

#===========================

# SPECIFIC VARIABLES

#===========================

f_log_display "======================================"

f_log_display "Initial Configuration for Duplication"

f_log_display "Common db_name : ${DBNAME}"

f_log_display "Primary instance : ${PRIMARY_SID}"


f_log_display "Standby instance : ${STANDBY_SID}"

f_log_display "Backup Dir on Primary : ${PRIMARY_BACKUPFILE_PATH}"

f_log_display "Backup Dir on Standby : ${STANDBY_BACKUPFILE_PATH}"

f_log_display "======================================"

f_log_display " "

case $2 in

backup)

f_backup ;;

transfer)

f_transfer_files ;;

create_standby)

f_create_standby;;

activate_standby)

f_activate_standby;;

all)

f_backup

f_transfer_files

f_create_standby

f_activate_standby;;

*)

f_usage

exit 1

;;

esac

exit 0

Você também pode gostar