#!/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
# 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