#!/bin/ksh
##########################################################################################
#
# Script Name :
rman_backup.ksh
#
# Written
By :
#
#
Date :
#
#
Usage : rman_backup.ksh -M <mode> -A
<archivelog retention days>
#
#
Parameters :
#
M = Mode; DATABASE, ARCHIVELOG, ADHOC
#
# Description :
##########################################################################################
#
# FUNCTIONS
#
##########################################################################################
InitialiseVariables
()
{
export
ORACLE_SID="DB Name as appropriate"
export
ORACLE_HOME=/u01/app/oracle/product/12.1.0.1/dbhome_1
export
PATH=$PATH:$ORACLE_HOME/bin
LogfileDir=/u02/backups/rman_logfiles
WrapperLogfile=${LogfileDir}/rman_backup_wrapper.log
Today=$(date
+'%Y%m%d')
Now=$(date
+'%Y%m%d_%H%M%S')
NLS_DATE_FORMAT='DD-Mon-YYYY
Dy HH24:MI:SS'
export
NLS_DATE_FORMAT
BACKUP_AREA=/u02/backups/
if [ ! -d
$BACKUP_AREA ]
then
mkdir ${BACKUP_AREA}
fi
ArcBackupArea=${BACKUP_AREA}/rman_archivelog_backups
DBBackupArea=${BACKUP_AREA}/rman_database_backups
ReportName=${LogfileDir}/rman_report_${Today}.txt
CrossscheckLogfile=${LogfileDir}/crosscheck.log
ArchiveLogRetention=7
#was previously 14
NumBackupsKeep=2
}
##########################################################################################
Usage ()
{
echo
"Usage: $0 -M <Mode> -A <archivelog retention days>"
}
##########################################################################################
ValidateParameters
()
{
#Script Mode:
case
$ScriptMode in
'DATABASE')
return ;;
'ARCHIVELOG')
return ;;
'ADHOC') return
;;
*)
Usage; exit -1;;
esac
}
##########################################################################################
DeleteOldBackups
()
{
NumBackups=$(ls
-d ${DBBackupArea}/20[0-9][0-9][0-9][0-9][0-9][0-9] | wc -l)
echo
"Number of DB backups = ${NumBackups}." >> ${WrapperLogfile}
if [
${NumBackups} -lt ${NumBackupsKeep} ]
then
echo "No
need to delete any backups." >> ${WrapperLogfile}
else
Oldest=$(ls -d1
${DBBackupArea}/20[0-9][0-9][0-9][0-9][0-9][0-9] | head -1 | xargs basename)
echo
"Deleting backup ${Oldest}" >> ${WrapperLogfile}
rm -rf
${DBBackupArea}/${Oldest}
NumBackups=$(ls
-d ${DBBackupArea}/20[0-9][0-9][0-9][0-9][0-9][0-9] | wc -l)
echo
"There are now ${NumBackups} backups." >> ${WrapperLogfile}
fi
}
##########################################################################################
RMANReport ()
{
rman nocatalog
target / << EOF > ${ReportName}
set echo on;
show all ;
list backupset
of database summary ;
list backupset
of database ;
list backupset
of controlfile summary ;
list backupset
of controlfile ;
exit ;
EOF
sqlplus -s
"/ as sysdba" << FIN >> ${ReportName}
PROMPT
PROMPT
ARCHIVELOG Summary:
PROMPT
===================
set pages 25
column date1
format a12 hea "Date Created"
select count(*)
"No. Backupsets", to_char(completion_time,'YYYY/MM/DD') date1
from
v\$backup_set
where
backup_type = 'L'
group by
to_char(completion_time,'YYYY/MM/DD')
order by
to_char(completion_time,'YYYY/MM/DD');
PROMPT
PROMPT END OF
REPORT
PROMPT
exit
FIN
}
##########################################################################################
BackupArch ()
{
echo
"Starting backup ..." >> ${WrapperLogfile}
BackupTag="ARCLG_${Today}"
LogFile=${LogfileDir}/rman_arc_${Now}.log
rman nocatalog
target / <<EOF > ${LogFile}
set echo on;
run {
SET CONTROLFILE
AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO
'${ArcBackupArea}/controlf_autobackup_%F';
allocate
channel d1 type disk ;
allocate
channel d2 type disk ;
allocate
channel d3 type disk ;
allocate
channel d4 type disk ;
allocate
channel d5 type disk ;
allocate
channel d6 type disk ;
delete noprompt
archivelog until time 'trunc(sysdate - ${ArchiveLogRetention})' ;
delete noprompt
backup of archivelog all completed before 'trunc(sysdate -
${ArchiveLogRetention})' ;
sql 'alter
system archive log current';
backup as
compressed backupset
tag=${BackupTag}
format '${ArcBackupArea}/rman_arc_%d_%t_%s_%p'
(archivelog all not backed up 2 times) ;
release channel
d1 ;
release channel
d2 ;
release channel
d3 ;
release channel
d4 ;
release channel
d5 ;
release channel
d6 ;
}
exit;
EOF
}
#######################################
ArchivelogReport
()
{
sqlplus -s
"/ as sysdba" << FIN >> ${ReportName}
PROMPT
PROMPT ARCHIVELOG
Summary:
PROMPT
===================
column date1
format a12 hea "Date Created"
select count(*)
"No. Backupsets", to_char(completion_time,'YYYY/MM/DD') date1
from
v\$backup_set
where
backup_type = 'L'
group by
to_char(completion_time,'YYYY/MM/DD')
order by
to_char(completion_time,'YYYY/MM/DD');
PROMPT
PROMPT END OF
REPORT
PROMPT
exit
FIN
}
##########################################################################################
CheckErrors ()
{
NumErrors=$(grep
-c "RMAN-" ${LogFile})
if [ ${NumErrors}
-ne 0 ]
then
echo
"ERRORS were encountered !!!" >> ${WrapperLogfile}
else
echo "No
errors encountered." >> ${WrapperLogfile}
fi
}
##########################################################################################
CrosscheckBackups
()
{
echo
"Performing crosscheck ..." >> ${WrapperLogfile}
rman nocatalog
target / <<EOF > ${CrossscheckLogfile}
set echo on;
run {
crosscheck
backupset ;
delete noprompt
expired backupset ;
}
exit;
EOF
}
##########################################################################################
BackupDatabase
()
{
echo
"Starting backup ..." >> ${WrapperLogfile}
BACKUP_DIR=${DBBackupArea}/${Today}
export
BACKUP_DIR
if [ ! -d
$BACKUP_DIR ]
then
mkdir
${BACKUP_DIR}
fi
BackupTag="REGDB_$(date
+'%Y%m%d')"
LogFile=${LogfileDir}/rman_dbf_${Now}.log
rman nocatalog
target / <<EOF > ${LogFile}
set echo on;
run {
CONFIGURE
CONTROLFILE AUTOBACKUP ON;
SET CONTROLFILE
AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO
'${BACKUP_DIR}/controlf_autobackup_%F';
allocate
channel d1 type disk ;
allocate
channel d2 type disk ;
allocate
channel d3 type disk ;
allocate
channel d4 type disk ;
allocate
channel d5 type disk ;
allocate
channel d6 type disk ;
backup as
compressed backupset
section size 51200M
tag=${BackupTag}
format '${BACKUP_DIR}/rman_dbf_%d_%t_%s_%p'
(database include current controlfile);
sql 'alter
system archive log current';
backup as
compressed backupset
format '${ArcBackupArea}/rman_arc_%d_%t_%s_%p'
(archivelog all not backed up 2 times) ;
release channel
d1 ;
release channel
d2 ;
release channel
d3 ;
release channel
d4 ;
release channel
d5 ;
release channel
d6 ;
}
exit;
EOF
BackupSize=$(du
-sh ${BACKUP_DIR})
echo "Size
of backup = ${BackupSize}" >> ${WrapperLogfile}
}
##########################################################################################
BackupAdhoc ()
{
echo
"Starting backup ..." >> ${WrapperLogfile}
BACKUP_DIR=${DBBackupArea}/ADHOC
export
BACKUP_DIR
if [ ! -d $BACKUP_DIR
]
then
mkdir
${BACKUP_DIR}
fi
BackupTag="ADHOC_$(date
+'%Y%m%d')"
LogFile=${LogfileDir}/rman_dbf_${Now}.log
rman nocatalog
target / <<EOF > ${LogFile}
set echo on;
run {
CONFIGURE
CONTROLFILE AUTOBACKUP ON;
SET CONTROLFILE
AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO
'${BACKUP_DIR}/controlf_autobackup_%F';
allocate
channel d1 type disk ;
allocate
channel d2 type disk ;
allocate
channel d3 type disk ;
allocate
channel d4 type disk ;
allocate
channel d5 type disk ;
allocate
channel d6 type disk ;
allocate
channel d7 type disk ;
allocate
channel d8 type disk ;
sql 'alter
system archive log current';
backup as
compressed backupset database
section size 51200M
tag=${BackupTag}
format '${BACKUP_DIR}/rman_adh_%d_%t_%s_%p'
keep until time 'sysdate+182'
restore point ${BackupTag} ;
sql 'alter
system archive log current';
release channel
d1 ;
release channel
d2 ;
release channel
d3 ;
release channel
d4 ;
release channel
d5 ;
release channel
d6 ;
release channel
d7 ;
release channel
d8 ;
}
exit;
EOF
BackupSize=$(du
-sh ${BACKUP_DIR})
echo "Size
of backup = ${BackupSize}" >> ${WrapperLogfile}
}
##########################################################################################
ExitIfAlreadyRunning
()
{
NUM=$(ps -ef
|grep rman_backup.ksh|grep -v $$|grep -v grep|wc -l)
if [ $NUM -ne 0
]
then
echo "RMAN
backup is already running. Therefore, exiting here ..." >>
${WrapperLogfile}
echo
"Script completed at `date`" | tee -a ${WrapperLogfile}
exit
fi
}
##########################################################################################
HousekeepArchivelogs
()
{
ARC_COUNT=$(ls
/u02/backups/rman_archivelog_backups/rman_arc* | wc -l)
echo "Number
of archivelogs before deletion: ${ARC_COUNT}" >> ${WrapperLogfile}
find
/u02/backups/rman_archivelog_backups -name "rman_arc*" -mtime +18
-exec rm {} \;
ARC_COUNT=$(ls
/u02/backups/rman_archivelog_backups/rman_arc* | wc -l)
echo
"Number of archivelogs after deletion: ${ARC_COUNT}" >>
${WrapperLogfile}
}
##########################################################################################
#
# MAIN
PROCESSING
#
##########################################################################################
# Source
profile, as this will run from cron
#. ~/.profile
> /dev/null 2>&1
while getopts
M: flag
do
case
$flag in
M)
ScriptMode=$OPTARG ;;
*)
Usage; exit -1;;
esac
done
if [
"$ScriptMode" = "" ]
then
Usage
exit -1
fi
ValidateParameters
InitialiseVariables
echo
"-------------------------------------------------" | tee -a
${WrapperLogfile}
#echo "
" | tee -a ${WrapperLogfile}
echo
"Script starting at `date`" | tee -a ${WrapperLogfile}
echo "Mode
= ${ScriptMode}." >> ${WrapperLogfile}
ExitIfAlreadyRunning
if [
"$ScriptMode" = "ARCHIVELOG" ]
then
BackupArch
fi
if [
"$ScriptMode" = "DATABASE" ]
then
DeleteOldBackups
CrosscheckBackups
BackupDatabase
RMANReport
HousekeepArchivelogs
fi
if [
"$ScriptMode" = "ADHOC" ]
then
BackupAdhoc
fi
CheckErrors
echo
"Script completed at `date`" | tee -a ${WrapperLogfile}
##########################################################################################
exit
##########################################################################################