运维联盟俱乐部

 找回密码
 立即注册
查看: 376|回复: 0

[备份恢复] rman backup database full script

[复制链接]
  • TA的每日心情
    开心
    2023-8-9 11:05
  • 发表于 2023-11-13 17:32:03 | 显示全部楼层 |阅读模式


    1. #!/bin/bash
    2. echo
    3. echo "==================================================="
    4. echo "BACKUP FULL DATABASE SCRIPTS"
    5. echo "==================================================="
    6. echo
    7. sleep 1

    8. # ###########################
    9. # CPU count check:
    10. # ###########################

    11. # Count of CPUs:
    12. CPU_NUM=`cat /proc/cpuinfo|grep CPU|wc -l`
    13. export CPU_NUM

    14. # #######################################
    15. # Excluded INSTANCES:
    16. # #######################################
    17. # Here you can mention the instances the script will IGNORE and will NOT run against:
    18. # Use pipe "|" as a separator between each instance name.
    19. # e.g. Excluding: -MGMTDB, ASM instances:

    20. EXL_DB="\-MGMTDB|ASM|APX"                           #Excluded INSTANCES [Will not get reported offline].

    21. # ###########################
    22. # Listing Available Databases:
    23. # ###########################

    24. # Count Instance Numbers:
    25. INS_COUNT=$( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|wc -l )

    26. # Exit if No DBs are running:
    27. if [ $INS_COUNT -eq 0 ]
    28. then
    29.    echo No Database Running !
    30.    exit
    31. fi

    32. # If there is ONLY one DB set it as default without prompt for selection:
    33. if [ $INS_COUNT -eq 1 ]
    34. then
    35.    export ORACLE_SID=$( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|awk '{print $NF}'|sed -e 's/ora_pmon_//g'|grep -v sed|grep -v "s///g" )

    36. # If there is more than one DB ASK the user to select:
    37. elif [ $INS_COUNT -gt 1 ]
    38. then
    39.     echo
    40.     echo "Select the ORACLE_SID:[Enter the number]"
    41.     echo ---------------------
    42.     select DB_ID in $( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|awk '{print $NF}'|sed -e 's/ora_pmon_//g'|grep -v sed|grep -v "s///g" )
    43.      do
    44.                 integ='^[1-9]+$'
    45.                 if ! [[ ${REPLY} =~ ${integ} ]] || [ ${REPLY} -gt ${INS_COUNT} ]
    46.                         then
    47.                         echo
    48.                         echo "Error: Not a valid number!"
    49.                         echo
    50.                         echo "Enter a valid NUMBER from the displayed list !: i.e. Enter a number from [1 to ${INS_COUNT}]"
    51.                         echo "-----------------------------------------------"
    52.                 else
    53.                         export ORACLE_SID=$DB_ID
    54.                         echo
    55.                         printf "`echo "Selected Instance: ["` `echo -e "\033[33;5m${DB_ID}\033[0m"` `echo "]"`\n"
    56.                         echo
    57.                         break
    58.                 fi
    59.      done

    60. fi
    61. # Exit if the user selected a Non Listed Number:
    62.         if [ -z "${ORACLE_SID}" ]
    63.          then
    64.           echo "You've Entered An INVALID ORACLE_SID"
    65.           exit
    66.         fi

    67. # #########################
    68. # Getting ORACLE_HOME
    69. # #########################
    70.   ORA_USER=`ps -ef|grep ${ORACLE_SID}|grep pmon|grep -v grep|egrep -v ${EXL_DB}|grep -v "\-MGMTDB"|awk '{print $1}'|tail -1`
    71.   USR_ORA_HOME=`grep ${ORA_USER} /etc/passwd| cut -f6 -d ':'|tail -1`

    72. # SETTING ORATAB:
    73. if [ -f /etc/oratab ]
    74.   then
    75.   ORATAB=/etc/oratab
    76.   export ORATAB
    77. ## If OS is Solaris:
    78. elif [ -f /var/opt/oracle/oratab ]
    79.   then
    80.   ORATAB=/var/opt/oracle/oratab
    81.   export ORATAB
    82. fi

    83. # ATTEMPT1: Get ORACLE_HOME using pwdx command:
    84. export PGREP=`which pgrep`
    85. export PWDX=`which pwdx`
    86. if [[ -x ${PGREP} ]] && [[ -x ${PWDX} ]]
    87. then
    88. PMON_PID=`pgrep  -lf _pmon_${ORACLE_SID}|awk '{print $1}'`
    89. export PMON_PID
    90. ORACLE_HOME=`pwdx ${PMON_PID}|awk '{print $NF}'|sed -e 's/\/dbs//g'`
    91. export ORACLE_HOME
    92. fi

    93. # ATTEMPT2: If ORACLE_HOME not found get it from oratab file:
    94. if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
    95. then
    96. ## If OS is Linux:
    97. if [ -f /etc/oratab ]
    98.   then
    99.   ORATAB=/etc/oratab
    100.   ORACLE_HOME=`grep -v '^\#' $ORATAB | grep -v '^$'| grep -i "^${ORACLE_SID}:" | perl -lpe'$_ = reverse' | cut -f3 | perl -lpe'$_ = reverse' |cut -f2 -d':'`
    101.   export ORACLE_HOME

    102. ## If OS is Solaris:
    103. elif [ -f /var/opt/oracle/oratab ]
    104.   then
    105.   ORATAB=/var/opt/oracle/oratab
    106.   ORACLE_HOME=`grep -v '^\#' $ORATAB | grep -v '^$'| grep -i "^${ORACLE_SID}:" | perl -lpe'$_ = reverse' | cut -f3 | perl -lpe'$_ = reverse' |cut -f2 -d':'`
    107.   export ORACLE_HOME
    108. fi
    109. #echo "ORACLE_HOME from oratab is ${ORACLE_HOME}"
    110. fi

    111. # ATTEMPT3: If ORACLE_HOME is still not found, search for the environment variable: [Less accurate]
    112. if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
    113. then
    114.   ORACLE_HOME=`env|grep -i ORACLE_HOME|sed -e 's/ORACLE_HOME=//g'`
    115.   export ORACLE_HOME
    116. #echo "ORACLE_HOME from environment  is ${ORACLE_HOME}"
    117. fi

    118. # ATTEMPT4: If ORACLE_HOME is not found in the environment search user's profile: [Less accurate]
    119. if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
    120. then
    121.   ORACLE_HOME=`grep -h 'ORACLE_HOME=\/' $USR_ORA_HOME/.bash_profile $USR_ORA_HOME/.*profile | perl -lpe'$_ = reverse' |cut -f1 -d'=' | perl -lpe'$_ = reverse'|tail -1`
    122.   export ORACLE_HOME
    123. #echo "ORACLE_HOME from User Profile is ${ORACLE_HOME}"
    124. fi

    125. # ATTEMPT5: If ORACLE_HOME is still not found, search for orapipe: [Least accurate]
    126. if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
    127. then
    128.   ORACLE_HOME=`locate -i orapipe|head -1|sed -e 's/\/bin\/orapipe//g'`
    129.   export ORACLE_HOME
    130. #echo "ORACLE_HOME from orapipe search is ${ORACLE_HOME}"
    131. fi

    132. # TERMINATE: If all above attempts failed to get ORACLE_HOME location, EXIT the script:
    133. if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
    134. then
    135.   echo "Please export ORACLE_HOME variable in your .bash_profile file under oracle user home directory in order to get this script to run properly"
    136.   echo "e.g."
    137.   echo "export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1"
    138. exit
    139. fi

    140. # ########################################
    141. # Exit if the user is not the Oracle Owner:
    142. # ########################################
    143. CURR_USER=`whoami`
    144.         if [ ${ORA_USER} != ${CURR_USER} ]; then
    145.           echo ""
    146.           echo "You're Running This Sctipt with User: "${CURR_USER}" !!!"
    147.           echo "Please Run This Script With The Right OS User: "${ORA_USER}""
    148.           echo "Script Terminated!"
    149.           exit
    150.         fi

    151. # ###############################
    152. # RMAN: Script Creation:
    153. # ###############################
    154. # Last RMAN Backup Info:
    155. # #####################

    156. # Variables:
    157. export NLS_DATE_FORMAT="DD-MON-YY HH24:MI:SS"

    158. # Building the RMAN BACKUP Script:
    159. echo
    160. echo Please enter the Backup Location: [e.g. /backup/DB]
    161. echo "================================"
    162. while read BKPLOC1
    163.         do

    164.                 if [ ! -w "${BKPLOC1}" ]; then
    165.                  echo "Provided Backup Location is NOT Exist/Writable !"
    166.                  echo
    167.                  echo "Please Provide a VALID Backup Location:"
    168.                  echo "--------------------------------------"
    169.                 else
    170.                 BKPLOC=${BKPLOC1}/RMANBKP_${ORACLE_SID}/`date +%y%m%d`
    171.                 /bin/mkdir -p ${BKPLOC}
    172.                  break
    173.                 fi
    174.         done

    175. # Exit if the user has pressed Ctrl+D:
    176. if [ ! -w "${BKPLOC}" ]; then
    177. exit
    178. fi

    179. echo
    180. echo "Backup Location is: ${BKPLOC}"
    181. echo
    182. echo "How many CHANNELS do you want to allocate for this backup? [${CPU_NUM} CPUs Available On This Machine]"
    183. echo "========================================================="
    184. while read CHANNEL_NUM
    185.         do
    186.                 integ='^[0-9]+$'
    187.                 if ! [[ ${CHANNEL_NUM} =~ $integ ]] ; then
    188.                            echo "Error: Not a valid number !"
    189.                         echo
    190.                         echo "Please Enter a VALID NUMBER:"
    191.                         echo "---------------------------"
    192.                 else
    193.                         break
    194.                 fi
    195.         done
    196. echo
    197. echo "Number Of Channels is: ${CHANNEL_NUM}"
    198. echo
    199. echo "Do you want a COMPRESSED BACKUP? [Y|N]: [Y]"
    200. echo "================================"
    201. while read COMPRESSED
    202.         do
    203.                 case $COMPRESSED in  
    204.                   ""|y|Y|yes|YES|Yes) COMPRESSED="AS COMPRESSED BACKUPSET"; echo "COMPRESSED BACKUP ENABLED.";break ;;
    205.                   n|N|no|NO|No) COMPRESSED="";break ;;
    206.                   *) echo "Please enter a VALID answer [Y|N]" ;;
    207.                 esac
    208.         done       
    209. echo
    210. echo "Do you want a INCREMENTAL BACKUP? [0|1|N]: [N]"
    211. echo "================================"
    212. while read INCREMENTAL
    213.         do
    214.                 case $INCREMENTAL in  
    215.                   0) INCREMENTAL="INCREMENTAL LEVEL 0"; echo "INCREMENTAL LEVEL 0 BACKUP ENABLED.";break ;;
    216.                   1) INCREMENTAL="INCREMENTAL LEVEL 1"; echo "INCREMENTAL LEVEL 1 BACKUP ENABLED.";break ;;
    217.                   n|N|no|NO|No) INCREMENTAL="";echo "INCREMENTAL BACKUP NOT ENABLED.";break ;;
    218.                   *) echo "Please enter a VALID answer [Y|N]" ;;
    219.                 esac
    220.         done
    221. echo
    222. echo "Do you want to ENCRYPT the BACKUP by Password? [Available in Enterprise Edition only] [Y|N]: [N]"
    223. echo "=============================================="
    224. while read ENCR_BY_PASS_ANS
    225.         do
    226.                 case ${ENCR_BY_PASS_ANS} in
    227.                   y|Y|yes|YES|Yes)
    228.                   echo
    229.                   echo "Please Enter the password that will be used to Encrypt the backup:"
    230.                   echo "-----------------------------------------------------------------"
    231.                   read ENCR_PASS
    232.                   ENCR_BY_PASS="SET ENCRYPTION ON IDENTIFIED BY '${ENCR_PASS}' ONLY;"
    233.                   export ENCR_BY_PASS
    234.                   echo
    235.                   echo "BACKUP ENCRYPTION ENABLED."
    236.                   echo
    237.                   echo "Later, To RESTORE this backup please use the following command to DECRYPT it, placing it just before the RESTORE Command:"
    238.                   echo "  e.g."
    239.                   echo "  SET DECRYPTION IDENTIFIED BY '${ENCR_PASS}';"
    240.                   echo "  restore database ...."
    241.                   echo
    242.                   break ;;
    243.                   ""|n|N|no|NO|No) ENCR_BY_PASS="";break ;;
    244.                   *) echo "Please enter a VALID answer [Y|N]" ;;
    245.                 esac
    246.         done
    247. RMANSCRIPT=${BKPLOC}/RMAN_FULL_${ORACLE_SID}.rman
    248. RMANSCRIPTRUNNER=${BKPLOC}/RMAN_FULL_nohup.sh
    249. RMANLOG=${BKPLOC}/rmanlog.`date +%y%m%d_%H%M%S`.log

    250. echo "${ENCR_BY_PASS}"      > ${RMANSCRIPT}
    251. echo "run {"                    >> ${RMANSCRIPT}
    252. CN=1
    253. while [[ ${CN} -le ${CHANNEL_NUM} ]]
    254. do
    255. echo "allocate channel C${CN} type disk;" >> ${RMANSCRIPT}
    256.     ((CN = CN + 1))
    257. done
    258. echo "CROSSCHECK ARCHIVELOG ALL;" >> ${RMANSCRIPT}
    259. echo "BACKUP ${COMPRESSED} ${INCREMENTAL} FORMAT '${BKPLOC}/%d_%I_%t_%s_%p' TAG='FULLBKP' DATABASE;" >> ${RMANSCRIPT}
    260. echo "SQL "ALTER SYSTEM ARCHIVE LOG CURRENT";" >> ${RMANSCRIPT}
    261. echo "SQL "ALTER SYSTEM ARCHIVE LOG CURRENT";" >> ${RMANSCRIPT}
    262. echo "SQL "ALTER SYSTEM ARCHIVE LOG CURRENT";" >> ${RMANSCRIPT}
    263. echo "SQL "ALTER SYSTEM ARCHIVE LOG CURRENT";" >> ${RMANSCRIPT}
    264. echo "BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL NOT BACKED UP FORMAT '${BKPLOC}/arch_%d_%T_%s_%p.ARC';" >> ${RMANSCRIPT}
    265. echo "BACKUP FORMAT '${BKPLOC}/%d_%t_%s_%p.ctl' TAG='CONTROL_BKP' CURRENT CONTROLFILE;" >> ${RMANSCRIPT}
    266. echo "CROSSCHECK ARCHIVELOG ALL;" >> ${RMANSCRIPT}
    267. echo "REPORT OBSOLETE;" >> ${RMANSCRIPT}
    268. echo "DELETE NOPROMPT EXPIRED BACKUP;" >> ${RMANSCRIPT}
    269. echo "DELETE NOPROMPT OBSOLETE;" >> ${RMANSCRIPT}
    270. echo "DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';" >> ${RMANSCRIPT}
    271. echo "DELETE NOPROMPT BACKUP OF ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';" >> ${RMANSCRIPT}
    272. CN=1
    273. while [[ ${CN} -le ${CHANNEL_NUM} ]]
    274. do
    275. echo "RELEASE CHANNEL C${CN};" >> ${RMANSCRIPT}
    276.     ((CN = CN + 1))
    277. done
    278. echo "}" >> ${RMANSCRIPT}

    279. echo "RMAN BACKUP SCRIPT CREATED."
    280. echo
    281. sleep 1
    282. echo "Backup Location is: ${BKPLOC}"
    283. echo
    284. sleep 1
    285. echo "Starting Up RMAN Backup Job ..."
    286. echo
    287. sleep 1
    288. echo "#!/bin/bash" > ${RMANSCRIPTRUNNER}
    289. echo "nohup ${ORACLE_HOME}/bin/rman target / cmdfile=${RMANSCRIPT} | tee ${RMANLOG}  2>&1 &" >> ${RMANSCRIPTRUNNER}
    290. chmod 740 ${RMANSCRIPTRUNNER}
    291. source ${RMANSCRIPTRUNNER}
    292. echo
    293. echo " The RMAN backup job is currently running in the background. Disconnecting the current session will NOT interrupt the backup job :-)"
    294. echo " Now, viewing the backup job log:"
    295. echo
    296. echo "Backup Location is: ${BKPLOC}"
    297. echo "Check the LOGFILE: ${RMANLOG}"
    298. echo
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    运维联盟俱乐部 ( 冀ICP备19036648号 )

    GMT+8, 2024-5-11 02:53 , Processed in 0.047393 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表