RMAN_DB_Backup_v24.ksh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #!/bin/ksh
  2. # ====================================================================================================
  3. # Title: RMAN_DB_Backup.ksh
  4. # Author: Richard Wilson
  5. # Date: 03.04.2014
  6. # File Name: RMAN_DB_Backup_v15.ksh
  7. # Description: Uses RMAN to backup Oracle databases.
  8. # Usage: Usage: RMAN_DB_backup.ksh <ORACLE_SID> <RETENTION_PERIOD> <ARCH|INCR> <LEVEL_0_DAY>
  9. #
  10. # History:
  11. # 17.04.2014 RW Added %d%m%Y to Tag.
  12. # 24.07.2014 RW Added email notification.
  13. # 29.07.2014 RW Added more logic - email after 'backup backup'.
  14. # 26.09.2014 RW Included parameter Retention Period.
  15. # 03.12.2014 RW Changed to use R5DISK for UAT, SIT & TRAIN.
  16. # 11.05.2015 RW Removed Full backups, added Incremental backups.
  17. # 09.02.2016 RW Added function 'is_RMAN_running'.
  18. # 09.02.2016 RW Added backup 'NOT BACKED UP 2 TIMES' to capture any missed backupsets.
  19. # 25.04.2017 RW Added 'Day' input parameter and 'is_day_valid' function.
  20. # 10.05.2017 RW Added Level-0 Backup Day input parameter.
  21. # 10.05.2017 RW Moved CROSSCHECKS into Level-0 only.
  22. # 12.12.2017 RW Added 'is_not_guarded' function to allow backup on STANDBY.
  23. # 21.12.2017 RW Added dbhome_1/db_1 logic for ORACLE_HOME.
  24. # -----------------------------------------------------------------------------------------------------
  25. function is_fs_mounted
  26. {
  27. mount | grep "${BACKUP_FS}" > /dev/null && return 0 || return 1
  28. }
  29. function is_sid_valid
  30. {
  31. if [ `ps -ef | grep -v grep | grep "ora_pmon_${ORACLE_SID}$" | wc -l 2> /dev/null` -eq 0 ]
  32. then
  33. return 1
  34. else
  35. return 0
  36. fi
  37. }
  38. function is_day_valid
  39. {
  40. case "${LEVEL_0_DAY}" in
  41. MON|TUE|WED|THU|FRI|SAT|SUN|ZZZ)
  42. return 0;;
  43. *) return 1;;
  44. esac
  45. }
  46. function is_RMAN_running
  47. {
  48. return `${ORACLE_HOME}/bin/sqlplus -S / "as sysdba" <<-EOF
  49. set pagesize 0 feedback off verify off heading off termout off echo off
  50. select count(1) from sys.v\\$RMAN_STATUS where status like 'RUNNING%';
  51. EOF`
  52. }
  53. function is_not_guarded
  54. {
  55. return `${ORACLE_HOME}/bin/sqlplus -S / "as sysdba" <<-EOF
  56. set pagesize 0 feedback off verify off heading off termout off echo off
  57. select count(1) from sys.v\\$archive_dest where status = 'VALID' and target = 'STANDBY';
  58. EOF`
  59. }
  60. set_asm_dest()
  61. {
  62. case "${ORACLE_SID}" in
  63. SIT2|DMSIT|IFCE|SYSTST|SYSTST2|GOLD|GOLD2|PACK|PACK2|UPK) asm_disk="+R5DISK";;
  64. *) asm_disk="+FRA";;
  65. esac
  66. }
  67. build_cmdfile()
  68. {
  69. # Build RMAN command file.
  70. echo "connect target / " > ${RMAN_CMD_FILE}
  71. echo "connect catalog rcatadm/RCATADM@RCAT" >> ${RMAN_CMD_FILE}
  72. echo "run {" >> ${RMAN_CMD_FILE}
  73. echo "sql 'alter session set optimizer_mode=RULE';" >> ${RMAN_CMD_FILE}
  74. echo "resync catalog;" >> ${RMAN_CMD_FILE}
  75. echo "sql 'ALTER SYSTEM SET CONTROL_FILE_RECORD_KEEP_TIME=60 SCOPE=BOTH';" >> ${RMAN_CMD_FILE}
  76. echo "CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF ${RETENTION_DAYS} DAYS;" >> ${RMAN_CMD_FILE}
  77. if is_not_guarded
  78. then #P!DG
  79. [ "${DEBUG}" == "Y" ] && echo -e "DEBUG: is_not_guarded: PRIMARY - NODG"
  80. #echo "CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK COMPLETED BEFORE 'SYSDATE-1';" >> ${RMAN_CMD_FILE}
  81. echo "CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;" >> ${RMAN_CMD_FILE}
  82. else #P+DG
  83. [ "${DEBUG}" == "Y" ] && echo -e "DEBUG: is_guarded: PRIMARY - DG"
  84. echo "CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK APPLIED ON ALL STANDBY;" >> ${RMAN_CMD_FILE}
  85. # echo "CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;" >> ${RMAN_CMD_FILE}
  86. fi
  87. # echo "CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;" >> ${RMAN_CMD_FILE}
  88. # echo "CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;" >> ${RMAN_CMD_FILE}
  89. # echo "CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK APPLIED ON ALL STANDBY;" >> ${RMAN_CMD_FILE}
  90. # echo "CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK COMPLETED BEFORE 'SYSDATE-1';" >> ${RMAN_CMD_FILE}
  91. # echo "CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;" >> ${RMAN_CMD_FILE}
  92. echo "CONFIGURE CONTROLFILE AUTOBACKUP ON;" >> ${RMAN_CMD_FILE}
  93. echo "CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK CLEAR;" >> ${RMAN_CMD_FILE}
  94. set_asm_dest
  95. echo "ALLOCATE CHANNEL disk1 DEVICE TYPE DISK FORMAT '${asm_disk}';" >> ${RMAN_CMD_FILE}
  96. echo "ALLOCATE CHANNEL disk2 DEVICE TYPE DISK FORMAT '${asm_disk}';" >> ${RMAN_CMD_FILE}
  97. echo "ALLOCATE CHANNEL disk3 DEVICE TYPE DISK FORMAT '${asm_disk}';" >> ${RMAN_CMD_FILE}
  98. echo "ALLOCATE CHANNEL disk4 DEVICE TYPE DISK FORMAT '${asm_disk}';" >> ${RMAN_CMD_FILE}
  99. echo "CONFIGURE SNAPSHOT CONTROLFILE NAME TO '${ORACLE_HOME}/dbs/snapcf_${ORACLE_SID}.f';" >> ${RMAN_CMD_FILE}
  100. # echo "CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4;" >> ${RMAN_CMD_FILE}
  101. # echo "CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET;" >> ${RMAN_CMD_FILE}
  102. echo "sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';" >> ${RMAN_CMD_FILE}
  103. [ "${DEBUG}" == "Y" ] && echo "DEBUG: Backup Type is set to ${BACKUP_TYPE}."
  104. [ "${DEBUG}" == "Y" ] && echo "DEBUG: Level ZERO Backup Day is set to ${LEVEL_0_DAY}."
  105. case ${BACKUP_TYPE} in
  106. "INCR")
  107. echo "CROSSCHECK backup of database;" >> ${RMAN_CMD_FILE}
  108. echo "CROSSCHECK backup of controlfile;" >> ${RMAN_CMD_FILE}
  109. echo "CROSSCHECK backup of spfile;" >> ${RMAN_CMD_FILE}
  110. echo "CROSSCHECK backup of archivelog all;" >> ${RMAN_CMD_FILE}
  111. case `date +%a | tr "[a-z]" "[A-Z]"` in
  112. ${LEVEL_0_DAY}) [ "${DEBUG}" == "Y" ] && echo "DEBUG: Type: INCR Level 0"
  113. echo "BACKUP as compressed backupset SECTION SIZE 20G INCREMENTAL LEVEL 0 TAG='L0_${ORACLE_SID}_`date +%d%m%YT%H%M%S`' DATABASE include current CONTROLFILE plus ARCHIVELOG;" >> ${RMAN_CMD_FILE}
  114. ;;
  115. *) [ "${DEBUG}" == "Y" ] && echo "DEBUG: Type: INCR Level 1"
  116. echo "BACKUP as compressed backupset SECTION SIZE 20G INCREMENTAL LEVEL 1 TAG='L1_${ORACLE_SID}_`date +%d%m%YT%H%M%S`' DATABASE include current CONTROLFILE plus ARCHIVELOG;" >> ${RMAN_CMD_FILE}
  117. ;;
  118. esac;;
  119. "ARCH") [ "${DEBUG}" == "Y" ] && echo "DEBUG: Type: ARCH"
  120. echo "backup as compressed backupset TAG='Arch_${ORACLE_SID}_`date +%d%m%YT%H%M%S`' archivelog all;" >> ${RMAN_CMD_FILE}
  121. ;;
  122. esac
  123. # echo "delete noprompt archivelog all backed up 1 times to DEVICE TYPE disk completed before 'sysdate-1';" >> ${RMAN_CMD_FILE}
  124. # echo "delete noprompt archivelog all backed up 2 times to DEVICE TYPE disk completed before 'sysdate-1';" >> ${RMAN_CMD_FILE}
  125. # echo "delete noprompt archivelog all backed up 1 times to DEVICE TYPE disk completed before 'sysdate-${RETENTION_DAYS}';" >> ${RMAN_CMD_FILE}
  126. # echo "delete noprompt expired backup;" >> ${RMAN_CMD_FILE}
  127. if is_fs_mounted
  128. then
  129. [ -d ${BACKUP_FS}/${ORACLE_SID} ] || mkdir ${BACKUP_FS}/${ORACLE_SID}
  130. /bin/find ${BACKUP_FS}/${ORACLE_SID} -type f -empty -delete
  131. echo "backup backupset all NOT BACKED UP 2 TIMES format '${BACKUP_FS}/${ORACLE_SID}/%U';" >> ${RMAN_CMD_FILE}
  132. else
  133. echo -e "WARNING: Backup filesystem not mounted....."
  134. fi
  135. echo "DELETE FORCE NOPROMPT OBSOLETE;" >> ${RMAN_CMD_FILE}
  136. echo "}" >> ${RMAN_CMD_FILE}
  137. echo "exit" >> ${RMAN_CMD_FILE}
  138. }
  139. # =====================================================================================================================================================================
  140. export DEBUG="N" # "Y"||"N"
  141. export ORACLE_SID=`echo ${1} | tr "[a-z]" "[A-Z]"`
  142. export RETENTION_DAYS=${2}
  143. export BACKUP_TYPE=`echo ${3} | tr "[a-z]" "[A-Z]"`
  144. export LEVEL_0_DAY=`echo ${4:-ZZZ} | tr "[a-z]" "[A-Z]"`
  145. test `uname -n` = "uks-odbnrgtst-02" && export ORACLE_HOME="/u01/app/oracle/product/11.2.0/dbhome_1" || export ORACLE_HOME="/u01/app/oracle/product/11.2.0/db_1"
  146. export SCRIPT_DIR="/home/oracle/Scripts/RMAN"
  147. [ "${DEBUG}" == "Y" ] && echo -e "DEBUG: Debugging is switched on."
  148. [ "${DEBUG}" == "Y" ] && export RMAN_CMD_FILE=${SCRIPT_DIR}/${ORACLE_SID}_rman_cmds_DEBUG.rman || export RMAN_CMD_FILE=${SCRIPT_DIR}/${ORACLE_SID}_rman_cmds.rman
  149. export BACKUP_FS="/backups"
  150. export BACKUP_LOG=${SCRIPT_DIR}/logs/${ORACLE_SID}_${BACKUP_TYPE}_backup_log.log
  151. [ -d ${SCRIPT_DIR}/logs ] || mkdir ${SCRIPT_DIR}/logs
  152. if [ ${#} -le 4 ]
  153. then
  154. echo `date` >> ${BACKUP_LOG}
  155. if is_not_guarded # 0;SI/SBY
  156. then
  157. if is_RMAN_running
  158. then
  159. ORACLE_SID=`echo ${ORACLE_SID} | tr "[a-z]" "[A-Z]"`
  160. if is_sid_valid
  161. then
  162. if [[ "${2}" = +([0-9]) ]]
  163. then
  164. if [[ "${BACKUP_TYPE}" == "ARCH" || "${BACKUP_TYPE}" == "INCR" ]]
  165. then
  166. if is_day_valid
  167. then
  168. build_cmdfile
  169. [ "${DEBUG}" == "Y" ] && echo ${ORACLE_HOME}/bin/rman cmdfile=${RMAN_CMD_FILE} log=${SCRIPT_DIR}/logs/${ORACLE_SID}_RMAN_${BACKUP_TYPE}_backup.log || ${ORACLE_HOME}/bin/rman cmdfile=${RMAN_CMD_FILE} log=${SCRIPT_DIR}/logs/${ORACLE_SID}_RMAN_${BACKUP_TYPE}_backup.log
  170. if [ $? = 0 ]
  171. then
  172. echo -e "\nINFO: ${ORACLE_SID} Database Backup Successful." >> ${BACKUP_LOG}
  173. else
  174. echo -e "\nERROR: ${ORACLE_SID} Database Backup Failed." >> ${BACKUP_LOG}
  175. fi
  176. else
  177. echo -e "\nERROR: Parameter 4: Invalid Level-0 Backup Day entered <Mon|Tue|Wed|Thu|Fri|Sat|Sun>.\n"
  178. fi
  179. else
  180. echo -e "\nERROR: Parameter 3: Backup Type must be <INCR> or <ARCH>.\n"
  181. fi
  182. else
  183. echo -e "\nERROR: Parameter 2: Retention Days must be numeric, in days.\n"
  184. fi
  185. else
  186. echo -e "\nERROR: Parameter 1: Database '${ORACLE_SID}' does not exist.\n"
  187. fi
  188. else
  189. echo -e "\nINFO: RMAN is already running.\n"
  190. fi
  191. fi
  192. else
  193. echo -e "\nUsage: RMAN_DB_backup.ksh <ORACLE_SID> <RETENTION_DAYS> <ARCH|INCR> <FULL_BACKUP_DAY>\n"
  194. fi
  195. # End of File