Tuning RMAN performance requires a detailed understanding of how RMAN creates a backup. As explained in “RMAN Channels”, the work of a backup is performed by one or more channels. A channel represents a stream of bytes to a storage device.
For the purposes of illustration, you can think of the byte stream as passing from the input buffers in memory through the CPU to the output buffers, and from there to the storage device. To direct a backup to two tape devices, you allocate two tape channels so that each byte stream goes to a different device.
lately, I understand we can able to tune RMAN Backup Jobs using duration and backup piece size rather than increase backup channels which can degraded server performance
section size 128G DATABASE
Let’s suppose your RMAN backup takes one hour now and you take it online while end users work with the database. This reduces the performance impact of the online backup by half approximately:
RMAN> backup duration 02:00 minimize load database;
Here is easy sample Oracle Full Backup script:
# $Header: rman_full_bkp.sh
# #################################################
# Script to be used on the crontab to schedule an RMAN Full Backup
# ################################################
# October 2022 Sandeep Reddy Narani
# ###############################################
# VARIABLES To be Modified by the user to match the Environment:
# Crontab : 55 2 * * * /home/oracle/scripts/rman/rman_L0_bkp.sh CDB /db/dbadeeds/L0 > /home/oracle/scripts/rman/rmanfull.log > /dev/null 2>&1
# ###############################################
#!/bin/ksh
export USER=oracle
export ORACLE_SID=${1}
export ORACLE_HOME=`grep "^${ORACLE_SID}:" /etc/oratab|cut -d: -f2 -s`
export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/oracle/.local/bin:/home/oracle/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export MAIL=/var/spool/mail/oracle
export ML=""
export RD=/db/dbadeeds
export CDATE=`date '+%Y%m%d_%H%M'`
export HN=`hostname|cut -d'.' -f1`
# INSTANCE Name: [Replace ${ORACLE_SID} with your instance SID]
ORACLE_SID=${ORACLE_SID}
# ORACLE_HOME Location: [Replace ${ORACLE_HOME} with the right ORACLE_HOME path]
ORACLE_HOME=${ORACLE_HOME}
# Backup Location: [Replace /backup/rmanfull with the backup location path]
BACKUPLOC=${2}
# Backup LOG location:
RMANLOG=${BACKUPLOC}/rmanfull_${ORACLE_SID}_${CDATE}.log
# COMPRESSED BACKUP option:[Y|N] [Default ENABLED]
COMPRESSION=Y
# Perform Maintenance based on below Backup & Archivelog Retention: [Y|N] [Default DISABLED]
MAINTENANCEFLAG=N
# Backup Retention "In Days": [Backups older than this retention will be deleted]
BKP_RETENTION=10
# Archives Deletion "In Days": [Archivelogs older than this retention will be deleted]
ARCH_RETENTION=10
# ##################
# GENERIC VARIABLES: [Can be left without modification]
# ##################
# MAX BACKUP Piece Size: [Must be BIGGER than the size of the biggest datafile in the database]
MAX_BKP_PIECE_SIZE=33g
# Show the full DATE and TIME details in the backup log:
NLS_DATE_FORMAT='DD-Mon-YYYY HH24:MI:SS'
export ORACLE_SID
export ORACLE_HOME
export BACKUPLOC
export COMPRESSION
export BKP_RETENTION
export ARCH_RETENTION
export MAX_BKP_PIECE_SIZE
export RMANLOG
export NLS_DATE_FORMAT
export MAINTENANCEFLAG
# Check the selected COMPRESSION option:
case ${COMPRESSION} in
Y|y|YES|Yes|yes|ON|on)
COMPRESSED_BKP="AS COMPRESSED BACKUPSET"
export COMPRESSED_BKP
;;
*)
COMPRESSED_BKP=""
export COMPRESSED_BKP
;;
esac
# Check the selected MAINTENANCE option:
case ${MAINTENANCEFLAG} in
Y|y|YES|Yes|yes|ON|on)
HASH_MAINT=""
export HASH_MAINT
;;
*)
HASH_MAINT="#"
export COMPRESSED_BKP
;;
esac
# Append the date to the backup log for each script execution:
echo "----------------------------" >> ${RMANLOG}
date >> ${RMANLOG}
echo "----------------------------" >> ${RMANLOG}
# ###################
# RMAN SCRIPT Section:
# ###################
${ORACLE_HOME}/bin/rman target / msglog=${RMANLOG} <<EOF
# Configuration Section:
# ---------------------
${HASH_MAINT}CONFIGURE BACKUP OPTIMIZATION ON;
${HASH_MAINT}CONFIGURE CONTROLFILE AUTOBACKUP ON;
${HASH_MAINT}CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${BACKUPLOC}/%F';
${HASH_MAINT}CONFIGURE SNAPSHOT CONTROLFILE NAME TO '${ORACLE_HOME}/dbs/snapcf_${ORACLE_SID}.f';
## Avoid Deleting archivelogs NOT yet applied on the standby: [When FORCE is not used]
#CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
# Maintenance Section:
# -------------------
## Crosscheck backups/copied to check for expired backups which are physically not available on the media:
${HASH_MAINT}crosscheck backup completed before 'sysdate-${BKP_RETENTION}' device type disk;
${HASH_MAINT}crosscheck copy completed before 'sysdate-${BKP_RETENTION}' device type disk;
## Report & Delete Obsolete backups which don't meet the RETENTION POLICY:
${HASH_MAINT}REPORT OBSOLETE RECOVERY WINDOW OF ${BKP_RETENTION} DAYS device type disk;
${HASH_MAINT}DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF ${BKP_RETENTION} DAYS device type disk;
## Delete All EXPIRED backups/copies which are not physically available:
${HASH_MAINT}DELETE NOPROMPT EXPIRED BACKUP COMPLETED BEFORE 'sysdate-${BKP_RETENTION}' device type disk;
${HASH_MAINT}DELETE NOPROMPT EXPIRED COPY COMPLETED BEFORE 'sysdate-${BKP_RETENTION}' device type disk;
## Crosscheck Archivelogs to avoid the backup failure:
${HASH_MAINT}CHANGE ARCHIVELOG ALL CROSSCHECK;
${HASH_MAINT}DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
## Delete Archivelogs older than ARCH_RETENTION days:
${HASH_MAINT}DELETE NOPROMPT archivelog all completed before 'sysdate -${ARCH_RETENTION}';
# Full Backup Script starts here: [Compressed+Controlfile+Archives]
# ------------------------------
run{
allocate channel F1 type disk;
allocate channel F2 type disk;
allocate channel F3 type disk;
allocate channel F4 type disk;
allocate channel F5 type disk;
allocate channel F6 type disk;
allocate channel F7 type disk;
allocate channel F8 type disk;
sql 'alter system archive log current';
BACKUP ${COMPRESSED_BKP}
#MAXSETSIZE ${MAX_BKP_PIECE_SIZE}
NOT BACKED UP SINCE TIME 'SYSDATE-2/24'
INCREMENTAL LEVEL=0
FORMAT '${BACKUPLOC}/%d_%t_%s_%p.bkp'
FILESPERSET 100
TAG='FULL_L0_BKP'
section size 128G DATABASE include current controlfile PLUS ARCHIVELOG NOT BACKED UP SINCE TIME 'SYSDATE-2/24';
## Backup the controlfile separately:
BACKUP ${COMPRESSED_BKP} CURRENT CONTROLFILE FORMAT '${BACKUPLOC}/CONTROLFILE_%d_%I_%t_%s_%p.bkp' TAG='CONTROLFILE_BKP' REUSE ;
## Trace backup of Controlfile & SPFILE:
SQL "ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS ''${BACKUPLOC}/controlfile.trc'' REUSE";
SQL "CREATE PFILE=''${BACKUPLOC}/init${ORACLE_SID}.ora'' FROM SPFILE";
crosscheck archivelog all;
crosscheck backup;
DELETE NOPROMPT OBSOLETE;
release channel F1;
release channel F2;
release channel F3;
release channel F4;
release channel F5;
release channel F6;
release channel F7;
release channel F8;
}
EOF
echo "RMAN FUll BACK IS COMPLETED, PLEASE REVIEW THE LOGS"
if [ ! -s ${RMANLOG} ]
then
echo "${ORACLE_SID}@${HN}:RMAN BACKUP JOB LOG NOT FOUND" | mailx -s "${ORACLE_SID}@${HN}:RMAN L0 BACKUP JOB LOG NOT FOUND, PLEASE REVIEW THE LOGS" ${ML}
else
echo "${ORACLE_SID}@${HN}:RMAN BACKUP JOB LOG FOUND" | mailx -s "${ORACLE_SID}@${HN}:RMAN BACKUP L0 JOB COMPLETED, PLEASE REVIEW THE LOGS" ${ML} < ${RMANLOG}
fi
exit;
RMAN Archive Log Backup Script with using Duration clause.
# $Header: rman_ARCHIVE_bkp.sh
# #################################################
# Script to be used on the crontab to schedule an RMAN ARCHIVE Backup
# ################################################
# October 2022 Sandeep Reddy Narani
# ###############################################
# VARIABLES To be Modified by the user to match the Environment:
#0 */2 * * * /home/oracle/scripts/rman/rman_archive_bkp.sh CDB /db/dbadeeds/Arch/archivelog > /home/oracle/scripts/rman/rmanfull_arch.log >/dev/null 2>&1
# ###############################################
#!/bin/ksh
export USER=oracle
export ORACLE_SID=${1}
export ORACLE_HOME=`grep "^${ORACLE_SID}:" /etc/oratab|cut -d: -f2 -s`
export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/oracle/.local/bin:/home/oracle/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export MAIL=/var/spool/mail/oracle
export RD=/db/dbadeeds/Arch
export CDATE=`date '+%Y%m%d_%H%M'`
export ML=""
export HN=`hostname|cut -d'.' -f1`
# INSTANCE Name: [Replace ${ORACLE_SID} with your instance SID]
ORACLE_SID=${ORACLE_SID}
# ORACLE_HOME Location: [Replace ${ORACLE_HOME} with the right ORACLE_HOME path]
ORACLE_HOME=${ORACLE_HOME}
# Backup Location: [Replace /backup/rmanARCHIVE with the backup location path]
BACKUPLOC=${2}
# Backup LOG location:
RMANLOG=${BACKUPLOC}/rmanarch_${ORACLE_SID}_${CDATE}.log
# COMPRESSED BACKUP option:[Y|N] [Default ENABLED]
COMPRESSION=Y
# Perform Maintenance based on below Backup & Archivelog Retention: [Y|N] [Default DISABLED]
MAINTENANCEFLAG=N
# Backup Retention "In Days": [Backups older than this retention will be deleted]
BKP_RETENTION=10
# Archives Deletion "In Days": [Archivelogs older than this retention will be deleted]
ARCH_RETENTION=10
# ##################
# GENERIC VARIABLES: [Can be left without modification]
# ##################
# MAX BACKUP Piece Size: [Must be BIGGER than the size of the biggest datafile in the database]
MAX_BKP_PIECE_SIZE=33g
# Show the ARCHIVE DATE and TIME details in the backup log:
NLS_DATE_FORMAT='DD-Mon-YYYY HH24:MI:SS'
export ORACLE_SID
export ORACLE_HOME
export BACKUPLOC
export COMPRESSION
export BKP_RETENTION
export ARCH_RETENTION
export MAX_BKP_PIECE_SIZE
export RMANLOG
export NLS_DATE_FORMAT
export MAINTENANCEFLAG
# Check the selected COMPRESSION option:
case ${COMPRESSION} in
Y|y|YES|Yes|yes|ON|on)
COMPRESSED_BKP="AS COMPRESSED BACKUPSET"
export COMPRESSED_BKP
;;
*)
COMPRESSED_BKP=""
export COMPRESSED_BKP
;;
esac
# Check the selected MAINTENANCE option:
case ${MAINTENANCEFLAG} in
Y|y|YES|Yes|yes|ON|on)
HASH_MAINT=""
export HASH_MAINT
;;
*)
HASH_MAINT="#"
export COMPRESSED_BKP
;;
esac
# Append the date to the backup log for each script execution:
echo "----------------------------" >> ${RMANLOG}
date >> ${RMANLOG}
echo "----------------------------" >> ${RMANLOG}
# ###################
# RMAN SCRIPT Section:
# ###################
${ORACLE_HOME}/bin/rman target / msglog=${RMANLOG} <<EOF
# Configuration Section:
# ---------------------
${HASH_MAINT}CONFIGURE BACKUP OPTIMIZATION ON;
${HASH_MAINT}CONFIGURE CONTROLFILE AUTOBACKUP ON;
${HASH_MAINT}CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${BACKUPLOC}/%F';
${HASH_MAINT}CONFIGURE SNAPSHOT CONTROLFILE NAME TO '${ORACLE_HOME}/dbs/snapcf_${ORACLE_SID}.f';
## Avoid Deleting archivelogs NOT yet applied on the standby: [When FORCE is not used]
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
#CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;
# Maintenance Section:
# -------------------
## Crosscheck backups/copied to check for expired backups which are physically not available on the media:
${HASH_MAINT}crosscheck backup completed before 'sysdate-${BKP_RETENTION}' device type disk;
${HASH_MAINT}crosscheck copy completed before 'sysdate-${BKP_RETENTION}' device type disk;
## Report & Delete Obsolete backups which don't meet the RETENTION POLICY:
${HASH_MAINT}REPORT OBSOLETE RECOVERY WINDOW OF ${BKP_RETENTION} DAYS device type disk;
${HASH_MAINT}DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF ${BKP_RETENTION} DAYS device type disk;
## Delete All EXPIRED backups/copies which are not physically available:
${HASH_MAINT}DELETE NOPROMPT EXPIRED BACKUP COMPLETED BEFORE 'sysdate-${BKP_RETENTION}' device type disk;
${HASH_MAINT}DELETE NOPROMPT EXPIRED COPY COMPLETED BEFORE 'sysdate-${BKP_RETENTION}' device type disk;
## Crosscheck Archivelogs to avoid the backup failure:
${HASH_MAINT}CHANGE ARCHIVELOG ALL CROSSCHECK;
${HASH_MAINT}DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
## Delete Archivelogs older than ARCH_RETENTION days:
${HASH_MAINT}DELETE NOPROMPT archivelog all completed before 'sysdate -${ARCH_RETENTION}';
# Archivelog Backup Script starts here: [Compressed+Controlfile+Archives]
# ------------------------------
run{
allocate channel F1 type disk;
allocate channel F2 type disk;
allocate channel F3 type disk;
allocate channel F4 type disk;
allocate channel F5 type disk;
allocate channel F6 type disk;
allocate channel F7 type disk;
allocate channel F8 type disk;
sql 'alter system archive log current';
BACKUP ${COMPRESSED_BKP} duration 00:55 NOT BACKED UP SINCE TIME 'SYSDATE-2/24' ARCHIVELOG ALL FORMAT '${BACKUPLOC}/%d_%t_%s_%p.bkp' section size 128G FILESPERSET 100 TAG='ARCH';
crosscheck archivelog all;
## Backup the controlfile separately:
BACKUP ${COMPRESSED_BKP} CURRENT CONTROLFILE FORMAT '${BACKUPLOC}/CONTROLFILE_%d_%I_%t_%s_%p.bkp' TAG='CONTROLFILE_BKP' REUSE ;
## Trace backup of Controlfile & SPFILE:
SQL "ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS ''${BACKUPLOC}/controlfile.trc'' REUSE";
SQL "CREATE PFILE=''${BACKUPLOC}/init${ORACLE_SID}.ora'' FROM SPFILE";
release channel F1;
release channel F2;
release channel F3;
release channel F4;
release channel F5;
release channel F6;
release channel F7;
release channel F8;
}
EOF
echo "RMAN ARCHIVE BACK IS COMPLETED, PLEASE REVIEW THE LOGS"
if [ ! -s ${RMANLOG} ]
then
echo "RMAN ARCHIVELOG BACKUP LOG NOT FOUND ${ORACLE_SID}" | mailx -s "${ORACLE_SID}@${HN}RMAN ARCHIVELOG BACKUP LOG NOT FOUND" ${ML}
else
echo "RMAN ARCHIVELOG BACKUP JOB LOG FOUND" | mailx -s "${ORACLE_SID}@${HN}:RMAN ARCHIVELOG BACKUP JOB COMPLETED" ${ML} < ${RMANLOG}
fi
exit;
Leave a comment