= Script: Bash: AIX: Oracle RMAN Backup =
**Summary**: How to handle Oracle backup and restore through rman. \\
**Date**: Around 2013 \\
**Refactor**: 8 March 2025: Checked links and formatting. \\
{{tag>oracle bash}}
#!/bin/bash
# set -x
### Script Variables
WHATAMI=`basename $0`
BASEDIR=`dirname $0`
### Oracle Variables
ORACLE_HOME=/opt/oracle/product/10.2
ORACLE_BASE=/opt/oracle
ORACLE_SID=
### Offsitecopy Variables
GZIP=/usr/bin/gzip
TAR=/usr/local/bin/tar
. "$BASEDIR/mail.txt"
. "$BASEDIR/offsitecopy.func"
HOSTNAME=`hostname`
HOSTNAME_SHORT=`hostname -s`
BCKROOT=/var/backup/oracle
BCKPDIR=${BCKROOT}/rman_backupdir
RMANDIR=${BCKROOT}/rman_workdir
RMANLOGDIR=${BCKROOT}/rman_logs
RMANLOGFILE=${RMANDIR}/rman_backup.log
RMANCROSSLOGFILE=${RMANDIR}/rman_crosscheck.log
BACKUPFILE="${BCKPDIR}/${HOSTNAME_SHORT}_${ORACLE_SID}-RMAN_`date +%Y%m%d%H%M`.tgz"
LOGFILE="$BCKPDIR/logfile_`date +%Y%m%d%H%M`.log"
TOUSER="syncuser"
TOHOST="syncserver.company.local"
TODIR="/srv/syncdata/Oracle/${HOSTNAME_SHORT}_${ORACLE_SID}"
DOCOPY="0"
RMANRESULT="0"
ZIPRESULT="0"
### Export Required Variables
export ORACLE_SID ORACLE_BASE ORACLE_HOME BCKROOT BCKPDIR RMANDIR BASEDIR
removeFunction() {
echo "Removing old backup files from ${RMANDIR}"
rm ${RMANDIR}/*
}
mailFunction() {
if [ "$1" == "RMAN" ]; then
echo "RMAN backup was not created succesfully, consult ${RMANLOGDIR}/rman_backup.log on ${HOSTNAME}" | mail -s "Failed $1 Backup" $MAILTOFAIL
fi
if [ "$1" == "ZIP" ]; then
echo "Tar or zip was not created succesfully, consult ${BACKUPFILE}.log on ${HOSTNAME}" | mail -s "Failed $1 Backup" $MAILTOFAIL
fi
if [ "$1" == "SUCCESS" ]; then
echo "RMAN backup was succesful, but the RMAN was not copied to the syncserver" | mail -s "RMAN Backup Succeedded, but not copied!" $MAILTOFAIL
fi
removeFunction
}
failFunction() {
echo
echo "RMAN Result = $RMANRESULT"
echo "ZIP Result = $ZIPRESULT"
echo
if [ ! "$RMANRESULT" == "0" ]; then
echo "RMAN backup was not created succesfully..."
echo "Please consult `tput bold``tput smul`${RMANLOGDIR}/rman_backup.log`tput sgr0`."
mailFunction RMAN
fi
if [ ! "$ZIPRESULT" == "0" ]; then
echo "Tar or zip was not created succesfully..."
echo "Please consult `tput bold``tput smul`${BACKUPFILE}.log`tput sgr0`"
mailFunction ZIP
fi
removeFunction
exit 1
}
copyFunction() {
if [ "$ZIPRESULT" == "0" ]; then
if [ "$DOCOPY" == "1" ]; then
offsitecopy "${BACKUPFILE}" "$TOUSER" "$TOHOST" "$TODIR" "$LOGFILE" "$WHATAMI" "$HOSTNAME" "$MAILTOSUCCESS" "$MAILTOFAIL"
removeFunction
else
echo
echo "Copy to offsite location is not enabled."
echo "Modify the script under Offsitecopy Variables to enable offsitecopy"
echo
mailFunction SUCCESS
fi
else
failFunction;
fi
}
zipRman() {
if [ "$RMANRESULT" == "0" ]; then
echo
echo "Tar-zipping RMAN backup and logs..."
$TAR -cf - ${RMANDIR} | $GZIP > ${BACKUPFILE}
ZIPRESULT=$?
copyFunction
else
failFunction
fi
}
rmanBackup() {
echo
echo "Starting RMAN backup now for Oracle Database ${ORACLE_SID}..."
echo "${ORACLE_HOME}/bin/rman target / "cmdfile=${BASEDIR}/oracle_rman_backup.cmd""
${ORACLE_HOME}/bin/rman target / cmdfile=\"${BASEDIR}/oracle_rman_backup.cmd\" > ${RMANLOGFILE}
RMANRESULT=$?
sleep 5
mv $RMANLOGFILE $RMANLOGDIR
zipRman
}
rmanCrosscheck() {
echo
echo "Starting RMAN crosscheck now for Oracle Database ${ORACLE_SID}..."
echo "${ORACLE_HOME}/bin/rman target / "cmdfile=${BASEDIR}/oracle_rman_crosscheck.cmd""
${ORACLE_HOME}/bin/rman target / cmdfile=\"${BASEDIR}/oracle_rman_crosscheck.cmd\" > ${RMANCROSSLOGFILE}
sleep 5
mv $RMANCROSSLOGFILE $RMANLOGDIR
}
rmanCrosscheck
rmanBackup
echo
echo "INFO - RMAN backup finished"
echo
As you can see, there is an external reference to offsitecopy and mail.txt. Both are described in [[offsitecopy]].
= Crosscheck Commandfile =
run {
crosscheck backup;
crosscheck backupset;
crosscheck archivelog all;
delete noprompt expired backup;
delete noprompt expired backupset;
delete noprompt expired archivelog all;
delete noprompt obsolete;
}
> Note: It's important to configure the RMAN setting below in the RMAN configuration so that cleanup actions do not delete valid files.
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
This setting can be checked by the RMAN command 'show all':
bash-3.00$ rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Tue Nov 2 09:17:01 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: (DBID=71467001)
RMAN> show all;
using target database control file instead of recovery catalog
RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
CONFIGURE BACKUP OPTIMIZATION OFF;
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO COMPRESSED BACKUPSET;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/opt/oracle/product/10.2/dbs/snapcf_.f'; # default
RMAN> exit
Recovery Manager complete.
= Backup Commandfile
run {
backup database format '/var/backup/oracle/rman_workdir/%d_%u_%s';
backup current controlfile format '/var/backup/oracle/rman_workdir/ctl_date%T%U';
sql 'alter system archive log current';
backup archivelog from time 'SYSDATE-1' format '/var/backup/oracle/rman_workdir/arch_%d_%u_%s';
}
= Simple Commandfile =
spool log to "/var/backup/oracle/rman_workdir/rman_backup.log"
run {
backup database format '/var/backup/oracle/rman_workdir/%d_%u_%s';
}
exit;
spool log off;
exit