RMAN_DB_Backup_v14.ksh 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/bin/ksh
  2. # ====================================================================================================
  3. # Title: RMAN_DB_Backup.ksh
  4. # Author: Richard Wilson
  5. # Date: 03.04.2014
  6. # Description: Uses RMAN to backup Oracle databases.
  7. # Usage: Usage: RMAN_DB_backup.ksh <ORACLE_SID> <RETENTION_PERIOD> <ARCH|INCR>
  8. #
  9. # History:
  10. # 17.04.2014 RW Added %d%m%Y to Tag.
  11. # 24.07.2014 RW Added email notification.
  12. # 29.07.2014 RW Added more logic - email after 'backup backup'.
  13. # 26.09.2014 RW Included parameter Retention Period.
  14. # 03.12.2014 RW Changed to use R5DISK for UAT, SIT & TRAIN.
  15. # 11.05.2015 RW Removed Full backups, added Incremental backups.
  16. # 09.02.2016 RW Added function 'is_RMAN_running'.
  17. # 09.02.2016 RW Added backup 'NOT BACKED UP 2 TIMES' to capture any missed backupsets.
  18. #
  19. # -----------------------------------------------------------------------------------------------------
  20. function is_fs_mounted
  21. {
  22. mount | grep "${BACKUP_FS}" > /dev/null && return 0 || return 1
  23. }
  24. function is_sid_valid
  25. {
  26. if [ `ps -ef | grep -v grep | grep "ora_pmon_${ORACLE_SID}$" | wc -l 2> /dev/null` -eq 0 ]
  27. then
  28. return 1
  29. else
  30. return 0
  31. fi
  32. }
  33. function is_RMAN_running
  34. {
  35. return `${ORACLE_HOME}/bin/sqlplus -S / "as sysdba" <<-EOF
  36. set pagesize 0 feedback off verify off heading off termout off echo off
  37. select count(1) from sys.v\\$RMAN_STATUS where status like 'RUNNING%';
  38. EOF`
  39. }
  40. build_cmdfile()
  41. {
  42. # Build RMAN command file.
  43. echo "connect target / " > ${RMAN_CMD_FILE}
  44. echo "" >> ${RMAN_CMD_FILE}
  45. echo "run {" >> ${RMAN_CMD_FILE}
  46. echo "sql 'ALTER SYSTEM SET CONTROL_FILE_RECORD_KEEP_TIME=60 SCOPE=BOTH';" >> ${RMAN_CMD_FILE}
  47. echo "CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF ${SAVE_DAYS} DAYS;" >> ${RMAN_CMD_FILE}
  48. echo "CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DISK APPLIED ON ALL STANDBY;" >> ${RMAN_CMD_FILE}
  49. echo "CONFIGURE CONTROLFILE AUTOBACKUP ON;" >> ${RMAN_CMD_FILE}
  50. echo "CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_${ORACLE_SID}.f';" >> ${RMAN_CMD_FILE}
  51. echo "CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4;" >> ${RMAN_CMD_FILE}
  52. echo "CROSSCHECK backup of database;" >> ${RMAN_CMD_FILE}
  53. echo "CROSSCHECK backup of controlfile;" >> ${RMAN_CMD_FILE}
  54. echo "CROSSCHECK backup of spfile;" >> ${RMAN_CMD_FILE}
  55. echo "CROSSCHECK backup of archivelog all;" >> ${RMAN_CMD_FILE}
  56. echo "sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';" >> ${RMAN_CMD_FILE}
  57. case ${BACKUP_TYPE} in
  58. "INCR")
  59. case `date +%a` in
  60. "Mon") 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}
  61. ;;
  62. *) echo "BACKUP as compressed backupset INCREMENTAL LEVEL 1 TAG='L1_${ORACLE_SID}_`date +%d%m%YT%H%M%S`' DATABASE include current CONTROLFILE plus ARCHIVELOG;" >> ${RMAN_CMD_FILE}
  63. ;;
  64. esac;;
  65. "ARCH")
  66. echo "backup as compressed backupset TAG='Arch_${ORACLE_SID}_`date +%d%m%YT%H%M%S`' archivelog all;" >> ${RMAN_CMD_FILE}
  67. ;;
  68. esac
  69. echo "delete noprompt archivelog all backed up 2 times to DEVICE TYPE disk completed before 'sysdate-1';" >> ${RMAN_CMD_FILE}
  70. if is_fs_mounted
  71. then
  72. /bin/find ${BACKUP_FS}/${ORACLE_SID} -type f -empty -delete
  73. echo "backup backupset all NOT BACKED UP 2 TIMES format '${BACKUP_FS}/${ORACLE_SID}/%U';" >> ${RMAN_CMD_FILE}
  74. else
  75. echo -e "WARNING: Backup filesystem not mounted....."
  76. fi
  77. echo "}" >> ${RMAN_CMD_FILE}
  78. echo "exit" >> ${RMAN_CMD_FILE}
  79. }
  80. # ==================================================================================================================================================================================================================
  81. export ORACLE_SID=${1}
  82. export SAVE_DAYS=${2}
  83. export BACKUP_TYPE=${3}
  84. export ORACLE_HOME="/u01/app/oracle/product/11.2.0/dbhome_1"
  85. export SCRIPT_DIR="/home/oracle/Scripts/RMAN"
  86. export RMAN_CMD_FILE=${SCRIPT_DIR}/${ORACLE_SID}_rman_cmds.rman
  87. export BACKUP_FS="/backups"
  88. export BACKUP_LOG=${SCRIPT_DIR}/logs/${ORACLE_SID}_backup_log.txt
  89. is_RMAN_running
  90. result=$?
  91. result1=`echo ${result} | sed 's/[[:space:]]//g'`
  92. if [ ${result1} -eq 0 ]
  93. then
  94. if [ ${#} -eq 3 ]
  95. then
  96. ORACLE_SID=`echo ${ORACLE_SID} | tr "[a-z]" "[A-Z]"`
  97. if is_sid_valid
  98. then
  99. if [[ "${2}" = +([0-9]) ]]
  100. then
  101. if [ "${3}" == "ARCH" -o "${3}" == "INCR" ]
  102. then
  103. build_cmdfile
  104. ${ORACLE_HOME}/bin/rman cmdfile=${RMAN_CMD_FILE} log=${SCRIPT_DIR}/logs/${ORACLE_SID}_RMAN_${BACKUP_TYPE}_backup.log
  105. if [ $? = 0 ]
  106. then
  107. echo -e "INFO: ${ORACLE_SID} Database Backup Successful." >> ${BACKUP_LOG}
  108. else
  109. echo -e "ERROR: ${ORACLE_SID} Database Backup Failed." >> ${BACKUP_LOG}
  110. fi
  111. else
  112. echo "ERROR: Parameter 3: Backup Type must be INCR or ARCH."
  113. fi
  114. else
  115. echo "ERROR: Parameter 2: Retention Period must be numeric, in days!"
  116. fi
  117. else
  118. echo "ERROR: Parameter 1: Database '${ORACLE_SID}' does not exist."
  119. fi
  120. else
  121. echo -e "\nUsage: RMAN_DB_backup.ksh <ORACLE_SID> <RETENTION_PERIOD> <ARCH|INCR>\n"
  122. fi
  123. else
  124. echo -e "\nINFO: RMAN is already running\n"
  125. fi
  126. # End of File