Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.98 KB | None | 0 0
  1. #!/usr/bin/env bash
  2. # set -x
  3.  
  4. source ${HOME}/*_$(hostname -s).env > /dev/null
  5. [[ $? != 0 ]] && { echo '!! Failed to source environment file. Must exist in the format "SID_HOSTNAME.env"'; exit 1; }
  6.  
  7. b_type=${1}
  8. d_type=${2}
  9.  
  10. [[ -z ${b_type} ]] && { echo "Please specify backup type: { arch | full | lvl0 | lvl1 }"; exit 1; }
  11. [[ -z ${d_type} ]] && d_type='disk'
  12.  
  13. case ${b_type} in
  14. arch|full|lvl0|lvl1)
  15. true
  16. ;;
  17. *)
  18. echo '!! Wrong backup type specified.'
  19. echo "!> Available backup types:"
  20. printf "\t arch | full | lvl0 | lvl1 \n"
  21. exit 1
  22. ;;
  23. esac
  24.  
  25. case ${d_type} in
  26. disk|sbt_tape)
  27. true
  28. ;;
  29. *)
  30. echo '!! Wrong device type specified.'
  31. echo '!> Available device types:'
  32. printf "\t disk | sbt_tape \n"
  33. exit 1
  34. ;;
  35. esac
  36.  
  37. instance=${ORACLE_SID}
  38. start_date=$(date +%F)
  39. start_time=$(date +%F_%H%M)
  40.  
  41. ###########################################################################
  42. # Misc
  43. MAIL_LIST=''
  44. BACKUP_BASE='/backup/nas'
  45. BACKUP_DIR="${BACKUP_BASE}/${instance}"
  46. BACKUP_DEST="${BACKUP_DIR}/${b_type}_${start_date}"
  47. LOG_FILE="${BACKUP_DIR}/logs/${instance}_rman_${b_type}_${start_time}.log"
  48. echo "Log file: $LOG_FILE"
  49.  
  50. # RMAN configs
  51. # R_CATALOG=""
  52. # R_STANDBY=''
  53. # R_RECOVERY_WINDOW=30
  54. R_REDUNDANCY=2
  55. R_PARALLELISM=2
  56. # R_TAPE_PARMS="PARMS 'ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/tdpo.opt)'"
  57. R_MAXPIECESIZE=5G
  58. R_COMPRESS='AS COMPRESSED BACKUPSET'
  59. R_CMD_FILE="/tmp/.sdba_${instance}_rman_${b_type}.rmn"
  60. ###########################################################################
  61. find "${BACKUP_DIR}" -depth -type d -exec sh -c '[ -z "$(ls -A ${1}/)" ]' dummy {} \; -print | xargs rm -rf
  62.  
  63. if [[ ! -d "${BACKUP_DIR}/logs" ]]; then
  64. mkdir -p "${BACKUP_DIR}/logs";
  65. [[ $? != 0 ]] && { echo "#! Failed to create directory: ${BACKUP_DIR}/logs"; exit 1; }
  66. fi
  67.  
  68. find "${BACKUP_DIR}/logs" -type f -mtime +5 -exec rm -f {} \;
  69.  
  70. if [[ ${d_type} == 'disk' ]]; then
  71. mkdir -p "${BACKUP_DEST}"
  72. [[ $? != 0 ]] && { echo "!! Failed to create directory: ${BACKUP_DEST}"; exit 1; }
  73. fi
  74.  
  75. exec 3>&1 4>&2
  76. trap 'do_exit' 0 1 2 3 13 15
  77. exec 1> "${LOG_FILE}" 2>&1
  78.  
  79. do_exit() {
  80. printf "\n## STATUS \t: %s\n##\n" "${g_job_status}"
  81. printf "## STARTED \t: %s\n" "${start_time}"
  82. printf "## FINISHED \t: %s\n" "$(date +%F_%H%M)"
  83.  
  84. exec 2>&4 1>&3
  85.  
  86. rm -f "${R_CMD_FILE}"
  87.  
  88. if [[ ! -z ${MAIL_LIST} ]]; then
  89. mail -s "RMAN ${b_type} backup of \"${instance}\" instance on $(hostname -s) completed with status: ${g_job_status}" "${MAIL_LIST}" < "${LOG_FILE}"
  90. fi
  91. }
  92.  
  93. echo "#######################################################################################"
  94. echo "## Starting RMAN ${b_type} backup of '${instance}' instance [$(date)] "
  95. echo "## Device type: ${d_type}"
  96. [[ ${d_type} = "disk" ]] && echo "## Backup destination: ${BACKUP_DEST}"
  97. echo "## Log file: ${LOG_FILE}"
  98. printf "#######################################################################################\n##\n"
  99.  
  100. echo '#> Generating RMAN command file'
  101.  
  102. rc() {
  103. echo "${*}" >> "${R_CMD_FILE}"
  104. }
  105.  
  106. echo "# Instance: ${instance}; Type: ${b_type}; Device: ${d_type}" > "${R_CMD_FILE}"
  107. rc "connect target /"
  108. if [[ ! -z ${R_CATALOG} ]]; then
  109. rc "connect catalog ${R_CATALOG}"
  110. rc "resync catalog;"
  111. fi
  112.  
  113. rc 'CONFIGURE DEFAULT DEVICE TYPE TO disk;'
  114. rc "CONFIGURE DEVICE TYPE disk PARALLELISM ${R_PARALLELISM};"
  115. rc "CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE disk TO '${BACKUP_DIR}/%F';"
  116. rc "CONFIGURE SNAPSHOT CONTROLFILE NAME TO '${BACKUP_DIR}/snapcf_${instance}.f';"
  117.  
  118. if [ ${d_type} = "sbt_tape" ] ; then
  119. rc "CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE sbt_tape TO '%F';"
  120. rc "CONFIGURE CHANNEL DEVICE TYPE sbt_tape ${R_TAPE_PARMS};"
  121. rc "CONFIGURE DEVICE TYPE sbt_tape PARALLELISM ${R_PARALLELISM};"
  122. fi
  123.  
  124. [[ ! -z ${R_STANDBY} ]] && rc 'CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;'
  125.  
  126. [[ ! -z ${R_REDUNDANCY} ]] && rc "CONFIGURE RETENTION POLICY TO REDUNDANCY ${R_REDUNDANCY};"
  127. [[ ! -z ${R_RECOVERY_WINDOW} ]] && rc "CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF ${R_RECOVERY_WINDOW} DAYS;"
  128.  
  129. rc "run {"
  130.  
  131. for ((i=1; i <= R_PARALLELISM; i++)); do
  132. ch[$i]="ch${i}"
  133. rc "ALLOCATE CHANNEL ${ch[$i]} DEVICE TYPE ${d_type}"
  134. case ${d_type} in
  135. disk)
  136. rc "FORMAT '${BACKUP_DEST}/${instance}_${b_type}_%T_%U.%p'"
  137. ;;
  138. sbt_tape)
  139. rc "${R_TAPE_PARMS}"
  140. rc "FORMAT '${instance}_${b_type}_%T_%U.%p'"
  141. ;;
  142. esac
  143. rc "MAXPIECESIZE ${R_MAXPIECESIZE};"
  144. done
  145.  
  146. rc "BACKUP ${R_COMPRESS}"
  147.  
  148. case ${b_type} in
  149. full) rc "DATABASE" ;;
  150. lvl0) rc "INCREMENTAL LEVEL 0 DATABASE" ;;
  151. lvl1) rc "INCREMENTAL LEVEL 1 DATABASE" ;;
  152. arch) rc "ARCHIVELOG ALL NOT BACKED UP 1 TIMES DELETE ALL INPUT" ;;
  153. esac
  154.  
  155. case ${b_type} in
  156. full|lvl0|lvl1) rc "PLUS ARCHIVELOG" ;;
  157. esac
  158.  
  159. rc "TAG '${b_type}_${start_date}';"
  160.  
  161. for ((i=1; i <= ${#ch[*]}; i++)); do
  162. rc "RELEASE CHANNEL ch${i};"
  163. done
  164.  
  165. if [[ ${b_type} != "arch" ]]; then
  166. rc "ALLOCATE CHANNEL d1 TYPE DISK;"
  167. rc "COPY CURRENT CONTROLFILE TO '${BACKUP_DIR}/${instance}_ctrlfile_copy_${start_date}.ctl';"
  168. rc 'RELEASE CHANNEL d1;'
  169. fi
  170.  
  171. rc "}"
  172.  
  173. rc 'ALLOCATE CHANNEL FOR MAINTENANCE TYPE disk;'
  174. if [[ ! -z ${R_TAPE_PARMS} ]]; then
  175. rc "ALLOCATE CHANNEL FOR MAINTENANCE TYPE sbt_tape ${R_TAPE_PARMS};"
  176. fi
  177. rc 'CROSSCHECK BACKUP;'
  178. rc 'DELETE NOPROMPT FORCE OBSOLETE;'
  179. rc 'CROSSCHECK ARCHIVELOG ALL;'
  180. rc 'DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;'
  181. echo '## File has been successfully generated.'
  182.  
  183. printf "#> Starting RMAN %s backup.\n##\n" "${b_type}"
  184.  
  185. rman cmdfile="${R_CMD_FILE}"
  186. ec=$?
  187.  
  188. [[ ${ec} == 0 ]] && g_job_status='SUCCESS' || g_job_status='FAILED'
  189.  
  190. exit ${ec}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement