## Mohamed Fowjil
## RMAN Database backup
#!/bin/bash
# Configuration
ORACLE_HOME=/u01/app/oracle/product/19c/db_1
ORACLE_SID=DBSPRD
RMAN_LOG_DIR=/home/oracle/logs
RMAN_BACKUP_BASE_DIR=/BACKUP/DBSPRD/
##EMAIL_RECIPIENT="fowjil@abc.ae"
BACKUP_TYPE=$1
DATE_FORMAT=$(date +%Y%m%d)
CURRENT_BACKUP_DIR="$RMAN_BACKUP_BASE_DIR/$DATE_FORMAT"
##LOG_FILE="$RMAN_LOG_DIR/rman_backup_${DATE_FORMAT}.log"
LOG_FILE="$RMAN_LOG_DIR/rman_backup_${BACKUP_TYPE}_${DATE_FORMAT}.log"
PARALLELISM=6
MAXPIECESIZE=25G
# Export Oracle environment variables
export ORACLE_HOME ORACLE_SID
# Validate backup type
if [[ "$BACKUP_TYPE" != "full" && "$BACKUP_TYPE" != "INC0" && "$BACKUP_TYPE" != "INC1" && "$BACKUP_TYPE" != "archivelog" ]]; then
echo "Invalid backup type specified. Use 'full', 'incremental', or 'archivelog'."
exit 1
fi
# Create necessary directories if they don't exist
mkdir -p $RMAN_LOG_DIR $CURRENT_BACKUP_DIR
# Function to send email
send_email() {
SUBJECT=$1
BODY=$2
echo -e "$BODY" | mailx -s "$SUBJECT" $EMAIL_RECIPIENT
}
# Function to perform RMAN backup based on type
perform_rman_backup() {
case $BACKUP_TYPE in
full)
BACKUP_CMD="BACKUP DATABASE TAG 'FULL BACKUP'; BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT;"
;;
INC0)
BACKUP_CMD="BACKUP INCREMENTAL LEVEL 0 DATABASE TAG 'INC0 BACKUP'; BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT; "
;;
INC1)
BACKUP_CMD="BACKUP INCREMENTAL LEVEL 1 DATABASE TAG 'INC1 BACKUP'; BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT; "
;;
archivelog)
BACKUP_CMD="BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT;"
;;
esac
$ORACLE_HOME/bin/rman target / <<EOF > $LOG_FILE
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE MAXSETSIZE TO UNLIMITED;
CONFIGURE DEVICE TYPE DISK PARALLELISM $PARALLELISM;
RUN {
ALLOCATE CHANNEL C1 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C2 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C3 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C4 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C5 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C6 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
$BACKUP_CMD
BACKUP FORMAT '${CURRENT_BACKUP_DIR}/ctrlfile_%d_%Y%M%D_%U.bkp' CURRENT CONTROLFILE;
BACKUP SPFILE FORMAT '${CURRENT_BACKUP_DIR}/spfile_%d_%Y%M%D_%U.bkp' ;
REPORT OBSOLETE;
DELETE NOPROMPT OBSOLETE;
RELEASE CHANNEL C1 ;
RELEASE CHANNEL C2 ;
RELEASE CHANNEL C3 ;
RELEASE CHANNEL C4 ;
RELEASE CHANNEL C5 ;
RELEASE CHANNEL C6 ;
}
EOF
}
# Perform the backup
perform_rman_backup
# Function to delete old backups
cleanup_old_empty_dir() {
find $RMAN_BACKUP_BASE_DIR -maxdepth 1 -type d -empty -delete;
}
# Check RMAN backup status
if grep -q "ORA-" $LOG_FILE; then
## send_email "RMAN Backup Failed" "RMAN $BACKUP_TYPE backup failed. Check the log file for details: $LOG_FILE"
exit 1
else
## send_email "RMAN Backup Successful" "RMAN $BACKUP_TYPE backup completed successfully. Check the log file for details: $LOG_FILE"
# Delete old backups empty directories if current backup is successful
cleanup_old_empty_dir
fi
# Configuration
ORACLE_HOME=/u01/app/oracle/product/19c/db_1
ORACLE_SID=DBSPRD
RMAN_LOG_DIR=/home/oracle/logs
RMAN_BACKUP_BASE_DIR=/BACKUP/DBSPRD/
##EMAIL_RECIPIENT="fowjil@abc.ae"
BACKUP_TYPE=$1
DATE_FORMAT=$(date +%Y%m%d)
CURRENT_BACKUP_DIR="$RMAN_BACKUP_BASE_DIR/$DATE_FORMAT"
##LOG_FILE="$RMAN_LOG_DIR/rman_backup_${DATE_FORMAT}.log"
LOG_FILE="$RMAN_LOG_DIR/rman_backup_${BACKUP_TYPE}_${DATE_FORMAT}.log"
PARALLELISM=6
MAXPIECESIZE=25G
# Export Oracle environment variables
export ORACLE_HOME ORACLE_SID
# Validate backup type
if [[ "$BACKUP_TYPE" != "full" && "$BACKUP_TYPE" != "INC0" && "$BACKUP_TYPE" != "INC1" && "$BACKUP_TYPE" != "archivelog" ]]; then
echo "Invalid backup type specified. Use 'full', 'incremental', or 'archivelog'."
exit 1
fi
# Create necessary directories if they don't exist
mkdir -p $RMAN_LOG_DIR $CURRENT_BACKUP_DIR
# Function to send email
send_email() {
SUBJECT=$1
BODY=$2
echo -e "$BODY" | mailx -s "$SUBJECT" $EMAIL_RECIPIENT
}
# Function to perform RMAN backup based on type
perform_rman_backup() {
case $BACKUP_TYPE in
full)
BACKUP_CMD="BACKUP DATABASE TAG 'FULL BACKUP'; BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT;"
;;
INC0)
BACKUP_CMD="BACKUP INCREMENTAL LEVEL 0 DATABASE TAG 'INC0 BACKUP'; BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT; "
;;
INC1)
BACKUP_CMD="BACKUP INCREMENTAL LEVEL 1 DATABASE TAG 'INC1 BACKUP'; BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT; "
;;
archivelog)
BACKUP_CMD="BACKUP ARCHIVELOG ALL FORMAT '${CURRENT_BACKUP_DIR}/ARC_%d_%Y%M%D_%U.bkp' DELETE ALL INPUT;"
;;
esac
$ORACLE_HOME/bin/rman target / <<EOF > $LOG_FILE
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE MAXSETSIZE TO UNLIMITED;
CONFIGURE DEVICE TYPE DISK PARALLELISM $PARALLELISM;
RUN {
ALLOCATE CHANNEL C1 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C2 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C3 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C4 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C5 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
ALLOCATE CHANNEL C6 TYPE DISK FORMAT '${CURRENT_BACKUP_DIR}/%d_%Y%M%D_%U.bkp' MAXPIECESIZE ${MAXPIECESIZE};
CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
$BACKUP_CMD
BACKUP FORMAT '${CURRENT_BACKUP_DIR}/ctrlfile_%d_%Y%M%D_%U.bkp' CURRENT CONTROLFILE;
BACKUP SPFILE FORMAT '${CURRENT_BACKUP_DIR}/spfile_%d_%Y%M%D_%U.bkp' ;
REPORT OBSOLETE;
DELETE NOPROMPT OBSOLETE;
RELEASE CHANNEL C1 ;
RELEASE CHANNEL C2 ;
RELEASE CHANNEL C3 ;
RELEASE CHANNEL C4 ;
RELEASE CHANNEL C5 ;
RELEASE CHANNEL C6 ;
}
EOF
}
# Perform the backup
perform_rman_backup
# Function to delete old backups
cleanup_old_empty_dir() {
find $RMAN_BACKUP_BASE_DIR -maxdepth 1 -type d -empty -delete;
}
# Check RMAN backup status
if grep -q "ORA-" $LOG_FILE; then
## send_email "RMAN Backup Failed" "RMAN $BACKUP_TYPE backup failed. Check the log file for details: $LOG_FILE"
exit 1
else
## send_email "RMAN Backup Successful" "RMAN $BACKUP_TYPE backup completed successfully. Check the log file for details: $LOG_FILE"
# Delete old backups empty directories if current backup is successful
cleanup_old_empty_dir
fi
-------------------------------------------------------------------------------------------------------------
Usage:
sh rman_backup.sh full
sh rman_backup.sh archivelog