Thursday, 24 October 2019

Rman Backup

#!/bin/ksh

# Title:       MonitorDatabase.sh
# Description: Script to monitor various database health checkup 
# Date         Author              Description
# ------------ ------------------- -----------------------------------------

DBSCRIPT=`basename $0`; export DBSCRIPT
HOSTNAME=`hostname`; export HOSTNAME

if [ "$#" -ne 1 ] || [[ "$#" -eq 1 && "$1" != 'backup' && "$1" != 'level0' && "$1" != 'level1' && "$1" != 'restore' ]]; then
   echo "Usage: ${DBSCRIPT} backup (For RMAN incremental backup; System will decide level0 or level1 acoording to week day)"
   echo "       ${DBSCRIPT} level0 (For RMAN incremental level 0 backup)"
   echo "       ${DBSCRIPT} level1 (For RMAN incremental level 1 backup)"
   echo "       ${DBSCRIPT} restore (Restore the database by using RMAN backup)"
   exit 3
fi

. ReadConfig.sh

if [ -n "`ps -eaf|grep ${DBSCRIPT}|grep -v grep|grep -v $$|grep -v ${PPID}`" ]; then
ps -eaf|grep ${DBSCRIPT}|grep -v grep|grep -v $$|grep -v ${PPID} > ${SCRIPT_DIR}/t.log
mailx -s "CRITICAL: Script ${DBSCRIPT} is hanging in server ${HOSTNAME} at `date +%Y/%m/%d\ %H:%M:%S`" ${MAIL_LIST} < t.log
exit 3
fi

ORACLE_SID="`cat ${ORATAB}|grep -v "^*"|grep -v "^#"|grep -w ${DB_NAME}|cut -d ':' -f 1|uniq|grep -v 'ASM|agent|CRS'`"; export ORACLE_SID

if [ -n "${ORACLE_SID}" ]; then
if [ ! -n  "`ps -ef|grep ${ORACLE_SID}|grep pmon`" ]  && [ "$1" != 'restore' ] ; then
echo "Database ${ORACLE_SID} is down."
exit 3
fi
else
echo "Wrong database name: ${DB_NAME}. Retry by mentioning one of the below listed database for db_name in Config.txt "
cat ${ORATAB}|grep -v "^*"|grep -v "^#"|grep -v 'ASM|agent|CRS'|cut -d : -f1|grep -i [A-Z]|sort|uniq
exit 3
fi

ORAENV_ASK=NO
. oraenv >/dev/null 2>&1

if [ -n "${DB_USER}" ]; then
CONNECT_STRING="${DB_USER}"/"${DB_PASSWORD}"
else
echo "Please rerun script by providing db_user and db_password in file Config.txt"
exit 3
fi
export CONNECT_STRING

# Method which will connect to DB and populate variable STATUS as per the SQL provided
get_status (){
STATUS=$($ORACLE_HOME/bin/sqlplus -S ${CONNECT_STRING} << EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF TIMING OFF
${SQL_TEXT}
EXIT;
EOF
); export STATUS
unset SQL_TEXT
}

# RMAN restore
rman_restore(){
mkdir -p $ORACLE_HOME/../diag/rdbms/${DB_NAME}/${DB_NAME}/trace > /dev/null 2>&1
mkdir -p $ORACLE_HOME/../diag/rdbms/${DB_NAME}/${DB_NAME}/alert > /dev/null 2>&1
mkdir -p $ORACLE_HOME/../diag/rdbms/${DB_NAME}/${DB_NAME}/cdump > /dev/null 2>&1
mkdir -p $ORACLE_HOME/../diag/rdbms/${DB_NAME}/${DB_NAME}/incident > /dev/null 2>&1
mkdir -p $ORACLE_BASE/oradata/${DB_NAME} > /dev/null 2>&1
mv $ORACLE_HOME/dbs/spfile${DB_NAME}.ora $ORACLE_HOME/dbs/spfile${DB_NAME}.ora.old > /dev/null 2>&1
mv $ORACLE_HOME/dbs/init${DB_NAME}.ora $ORACLE_HOME/dbs/init${DB_NAME}.ora.old > /dev/null 2>&1
echo "# Dummy INIT.ORA file" > $ORACLE_HOME/dbs/init${DB_NAME}.ora
echo "db_name=${DB_NAME}" >> $ORACLE_HOME/dbs/init${DB_NAME}.ora

rman target / << EOF
RUN {
STARTUP FORCE NOMOUNT pfile=$ORACLE_HOME/dbs/init${DB_NAME}.ora
RESTORE SPFILE FROM AUTOBACKUP RECOVERY AREA='${DB_RECOVERY_FILE_DEST}' DB_NAME=${DB_NAME};
SHUTDOWN IMMEDIATE
STARTUP NOMOUNT
RESTORE CONTROLFILE FROM AUTOBACKUP RECOVERY AREA='${DB_RECOVERY_FILE_DEST}' DB_NAME=${DB_NAME};
STARTUP MOUNT
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
SHUTDOWN IMMEDIATE
STARTUP
}
EOF
rm $ORACLE_HOME/dbs/init${DB_NAME}.ora
$ORACLE_HOME/bin/lsnrctl start
}

# RMAN maintenance to delete expired and obsolete backups
rman_maint(){
rman target ${CONNECT_STRING} << EOF
ALLOCATE CHANNEL FOR MAINTENANCE TYPE DISK;
CROSSCHECK BACKUP;
CROSSCHECK BACKUP OF ARCHIVELOG ALL SPFILE;
CROSSCHECK ARCHIVELOG ALL;
DELETE FORCE NOPROMPT OBSOLETE;
DELETE FORCE NOPROMPT EXPIRED BACKUP;
DELETE EXPIRED ARCHIVELOG ALL;
RELEASE CHANNEL;
EOF
}

# RMAN backup
rman_backup(){
SQL_TEXT="SELECT COUNT(*) FROM V\$DATABASE WHERE LOG_MODE = 'ARCHIVELOG';";
get_status
if [ "${STATUS}" -eq 0 ]; then
echo "Database is not in archivelog mode! To enable archivelog mode, re-execute shell script 'ConfigDB.sh' as below"
echo "ConfigDB.sh arch"
echo "Caution - This will restart database!"
exit 3
fi
SQL_TEXT="SELECT COUNT(*) FROM USER_ROLE_PRIVS WHERE GRANTED_ROLE = 'RECOVERY_CATALOG_OWNER' AND USERNAME = '${DB_USER}';";
get_status
if [ "${STATUS}" -eq 0 ]; then
echo "DB is not configured for RMAN backups! To configure DB for RMAN backups, re-execute shell script 'ConfigDB.sh' as below"
echo "ConfigDB.sh rman"
echo "Caution - Existing RMAN configuration will be overwritten!"
exit 3
else
echo "Starting level ${LEVEL} RMAN backup at `date +%Y/%m/%d\ %H:%M:%S`"
fi

rman target ${CONNECT_STRING} << EOF
RUN {
ALLOCATE CHANNEL c1 TYPE DISK;
BACKUP INCREMENTAL LEVEL ${LEVEL} 
AS COMPRESSED BACKUPSET DATABASE 
TAG '${DB_NAME}_level0_backup';
DELETE FORCE NOPROMPT 
BACKUP TAG ${DB_NAME}_arc_backup;
BACKUP ARCHIVELOG ALL 
DELETE INPUT 
TAG '${DB_NAME}_arc_backup';
RELEASE CHANNEL c1;
}
EOF
rman_maint
}


if [ "$1" = 'backup' ]; then
SQL_TEXT="SELECT COUNT(*) FROM V\$RMAN_STATUS WHERE START_TIME > SYSDATE-2 AND OPERATION='BACKUP' AND STATUS = 'COMPLETED' AND OBJECT_TYPE = 'DB INCR';";
get_status
if [ "${STATUS}" -eq 0 ]; then
LEVEL=0; export LEVEL
else
if [ "`date +%a`" = "Sun" ]; then
LEVEL=0 export LEVEL
else
LEVEL=1; export LEVEL
fi
fi
rman_backup
elif [ "$1" = 'level0' ]; then
LEVEL=0 export LEVEL
rman_backup
elif [ "$1" = 'level1' ]; then
LEVEL=1 export LEVEL
rman_backup
elif [ "$1" = 'restore' ]; then
rman_restore
fi

exit

No comments:

Post a Comment