Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env bash
- # set -x
- source ${HOME}/*_$(hostname -s).env > /dev/null
- [[ $? != 0 ]] && { echo '!! Failed to source environment file. Must exist in the format "SID_HOSTNAME.env"'; exit 1; }
- b_type=${1}
- d_type=${2}
- [[ -z ${b_type} ]] && { echo "Please specify backup type: { arch | full | lvl0 | lvl1 }"; exit 1; }
- [[ -z ${d_type} ]] && d_type='disk'
- case ${b_type} in
- arch|full|lvl0|lvl1)
- true
- ;;
- *)
- echo '!! Wrong backup type specified.'
- echo "!> Available backup types:"
- printf "\t arch | full | lvl0 | lvl1 \n"
- exit 1
- ;;
- esac
- case ${d_type} in
- disk|sbt_tape)
- true
- ;;
- *)
- echo '!! Wrong device type specified.'
- echo '!> Available device types:'
- printf "\t disk | sbt_tape \n"
- exit 1
- ;;
- esac
- instance=${ORACLE_SID}
- start_date=$(date +%F)
- start_time=$(date +%F_%H%M)
- ###########################################################################
- # Misc
- MAIL_LIST=''
- BACKUP_BASE='/backup/nas'
- BACKUP_DIR="${BACKUP_BASE}/${instance}"
- BACKUP_DEST="${BACKUP_DIR}/${b_type}_${start_date}"
- LOG_FILE="${BACKUP_DIR}/logs/${instance}_rman_${b_type}_${start_time}.log"
- echo "Log file: $LOG_FILE"
- # RMAN configs
- # R_CATALOG=""
- # R_STANDBY=''
- # R_RECOVERY_WINDOW=30
- R_REDUNDANCY=2
- R_PARALLELISM=2
- # R_TAPE_PARMS="PARMS 'ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/tdpo.opt)'"
- R_MAXPIECESIZE=5G
- R_COMPRESS='AS COMPRESSED BACKUPSET'
- R_CMD_FILE="/tmp/.sdba_${instance}_rman_${b_type}.rmn"
- ###########################################################################
- find "${BACKUP_DIR}" -depth -type d -exec sh -c '[ -z "$(ls -A ${1}/)" ]' dummy {} \; -print | xargs rm -rf
- if [[ ! -d "${BACKUP_DIR}/logs" ]]; then
- mkdir -p "${BACKUP_DIR}/logs";
- [[ $? != 0 ]] && { echo "#! Failed to create directory: ${BACKUP_DIR}/logs"; exit 1; }
- fi
- find "${BACKUP_DIR}/logs" -type f -mtime +5 -exec rm -f {} \;
- if [[ ${d_type} == 'disk' ]]; then
- mkdir -p "${BACKUP_DEST}"
- [[ $? != 0 ]] && { echo "!! Failed to create directory: ${BACKUP_DEST}"; exit 1; }
- fi
- exec 3>&1 4>&2
- trap 'do_exit' 0 1 2 3 13 15
- exec 1> "${LOG_FILE}" 2>&1
- do_exit() {
- printf "\n## STATUS \t: %s\n##\n" "${g_job_status}"
- printf "## STARTED \t: %s\n" "${start_time}"
- printf "## FINISHED \t: %s\n" "$(date +%F_%H%M)"
- exec 2>&4 1>&3
- rm -f "${R_CMD_FILE}"
- if [[ ! -z ${MAIL_LIST} ]]; then
- mail -s "RMAN ${b_type} backup of \"${instance}\" instance on $(hostname -s) completed with status: ${g_job_status}" "${MAIL_LIST}" < "${LOG_FILE}"
- fi
- }
- echo "#######################################################################################"
- echo "## Starting RMAN ${b_type} backup of '${instance}' instance [$(date)] "
- echo "## Device type: ${d_type}"
- [[ ${d_type} = "disk" ]] && echo "## Backup destination: ${BACKUP_DEST}"
- echo "## Log file: ${LOG_FILE}"
- printf "#######################################################################################\n##\n"
- echo '#> Generating RMAN command file'
- rc() {
- echo "${*}" >> "${R_CMD_FILE}"
- }
- echo "# Instance: ${instance}; Type: ${b_type}; Device: ${d_type}" > "${R_CMD_FILE}"
- rc "connect target /"
- if [[ ! -z ${R_CATALOG} ]]; then
- rc "connect catalog ${R_CATALOG}"
- rc "resync catalog;"
- fi
- rc 'CONFIGURE DEFAULT DEVICE TYPE TO disk;'
- rc "CONFIGURE DEVICE TYPE disk PARALLELISM ${R_PARALLELISM};"
- rc "CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE disk TO '${BACKUP_DIR}/%F';"
- rc "CONFIGURE SNAPSHOT CONTROLFILE NAME TO '${BACKUP_DIR}/snapcf_${instance}.f';"
- if [ ${d_type} = "sbt_tape" ] ; then
- rc "CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE sbt_tape TO '%F';"
- rc "CONFIGURE CHANNEL DEVICE TYPE sbt_tape ${R_TAPE_PARMS};"
- rc "CONFIGURE DEVICE TYPE sbt_tape PARALLELISM ${R_PARALLELISM};"
- fi
- [[ ! -z ${R_STANDBY} ]] && rc 'CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;'
- [[ ! -z ${R_REDUNDANCY} ]] && rc "CONFIGURE RETENTION POLICY TO REDUNDANCY ${R_REDUNDANCY};"
- [[ ! -z ${R_RECOVERY_WINDOW} ]] && rc "CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF ${R_RECOVERY_WINDOW} DAYS;"
- rc "run {"
- for ((i=1; i <= R_PARALLELISM; i++)); do
- ch[$i]="ch${i}"
- rc "ALLOCATE CHANNEL ${ch[$i]} DEVICE TYPE ${d_type}"
- case ${d_type} in
- disk)
- rc "FORMAT '${BACKUP_DEST}/${instance}_${b_type}_%T_%U.%p'"
- ;;
- sbt_tape)
- rc "${R_TAPE_PARMS}"
- rc "FORMAT '${instance}_${b_type}_%T_%U.%p'"
- ;;
- esac
- rc "MAXPIECESIZE ${R_MAXPIECESIZE};"
- done
- rc "BACKUP ${R_COMPRESS}"
- case ${b_type} in
- full) rc "DATABASE" ;;
- lvl0) rc "INCREMENTAL LEVEL 0 DATABASE" ;;
- lvl1) rc "INCREMENTAL LEVEL 1 DATABASE" ;;
- arch) rc "ARCHIVELOG ALL NOT BACKED UP 1 TIMES DELETE ALL INPUT" ;;
- esac
- case ${b_type} in
- full|lvl0|lvl1) rc "PLUS ARCHIVELOG" ;;
- esac
- rc "TAG '${b_type}_${start_date}';"
- for ((i=1; i <= ${#ch[*]}; i++)); do
- rc "RELEASE CHANNEL ch${i};"
- done
- if [[ ${b_type} != "arch" ]]; then
- rc "ALLOCATE CHANNEL d1 TYPE DISK;"
- rc "COPY CURRENT CONTROLFILE TO '${BACKUP_DIR}/${instance}_ctrlfile_copy_${start_date}.ctl';"
- rc 'RELEASE CHANNEL d1;'
- fi
- rc "}"
- rc 'ALLOCATE CHANNEL FOR MAINTENANCE TYPE disk;'
- if [[ ! -z ${R_TAPE_PARMS} ]]; then
- rc "ALLOCATE CHANNEL FOR MAINTENANCE TYPE sbt_tape ${R_TAPE_PARMS};"
- fi
- rc 'CROSSCHECK BACKUP;'
- rc 'DELETE NOPROMPT FORCE OBSOLETE;'
- rc 'CROSSCHECK ARCHIVELOG ALL;'
- rc 'DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;'
- echo '## File has been successfully generated.'
- printf "#> Starting RMAN %s backup.\n##\n" "${b_type}"
- rman cmdfile="${R_CMD_FILE}"
- ec=$?
- [[ ${ec} == 0 ]] && g_job_status='SUCCESS' || g_job_status='FAILED'
- exit ${ec}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement