Applying patch is one the main maintenance task for a DBA. DBA team needs to give lots of effort to apply patch in every quarter. To minimize the manual effort I tried to make patching automation which will support following environments:
- It will support for 11g and 12c Databases Including RAC and Standalone
- It will support for Linux and AIX
- Patching will support for Remote Node means don’t need to execute script from multiple Node. So this script need to run from one node in RAC Environment
- User has flexibility to choose option
- User don’t need to concentrate of patching each and every steps. User will able to apply patch in multiple environments as manual innervation is very minimal
- It will support rollback also
I have mentioned the script as function wise to make it readable. But all functions will be under one script.
function set_grid_env
{
cd /home/oracle
# if [ ! -z "$(ls | grep grid.env)" ] ; then
# . ./grid.env
# fi
export ORACLE_HOME=$1
export ORACLE_SID=$2
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
}
function set_oracle_home_env
{
# cd /home/oracle
export ORACLE_HOME=$1
export ORACLE_SID=$2
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
}
function all_rac_shutdown
{
# Stop Clusterware
set_grid_env $GGRID_HOME $GASM_INSTANCE
R_HOSTNAME=$1
if [ ${R_HOSTNAME} == ${HOSTNAME_LOCAL_NODE} ] ; then
# Grid Home
if [ "${SHUTDOWN_MODE}" == "unlock" ] ; then
echo
echo "Bring down CRS on Local Node [$R_HOSTNAME] as UNLOCK mode..."
echo "==================================================================================="
sudo $GGRID_HOME/crs/install/rootcrs.pl -unlock
iSHUTDOWN_UNLOCK=1
iSTARTUP_PATCH=0
elif [ "${SHUTDOWN_MODE}" == "normal" ] ; then
echo
echo "Bring down CRS on Local Node [$R_HOSTNAME] as normal mode..."
echo "==================================================================================="
sudo $GGRID_HOME/bin/crsctl stop crs
fi
echo
echo "CRS has been stopped on Node [$R_HOSTNAME]."
else
sleep 1
echo
if [ "${SHUTDOWN_MODE}" == "unlock" ] ; then
echo
echo "Bring down CRS on Remote Node [$R_HOSTNAME] as UNLOCK mode..."
echo "==================================================================================="
ssh -t ${R_HOSTNAME} "export ORACLE_HOME=$GGRID_HOME && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && sudo $GGRID_HOME/crs/install/rootcrs.pl -unlock && exit"
iSHUTDOWN_UNLOCK=1
iSTARTUP_PATCH=0
elif [ "${SHUTDOWN_MODE}" == "normal" ] ; then
echo
echo "Bring down CRS on Remote Node [$R_HOSTNAME] as NORMAL mode..."
echo "==================================================================================="
ssh -t ${R_HOSTNAME} "export ORACLE_HOME=$GGRID_HOME && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && sudo $GGRID_HOME/bin/crsctl stop crs && exit"
fi
echo
echo "CRS has been stopped on Node [$R_HOSTNAME]."
fi
}
function rac_shutdown
{
echo
echo "Shuting down clusterware...."
echo "==================================================================================="
# Shuting down one by one node
if [ "$DB_TYPE" == "rac" ] ; then
i=0
for NODENAME in $NODE_LIST
do
all_rac_shutdown ${HOSTNAME_REMOTE_N[$i]}
i=$i+1
done
# Parallel shutdown for all nodes
: ' if [ ${NODE_NUMBER} == 2 ] ; then
all_rac_shutdown ${HOSTNAME_REMOTE_N[0]} & all_rac_shutdown ${HOSTNAME_REMOTE_N[1]}
elif [ ${NODE_NUMBER} == 3 ] ; then
all_rac_shutdown ${HOSTNAME_REMOTE_N[0]} & all_rac_shutdown ${HOSTNAME_REMOTE_N[1]} & all_rac_shutdown ${HOSTNAME_REMOTE_N[2]}
elif [ ${NODE_NUMBER} == 4 ] ; then
all_rac_shutdown ${HOSTNAME_REMOTE_N[0]} & all_rac_shutdown ${HOSTNAME_REMOTE_N[1]} & all_rac_shutdown ${HOSTNAME_REMOTE_N[2]} & all_rac_shutdown ${HOSTNAME_REMOTE_N[3]}
fi
'
fi
sleep 60
echo "Clusterware Status:"
echo "==================================================================================="
crsctl check cluster -all
echo
echo "All databases have been shutdown"
echo
iSHUTDOWN=1
iSTARTUP=0
SHUTDOWN_MODE=normal
}
# listener stop
function stop_listener
{
if [ "$DB_TYPE" == "rac" ] ; then
srvctl stop listener
return 1;
fi
for LNAME in $LISTENER_NAME
do
lsnrctl stop $LNAME
done
}
function clusterware_start
{
# Stop Clusterware
set_grid_env $GGRID_HOME $GASM_INSTANCE
R_HOSTNAME=$1
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
export ORACLE_SID=$GASM_INSTANCE
if [ ${R_HOSTNAME} == ${HOSTNAME_LOCAL_NODE} ] ; then
if [ "${START_MODE}" == "patch" ] ; then
echo "Starting CRS on Local Node [$R_HOSTNAME] with PATCH Mode..."
sudo $GGRID_HOME/crs/install/rootcrs.pl -patch
iSHUTDOWN_UNLOCK=0
iSTARTUP_PATCH=1
elif [ "${START_MODE}" == "normal" ] ; then
echo "Starting CRS on Local Node [$R_HOSTNAME]..."
sudo $GGRID_HOME/bin/crsctl start crs
elif [ "${START_MODE}" == "has" ] ; then
echo "Starting HAS on Local Node [$R_HOSTNAME]..."
sudo $GGRID_HOME/bin/crsctl start has
fi
else
sleep 15
# ssh -t ${R_HOSTNAME} "cd /home/oracle && . ./grid.env && sudo crsctl start crs && exit"
if [ "${START_MODE}" == "patch" ] ; then
echo "Starting CRS on Remote Node [$R_HOSTNAME] as Patching mode..."
echo "==================================================================================="
ssh -t ${R_HOSTNAME} "export ORACLE_HOME=$GGRID_HOME && export ORACLE_SID=$GASM_INSTANCE && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && sudo $GGRID_HOME/crs/install/rootcrs.pl -patch && exit"
iSHUTDOWN_UNLOCK=0
iSTARTUP_PATCH=1
elif [ "${START_MODE}" == "normal" ] ; then
echo "Starting CRS on Remote Node [$R_HOSTNAME]..."
echo "==================================================================================="
ssh -t $R_HOSTNAME "export ORACLE_HOME=$GGRID_HOME && export ORACLE_SID=$GASM_INSTANCE && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && sudo $GGRID_HOME/bin/crsctl start crs && exit"
elif [ "${START_MODE}" == "has" ] ; then
echo "Starting HAS on Remote Node [$R_HOSTNAME]..."
echo "==================================================================================="
ssh -t ${R_HOSTNAME} "export ORACLE_HOME=$GGRID_HOME && export ORACLE_SID=$GASM_INSTANCE && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && sudo $GGRID_HOME/bin/crsctl start has && exit"
fi
fi
echo
echo "Please wait 4-5 minutes to start CRS/HAS on $R_HOSTNAME ..."
echo "==================================================================================="
sleep 240
echo
if [ "${START_MODE}" == "normal" ] ; then
echo "CRS has been started as normal mode...."
elif [ "${START_MODE}" == "has" ] ; then
echo "HAS has been started...."
elif [ "${START_MODE}" == "patch" ] ; then
echo "CRS has been started as PATCH Mode...."
fi
}
# Starts up all databases
function rac_startup
{
set_home_env
echo
echo "Clusterware is starting...."
echo "==================================================================================="
if [ ${NODE_NUMBER} == 2 ] ; then
clusterware_start ${HOSTNAME_REMOTE_N[0]} & clusterware_start ${HOSTNAME_REMOTE_N[1]}
elif [ ${NODE_NUMBER} == 3 ] ; then
clusterware_start ${HOSTNAME_REMOTE_N[0]} & clusterware_start ${HOSTNAME_REMOTE_N[1]} & clusterware_start ${HOSTNAME_REMOTE_N[2]}
elif [ ${NODE_NUMBER} == 4 ] ; then
clusterware_start ${HOSTNAME_REMOTE_N[0]} & clusterware_start ${HOSTNAME_REMOTE_N[1]} & clusterware_start ${HOSTNAME_REMOTE_N[2]} & clusterware_start ${HOSTNAME_REMOTE_N[3]}
fi
echo "Cluster Status: "
echo "==================================================================================="
sudo crsctl check cluster -all
echo
echo "Clusterware (crs/has) service has been started on all nodes.... "
echo
iSHUTDOWN=0
iSTARTUP=1
START_MODE=normal
}
# Starts up all databases in UPGRADE mode
function startup_db_upgrade {
echo
echo "Starting databases with upgrade mode for [$NAME_LIST]"
echo "==================================================================================="
if [ "$DB_TYPE" == "rac" ] ; then
set_oracle_home_env $GORACLE_HOME $NAME_LIST
for NAME in $NAME_LIST
do
echo
echo "Progressing for database $NAME..."
echo "==================================================================================="
echo
set_oracle_home_env $GORACLE_HOME $NAME
export PATH=$GORACLE_HOME:/bin:$PATH
export ORACLE_HOME=$GORACLE_HOME
# $GORACLE_HOME/bin/srvctl start database -d $NAME
echo "Instance name: ${NAME}${NODE_POSITION}"
export ORACLE_SID=${NAME}${NODE_POSITION}
echo
echo "Database parameter [cluster_database] is setting false...."
echo "==================================================================================="
sqlplus '/ as sysdba' << EOD
startup
alter system set cluster_database=false scope=spfile;
shutdown immediate
startup upgrade
EOD
done
elif [ "$DB_TYPE" == "nonrac" ] ; then
for NAME in $NAME_LIST
do
export ORACLE_SID=$NAME
sqlplus '/ as sysdba' << EOD
startup upgrade
EOD
done
fi
echo
echo "All databases have been started in upgrade mode"
echo "==================================================================================="
}
function shutdown_db_normal
{
set_home_env
if [ "$DB_TYPE" == "rac" ] ; then
: '
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you want to stop database instance in all nodes or local node only? (all) [all]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you want to stop database instance in all nodes or local node only? (all) [all]: "
read INPUT?
fi
'
for NAME in $NAME_LIST
do
export PATH=$GORACLE_HOME:/bin:$PATH
export ORACLE_HOME=$GORACLE_HOME
echo "Instance name: ${NAME}${NODE_POSITION}"
export ORACLE_SID=${NAME}${NODE_POSITION}
sqlplus '/ as sysdba' << EOD
shutdown immediate
EOD
if [ "$OS_TYPE" == "Linux" ] ; then
vINSTANCE_ID=`ps -ef | grep pmon | grep -v grep | grep ${NAME} | grep -v ASM | awk '{ print $8 }' | cut -d '_' -f3 | sed 's/.\{1\}$//'`
elif [ "$OS_TYPE" == "AIX" ] ; then
vINSTANCE_ID=`ps -ef | grep pmon | grep -v grep | grep ${NAME} | grep -v ASM | awk '{ print $8 }' | cut -d '_' -f3 | sed 's/.\{1\}$//'`
fi
# if [ "${vINSTANCE_ID##*( )}" == "" ] || [ -z "$vINSTANCE_ID" ] ; then
# echo "Database $NAME is already down."
# srvctl status database -d $NAME -o immediate
# else
echo "Database [$NAME] is shutting down...."
echo "==================================================================================="
# if [ "$INPUT" == "all" ] || [ "${INPUT##*( )}" == "" ] ; then
srvctl stop database -d $NAME -o immediate
srvctl status database -d $NAME
# elif [ "$INPUT" == "local" ] ; then
# srvctl stop instance -d $NAME -i $NAME$NODE_POSITION -o immediate
# srvctl status database -d $NAME
# fi
# fi
done
elif [ "$DB_TYPE" == "nonrac" ] ; then
for NAME in $NAME_LIST
do
echo "Database [$NAME] is shutting down...."
echo "==================================================================================="
export ORACLE_SID=$NAME
export PATH=$GORACLE_HOME/bin:$GORACLE_HOME/OPatch:$PATH
if [ "$OS_TYPE" == "Linux" ] ; then
vINSTANCE_ID=`ps -ef | grep pmon | grep -v grep | grep ${NAME} | grep -v ASM | awk '{ print $8 }' | cut -d '_' -f3`
elif [ "$OS_TYPE" == "AIX" ] ; then
vINSTANCE_ID=`ps -ef | grep pmon | grep -v grep | grep ${NAME} | grep -v ASM | awk '{ print $8 }' | cut -d '_' -f3`
fi
if [ "${vINSTANCE_ID##*( )}" == "" ] || [ -z "$vINSTANCE_ID" ]; then
echo "Database $NAME is already down."
else
echo "Database [$NAME] is shutting down...."
echo "==================================================================================="
sqlplus '/ as sysdba' << EOD
shutdown immediate
EOD
fi
done
fi
echo
echo "All databases has been stopped..."
echo
}
function startup_db_normal
{
if [ "$DB_TYPE" == "rac" ] ; then
echo
set_oracle_home_env $GORACLE_HOME $NAME_LIST
for NAME in $NAME_LIST
do
export ORACLE_HOME=$GORACLE_HOME
export ORACLE_SID=${NAME}${NODE_POSITION}
echo "Oracle SID: $ORACLE_SID"
if [ "$iSTARTUP_DB_INST" == "patch" ] ; then
echo
echo "Database parameter [cluster_database] is setting true...."
echo "==================================================================================="
sqlplus '/ as sysdba' << EOD
alter system set cluster_database=true scope=spfile;
shutdown immediate
EOD
fi
echo
echo "Database $NAME is starting in normal mode...."
echo "==================================================================================="
set_oracle_home_env $GORACLE_HOME $NAME
${GORACLE_HOME}/bin/srvctl start database -d $NAME
echo
echo "Database $NAME Status:"
echo "==================================================================================="
${GORACLE_HOME}/bin/srvctl status database -d $NAME
done
elif [ "$DB_TYPE" == "nonrac" ] ; then
for NAME in $NAME_LIST
do
echo
echo "Database $NAME is starting in normal mode...."
echo "==================================================================================="
export ORACLE_SID=$NAME
if [ "$OS_TYPE" == "Linux" ] ; then
vINSTANCE_ID=`ps -ef | grep pmon | grep -v grep | grep $NAME | grep -v ASM | awk '{ print $8 }' | cut -d '_' -f3`
elif [ "$OS_TYPE" == "AIX" ] ; then
vINSTANCE_ID=`ps -ef | grep pmon | grep -v grep | grep $NAME | grep -v ASM | awk '{ print $9 }' | cut -d '_' -f3`
fi
if [ "${vINSTANCE_ID##*( )}" != "" ] || [ ! -z "$vINSTANCE_ID" ]; then
echo
echo "Database $NAME is already up."
echo "==================================================================================="
else
sqlplus '/ as sysdba' << EOD
startup
EOD
fi
done
fi
echo
echo "All databases have been started"
echo "==================================================================================="
iSTARTUP_DB_INST=normal
}
function backup_ocr
{
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
i=0
for NODENAME in $NODE_LIST
do
export ORACLE_SID=$GASM_INSTANCE
echo ${HOME_BACKUP_REMOTE_N[$i]}
echo "OCR Backup Details on $NODENAME"
echo "==================================================================================="
if [ ${NODENAME} == ${HOSTNAME_LOCAL_NODE} ] ; then
sudo $GGRID_HOME/bin/ocrconfig -export ${HOME_BACKUP_REMOTE_N[$i]}/OCRFile_expBackup_${NODENAME}_$DATENTIME.dmp
echo "OCR Export Backup: ${HOME_BACKUP_REMOTE_N[$i]}/OCRFile_expBackup_${NODENAME}_$DATENTIME.dmp"
sudo $GGRID_HOME/bin/ocrconfig -local -manualbackup
sudo $GGRID_HOME/bin/ocrconfig -local -showbackup
else
ssh -t ${NODENAME} "export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && sudo ocrconfig -export ${HOME_BACKUP_REMOTE_N[$i]}/OCRFile_expBackup_${NODENAME}_$DATENTIME.dmp && sudo $GGRID_HOME/bin/ocrconfig -local -manualbackup && $GGRID_HOME/bin/ocrconfig -local -showbackup && echo 'OCR Export Backup: ${HOME_BACKUP_REMOTE_N[$i]}/OCRFile_expBackup_${NODENAME}_$DATENTIME.dmp' && exit"
fi
i=$(( i + 1 ))
done
}
function home_backup_rac_remote
{
R_HOSTNAME=$1
HOME_BACKUP=$2
export ORACLE_SID=$GASM_INSTANCE
echo "Backup Location for ${R_HOSTNAME}: ${HOME_BACKUP}"
if [ ${R_HOSTNAME} == ${HOSTNAME_LOCAL_NODE} ] ; then
sleep 10
if [ "$OS_TYPE" == "Linux" ] ; then
# Grid Home
# all required system files
sudo tar -Pcf ${HOME_BACKUP}/etc_oracle.tar /etc/oracle/*
sudo tar -Pcf ${HOME_BACKUP}/etc_inittab.tar /etc/inittab
sudo tar -Pcf ${HOME_BACKUP}/etc_oratab.tar /etc/oratab
echo
echo $iECHO "\nLocal Node [$R_HOSTNAME] of Grid Home Backup is progressing..."
echo $iECHO "\n==================================================================================="
# echo
sudo tar -Pcf ${HOME_BACKUP}/GI_${R_HOSTNAME}_${TDATE}.tar $GGRID_HOME
echo
echo $iECHO "\nLocal Node [$R_HOSTNAME] of Grid Home backup is completed..."
echo
# Oracle Home
echo $iECHO "\nLocal Node [$R_HOSTNAME] Oracle home backup is progressing..."
# echo
# echo $iECHO "\n==================================================================================="
sudo tar -Pcf $HOME_BACKUP/OH_${R_HOSTNAME}_${TDATE}.tar $GORACLE_HOME
echo
echo $iECHO "\nLocal Node [$R_HOSTNAME] of Oracle Home backup is completed..."
echo
elif [ "$OS_TYPE" == "AIX" ] ; then
# Grid Home
# all required system files
sudo tar cfp ${HOME_BACKUP}/etc_oracle.tar /etc/oracle/*
sudo tar cfp ${HOME_BACKUP}/etc_inittab.tar /etc/inittab
sudo tar cfp ${HOME_BACKUP}/etc_oratab.tar /etc/oratab
sudo ocrconfig -export ${HOME_BACKUP}/OCRFile_expBackup_${R_HOSTNAME}_$DATENTIME.dmp
sudo ocrconfig -manualbackup
echo
echo $iECHO "\nLocal Node [$R_HOSTNAME] of Grid Home Backup is progressing..."
echo $iECHO "\n==================================================================================="
sudo tar cfp $HOME_BACKUP/GI_${R_HOSTNAME}_${TDATE}.tar $GGRID_HOME
echo
echo $iECHO "\nLocal Node [$R_HOSTNAME] of Grid Home backup is completed..."
# Oracle Home
echo
echo $iECHO "\nLocal Node [$R_HOSTNAME] Oracle home backup is progressing..."
echo
sudo tar cfp $HOME_BACKUP/OH_${R_HOSTNAME}_${TDATE}.tar $GORACLE_HOME
echo $iECHO "\nLocal Node [$R_HOSTNAME] of Oracle Home backup is completed...\n"
fi
else
if [ "$OS_TYPE" == "Linux" ] ; then
# Grid Home
# all required system files
ssh -t ${R_HOSTNAME} "sudo tar -Pcf ${HOME_BACKUP}/etc_oracle.tar /etc/oracle/* && sudo tar -Pcf ${HOME_BACKUP}/etc_inittab.tar /etc/inittab && sudo tar -Pcf ${HOME_BACKUP}/etc_oratab.tar /etc/oratab && exit"
# echo
echo $iECHO "\nNode [$R_HOSTNAME] of Grid Home Backup is progressing..."
echo $iECHO "\n==================================================================================="
ssh -t ${R_HOSTNAME} "sudo tar -Pcf $HOME_BACKUP/GI_${R_HOSTNAME}_${TDATE}.tar $GGRID_HOME && exit"
# sleep 2
echo
echo $iECHO "\nNode [$R_HOSTNAME] of Grid Home backup is completed..."
# Oracle Home
# echo
echo $iECHO "\nNode [$R_HOSTNAME] Oracle home backup is progressing..."
# echo
# echo $iECHO "\n==================================================================================="
ssh -t ${R_HOSTNAME} "sudo tar -Pcf $HOME_BACKUP/OH_${R_HOSTNAME}_${TDATE}.tar $GORACLE_HOME && exit"
# sleep 2
echo
echo $iECHO "\nNode [$R_HOSTNAME] of Oracle Home backup is completed..."
elif [ "$OS_TYPE" == "AIX" ] ; then
# Grid Home
# all required system files
ssh -t ${R_HOSTNAME} "sudo tar cfp ${HOME_BACKUP}/etc_oracle.tar /etc/oracle/* && sudo tar cfp ${HOME_BACKUP}/etc_inittab.tar /etc/inittab && sudo tar cfp ${HOME_BACKUP}/etc_oratab.tar /etc/oratab && exit"
echo
echo $iECHO "\nNode [$R_HOSTNAME] of Grid Home Backup is progressing..."
echo
# echo $iECHO "\n==================================================================================="
ssh -t ${R_HOSTNAME} "sudo tar cfp $HOME_BACKUP/GI_${R_HOSTNAME}_${TDATE}.tar $GGRID_HOME && exit"
# sleep 2
echo
echo $iECHO "\nNode [$R_HOSTNAME] of Grid Home backup is completed..."
# Oracle Home
echo
echo $iECHO "\nNode [$R_HOSTNAME] Oracle home backup is progressing..."
# echo
# echo $iECHO "\n==================================================================================="
ssh -t ${R_HOSTNAME} "sudo tar cfp $HOME_BACKUP/OH_${R_HOSTNAME}_${TDATE}.tar $GORACLE_HOME && exit"
# sleep 2
echo $iECHO "\nNode [$R_HOSTNAME] of Oracle Home backup is completed..."
fi
fi
iCOUNT=$((iCOUNT + 1))
# sleep until backup is done for all nodes
while [ ${NODE_NUMBER} == $iCOUNT ];
do
echo "Both node backup is done..."
sleep 10
done
}
# take oracle home/binary backup
function home_backup
{
patch_loc_validation
if [ "$DB_TYPE" == "rac" ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
vINSTANCE_ID=`ps -ef | grep smon | grep +ASM | awk '{ print $8 }' | cut -d '_' -f3 | sed 's/:\{1\}$//'`
elif [ "$OS_TYPE" == 'AIX' ] ; then
vINSTANCE_ID=`ps -ef | grep smon | grep +ASM | awk '{ print $9 }' | cut -d '_' -f3 | sed 's/:\{1\}$//'`
fi
if [ "${vINSTANCE_ID##*( )}" == "" ] || [ -z "$vINSTANCE_ID" ] ; then
echo
echo "It seems all services are down but recommnaded to start clusterware with unlock mode before starting backup and patching..."
echo $iECHO "1. crs will be rebooted \n2. crs will start with unlock mode"
echo "==================================================================================="
echo
START_MODE=normal
rac_startup
fi
echo "Stopping all services i.e. DB Instance, Listener..."
echo "==================================================================================="
# OCR Backup
backup_ocr
shutdown_db_normal
SHUTDOWN_MODE=unlock
rac_shutdown
fi
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you want to take Oracle Home/Binary Backup before procced to apply patch:(y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you want to take Oracle Home/Binary Backup before procced to apply patch:(y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "y" ] || [ "$INPUT" == "yes" ] || [ "${INPUT##*( )}" == "" ] ; then
echo "Thanks for confirmation...."
elif [ "$INPUT" == "n" ] || [ "$INPUT" == "no" ] ; then
echo $iECHO "This is highly recommanded to take home backup. Hope you already taken backup...\nPatching process will start without taking home backup.. "
return 1
fi
echo
echo "Starting Oracle Home/Binary Backup"
echo "==================================================================================="
if [ "$DB_TYPE" == "rac" ] ; then
if [ ${NODE_NUMBER} == 2 ] ; then
home_backup_rac_remote "${HOSTNAME_REMOTE_N[0]}" "${HOME_BACKUP_REMOTE_N[0]}" & home_backup_rac_remote "${HOSTNAME_REMOTE_N[1]}" "${HOME_BACKUP_REMOTE_N[1]}"
elif [ ${NODE_NUMBER} == 3 ] ; then
home_backup_rac_remote "${HOSTNAME_REMOTE_N[0]}" "${HOME_BACKUP_REMOTE_N[0]}" & home_backup_rac_remote "${HOSTNAME_REMOTE_N[1]}" "${HOME_BACKUP_REMOTE_N[0]}" & home_backup_rac_remote "${HOSTNAME_REMOTE_N[2]}" "${HOME_BACKUP_REMOTE_N[0]}"
elif [ ${NODE_NUMBER} == 4 ] ; then
home_backup_rac_remote "${HOSTNAME_REMOTE_N[0]}" "${HOME_BACKUP_REMOTE_N[0]}" & home_backup_rac_remote "${HOSTNAME_REMOTE_N[1]}" "${HOME_BACKUP_REMOTE_N[0]}" & home_backup_rac_remote "${HOSTNAME_REMOTE_N[2]}" "${HOME_BACKUP_REMOTE_N[0]}" & home_backup_rac_remote "${HOSTNAME_REMOTE_N[3]}" "${HOME_BACKUP_REMOTE_N[0]}"
fi
elif [ "$DB_TYPE" == "nonrac" ] ; then
shutdown_db_normal
vINSTANCE_ID=`ps -ef | grep tns | grep $GORACLE_HOME | grep -v grep | awk '{ print $9 }'`
if [ [ "${vINSTANCE_ID##*( )}" != "" ] || [ ! -z "$vINSTANCE_ID" ] ; ] ; then
stop_listener
fi
echo "Oracle Home backup is progressing....."
echo "==================================================================================="
if [ "$OS_TYPE" == "Linux" ] ; then
tar -Pcf $HOSTNAME_LOCAL_NODE/OH_${HOSTNAME_LOCAL_NODE}_${TDATE}.tar $GORACLE_HOME
elif [ "$OS_TYPE" == "AIX" ] ; then
tar cfp $HOSTNAME_LOCAL_NODE/OH_${HOSTNAME_LOCAL_NODE}_${TDATE}.tar $GORACLE_HOME
fi
echo $iECHO "\033[32m";
echo "Oracle and/or Grid Home binary backup is done. Backup Location: $HOSTNAME_LOCAL_NODE/OH_${HOSTNAME}_${TDATE}.tar"
echo $iECHO "\033[00m";
echo
fi
iHOME_BK=1
}
function patch_check_show
{
echo "Patch prerequisite check will perform following steps: "
echo "==================================================================================="
echo "1. Set required environment variable if needed"
echo "2. Create response file for GRID/DATABASE & JVM patch and it will help to avoid user input during patching"
echo "5. Check Prerequisite for GRID/DATABASE patch for all nodes in RAC. For Standalone will perform for ORACLE HOME"
echo "6. Check JVM patch "
echo "==================================================================================="
echo
}
function patch_apply_show
{
echo "Patch apply process will perform following steps: "
echo "==================================================================================="
echo "1. Set required environment variable if needed"
echo "2. Stop all services like database, listener, clusterware and so on"
echo "3. Take GRID/Oracle home/binary backup [for rac - required system file including OCR backup & perform backup in paralle for all nodes]"
echo "4. Start HAS for rac"
echo "5. Apply GRID/DATABASE patch sequentially in RAC. For Standalone will apply patch in ORACLE HOME"
echo "6. Apply JVM patch sequentially in RAC"
echo "7. For RAC, Reboot clusterware in parallel and open CRS with PATCH mode. For Standalone, Start database"
echo "8. Apply Post Patch - like for 12c, datapatch for 11g postinstall.sql and catbundle psu and last UTLRP package"
echo "But it will ask your confirmation on most of the steps... :)"
echo "==================================================================================="
echo
}
# Checks opatch functionality
function patch_check
{
patch_check_show
patch_loc_validation
if [ "$DB_TYPE" == "rac" ] ; then
i=0
for NODENAME in $NODE_LIST
do
if [ ${HOSTNAME_LOCAL_NODE} == ${NODENAME} ] ; then # local node
echo
echo "Checking prerequisite for GRID/DB patch on Local Node [${HOSTNAME_LOCAL_NODE}]: $DB_PATCH_ID"
echo "============================================================================================"
set_grid_env $GGRID_HOME $GASM_INSTANCE
cd ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID
which opatch
sudo $ORACLE_HOME/OPatch/opatchauto apply ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID -analyze
set_oracle_home_env $GORACLE_HOME $NAME_LIST
which opatch
echo
echo "Checking prerequisite for JVM patch on Local Node [${HOSTNAME_LOCAL_NODE}]: $JVM_PATCH_ID"
echo "==================================================================================="
cd ${PATCH_LOC_REMOTE_N[$i]}/$JVM_PATCH_ID
opatch prereq CheckConflictAgainstOHWithDetail -ph ./ -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch check failed"; }
i=$i+1
else # remote node
echo
echo "Checking prerequisite for GRID/DB patch on Remote Node [${NODENAME}]: $DB_PATCH_ID"
echo "==================================================================================="
set_grid_env $GGRID_HOME $GASM_INSTANCE
ssh -t ${NODENAME} "export ORACLE_HOME=$GGRID_HOME && export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH && cd ${PATCH_LOC_REMOTE_N[$i]}/${DB_PATCH_ID} && which opatch && sudo $ORACLE_HOME/OPatch/opatchauto apply ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID -analyze && exit"
set_oracle_home_env $GORACLE_HOME $NAME_LIST
which opatch
echo
echo "Checking prerequisite for JVM patch on Node [${HOSTNAME_LOCAL_NODE}]: $JVM_PATCH_ID"
echo "==================================================================================="
echo
ssh -t ${NODENAME} "export ORACLE_HOME=$GORACLE_HOME && export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH && cd ${PATCH_LOC_REMOTE_N[$i]}/${JVM_PATCH_ID} && opatch prereq CheckConflictAgainstOHWithDetail -ph ./ -invPtrLoc $ORACLE_HOME/oraInst.loc && exit"
i=$i+1
fi
done
elif [ "$DB_TYPE" == "nonrac" ] ; then
echo
echo "Checking prerequisite for DB patch on [${HOSTNAME_LOCAL_NODE}]: $DB_PATCH_ID"
echo "==================================================================================="
export PATH=$ORACLE_HOME/OPatch:$PATH
cd $PATCH_LOCATION/$DB_PATCH_ID
opatch prereq CheckConflictAgainstOHWithDetail -ph ./ -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch check failed"; return 1; }
#nonrac JVM Patch
echo
echo "Checking prerequisite for JVM patch on [${HOSTNAME_LOCAL_NODE}]: $JVM_PATCH_ID"
echo "==================================================================================="
set_oracle_home_env $GORACLE_HOME $NAME_LIST
which opatch
echo "Checking prerequisite for JVM patch: $JVM_PATCH_ID"
cd $PATCH_LOCATION/$JVM_PATCH_ID
opatch prereq CheckConflictAgainstOHWithDetail -ph ./ -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch check failed"; return 1; }
fi
}
function patch_apply
{
# show details step will be performed by this
patch_apply_show
check_prerequisite
iCHECK_PRE=1
set_env_variable
set_home_env
iSETENV=1
if [ "$DB_TYPE" == "rac" ] ; then
# if [ "$iHOME_BK" == 0 ] ; then
home_backup
START_MODE=has
# rac_startup
# elif [ "$iHOME_BK" == 1 ] ; then
START_MODE=has
rac_startup
# fi
elif [ "$DB_TYPE" == "nonrac" ] ; then
home_backup
fi
# shutdown_db_normal
patch_loc_validation
if [ "$DB_TYPE" == "rac" ] ; then
i=0
j=0
iCOUNT=0
for NODENAME in $NODE_LIST
do
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue applying patch for GRID/DB patch # ${DB_PATCH_ID} on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue applying patch for GRID/DB patch # ${DB_PATCH_ID} on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]:"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo
echo "Patching is progressing...."
echo "==================================================================================="
else
echo
echo "Canceling patching..."
i=$i+1
j=$(( j + 1 ))
continue
fi
if [ ${HOSTNAME_LOCAL_NODE} == ${NODENAME} ] ; then # local node
echo
echo "Patch Location: ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID"
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
which opatch
export ORACLE_SID=GASM_INSTANCE
echo "Applying GRID/DB patch on Local Node [${HOSTNAME_LOCAL_NODE}]: $DB_PATCH_ID"
echo "==================================================================================="
cd ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID
sudo $GGRID_HOME/OPatch/opatchauto apply ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID
echo
i=$i+1
else # remote node
echo
echo "Patch Location: ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID"
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
export ORACLE_SID=GASM_INSTANCE
echo "Applying GRID/DB patch on Remote Node [${NODENAME}]: $DB_PATCH_ID"
echo "==================================================================================="
ssh -t ${NODENAME} "export ORACLE_HOME=$GGRID_HOME && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && cd ${PATCH_LOC_REMOTE_N[$i]}/${DB_PATCH_ID} && which opatch && sudo $GGRID_HOME/OPatch/opatchauto apply ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID && exit"
i=$i+1
fi
echo $iSOUND "\007"
done
# JVM Patch for RAC
set_oracle_home_env $GORACLE_HOME $NAME_LIST
i=0
for NODENAME in $NODE_LIST
do
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue apply JVM patch # ${JVM_PATCH_ID} on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue apply JVM patch # ${JVM_PATCH_ID} on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]:"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo
echo "Patching is progressing...."
echo "==================================================================================="
else
echo
echo "Canceling patching..."
i=$i+1
j=$(( j + 1 ))
continue
fi
export PATH=$GORACLE_HOME/bin:$GORACLE_HOME/OPatch:$PATH
if [ ${HOSTNAME_LOCAL_NODE} == ${NODENAME} ] ; then # local node
echo
echo "Applying JVM patch on [${NODENAME}]: $JVM_PATCH_ID"
echo "==================================================================================="
cd ${PATCH_LOC_REMOTE_N[$i]}/$JVM_PATCH_ID
echo "Patch Path: ${PATCH_LOC_REMOTE_N[$i]}/$JVM_PATCH_ID"
$GORACLE_HOME/OPatch/opatch apply -local
i=$i+1
else # remote node
echo
echo "Applying JVM patch on [${NODENAME}]: $JVM_PATCH_ID"
echo "==================================================================================="
echo
echo "${PATCH_LOC_REMOTE_N[$i]}/$JVM_PATCH_ID"
ssh -t ${NODENAME} "export ORACLE_HOME=$GORACLE_HOME && export PATH=$GORACLE_HOME/bin:$GORACLE_HOME/OPatch:$PATH && cd ${PATCH_LOC_REMOTE_N[$i]}/${JVM_PATCH_ID} && $GORACLE_HOME/OPatch/opatch apply -local && exit"
i=$i+1
fi
echo $iSOUND "\007"
done
if [ $j != 0 ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "You canceled patching $j times. Do you want to continue for next step [ post patching] (y|n) [n] : " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "You canceled patching $j times. Do you want to continue for next step [ post patching] (y|n) [n] : \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "n" ] ; then
echo
echo "Post Patching is canceled by user.."
echo "==================================================================================="
return 1
else
echo
echo "Post Patching will continue...."
echo "==================================================================================="
fi
fi
SHUTDOWN_MODE=normal
rac_shutdown
START_MODE=patch
rac_startup
elif [ "$DB_TYPE" == "nonrac" ] ; then
stop_listener
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue DB patch # ${DB_PATCH_ID} on $HOSTNAME_LOCAL_NODE (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue DB patch # ${DB_PATCH_ID} on $HOSTNAME_LOCAL_NODE (y|n) [y]:\c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
cd $PATCH_LOCATION/$DB_PATCH_ID
echo
echo "Patch Location: $PATCH_LOCATION/$DB_PATCH_ID"
echo "DB patch $DB_PATCH_ID is progressing...."
echo "==================================================================================="
else
echo
echo "Patching is canceled by user..."
break
fi
echo $iSOUND "\007"
if [ "$DB_VERSION" == "11g" ] ; then
#-silent -ocmrf /home/oracle/ocm.rsp
#/u001/app/oracle/product/11.2.0.4/OPatch/ocm/bin/emocmrsp
$OPATCH apply -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch apply $DB_PATCH_ID failed"; } || { echo "User Responded with: N"; return 1; }
elif [ "$DB_VERSION" == "12c" ] ; then
$OPATCH apply -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch apply $DB_PATCH_ID failed"; } || { echo "User Responded with: N"; return 1; }
fi
echo $iSOUND "\007"
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you want to continue for JVM patch(y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you want to continue for JVM patch(y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "n" ] || [ "$INPUT" == "no" ] ; then
echo "User confirmed not to procced. Returing to main manu..."
manu
return 1
fi
echo "Applying JVM Patch $JVM_PATCH_ID"
echo "==================================================================================="
cd $PATCH_LOCATION/$JVM_PATCH_ID
if [ "$DB_VERSION" == "11g" ] ; then
# $OPATCH apply -silent -ocmrf /home/oracle/ocm.rsp -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch apply $JVM_PATCH_ID failed"; return 1; }
$OPATCH apply -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch apply $JVM_PATCH_ID failed"; return 1; }
elif [ "$DB_VERSION" == "12c" ] ; then
echo "patch command"
$OPATCH apply -invPtrLoc $ORACLE_HOME/oraInst.loc || { echo "opatch apply $JVM_PATCH_ID failed"; return 1; }
fi
fi
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you want to continue for post patch installation like datapatch | postinstall.sql? (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you want to continue for post patch installation like datapatch | postinstall.sql? (y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "n" ] || [ "$INPUT" == "no" ] ; then
echo
echo "User confirmed not to procced. Returing to main manu..."
echo "But it is mendatory to run post patch if you applied DB and JVM patch successfully... You can run it from main manu.."
echo "==================================================================================="
manu
return 1
else
psu_apply
fi
}
function psu_apply
{
patch_loc_validation
shutdown_db_normal
startup_db_upgrade
mkdir $HOME_BACKUP_LOCAL/"patch_log_"$TDATE
# if [ "$DB_TYPE" == "rac" ] ; then
for NAME in $NAME_LIST
do
set_oracle_home_env $GORACLE_HOME ${NAME}${NODE_POSITION}
export ORACLE_SID=${NAME}${NODE_POSITION}
if [ "$DB_VERSION" == "12c" ] ; then
echo
echo "datapatch is progressing on $NAME database"
echo "==================================================================================="
echo
cd $GORACLE_HOME/OPatch
./datapatch -verbose >> $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_datapatch.log"
echo
echo "datapatch is completed on $NAME database. Please check following log file - for details"
echo "Log File Path: $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_datapatch.log""
echo "==================================================================================="
echo
elif [ "$DB_VERSION" == "11g" ] ; then
echo
echo "Postinstall is progressing on $NAME database"
echo "==================================================================================="
echo
cd $GORACLE_HOME/sqlpatch/$JVM_PATCH_ID
$ORACLE_HOME/bin/sqlplus "/ as sysdba" @postinstall.sql >> $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_postinstall.log" << EOD
EOD
echo
echo "Postinstall is completed on $NAME database. Please check following log file - for details"
echo "Log File Path: $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_postinstall.log""
echo "==================================================================================="
echo
fi
done
echo "Starting database in normal mode..."
echo "==================================================================================="
iSTARTUP_DB_INST=patch
startup_db_normal
if [ "$DB_VERSION" == "11g" ] ; then
catbundle_apply
fi
echo $iSOUND "\007"
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you want to run UTLRP package for validated invalide objects? (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you want to run UTLRP package for validated invalide objects? (y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "y" ] || [ "$INPUT" == "yes" ] ; then
run_utlrp
else
echo $iECHO "This is recommanded to run this UTLRP package after patched or rollbacked...\nPlease run in from main manu.."
echo "==================================================================================="
fi
}
function catbundle_apply
{
cd $GORACLE_HOME/rdbms/admin
for NAME in $NAME_LIST
do
echo "Progressing catbundle PSU for $ORACLE_SID..."
echo "==================================================================================="
set_oracle_home_env $GORACLE_HOME ${NAME}${NODE_POSITION}
export ORACLE_SID=${NAME}${NODE_POSITION}
$ORACLE_HOME/bin/sqlplus "/ as sysdba" @catbundle.sql psu apply >> $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_psu_apply.log" << EOD
EOD
echo "===========================================================================================" >> $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_psu_apply.log"
echo
echo "Catbundle PSU for $ORACLE_SID is completed. Please check this logfile $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_psu_apply.log" for details"
echo "========================================================================================================================"
echo
done
}
# Run utlrp
function run_utlrp
{
if [ "$DB_TYPE" == "nonrac" ] ; then
startup_db_normal
fi
mkdir $HOME_BACKUP_LOCAL/"patch_log_"$TDATE
echo
echo "Running UTLRP Package..."
echo "==================================================================================="
cd $GORACLE_HOME/rdbms/admin
for NAME in $NAME_LIST
do
set_oracle_home_env $GORACLE_HOME ${NAME}${NODE_POSITION}
export ORACLE_SID=${NAME}${NODE_POSITION}
UNAME=`echo $NAME | tr '[:lower:]' '[:upper:]'`
echo
echo "Progressing UTLRP package for $ORACLE_SID..."
echo "==================================================================================="
echo
$ORACLE_HOME/bin/sqlplus "/ as sysdba" @?/rdbms/admin/utlrp.sql >> $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_utlrp.log" << EOD
EOD
echo "===========================================================================================" >> $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_utlrp.log"
echo
echo "UTLRP package applied successfully on $ORACLE_SID. Please check this logfile - $HOME_BACKUP_LOCAL/"patch_log_"$TDATE/${NAME}"_utlrp.log" for details"
echo "========================================================================================================================"
echo
done
echo
echo "UTLRP has been applied on all databases"
echo
}
function check_db_registry
{
echo
echo "Checking database registry..."
echo "==========================================================================================="
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Services [clusterware|database|listener] are up? do you want to start all of these services [database, clusterware] now? (y|n) [n]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Services [clusterware|database|listener] are up? do you want to start all of these services [database, clusterware] now? (y|n) [n]: \c"
read INPUT?
fi
if [ "$DB_TYPE" == "rac" ] ; then
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "n" ] ; then
echo
echo "Assuming all services are up..."
echo "==========================================================================================="
else
if [ "$OS_TYPE" == 'Linux' ] ; then
vINSTANCE_ID=`ps -ef | grep smon | grep +ASM | awk '{ print $8 }' | cut -d '_' -f3 | sed 's/:\{1\}$//'`
elif [ "$OS_TYPE" == 'AIX' ] ; then
vINSTANCE_ID=`ps -ef | grep smon | grep +ASM | awk '{ print $9 }' | cut -d '_' -f3 | sed 's/:\{1\}$//'`
fi
if [ "${vINSTANCE_ID##*( )}" == "" ] || [ -z "$vINSTANCE_ID" ] ; then
echo
echo "It seems all services are down so it will start first before procced..."
echo "==================================================================================="
echo
START_MODE=normal
rac_startup
fi
startup_db_normal
fi
elif [ "$DB_TYPE" == "nonrac" ] ; then
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "n" ] ; then
echo
echo "Assuming all services are up..."
echo "==========================================================================================="
else
echo "Thanks for confirmation..."
startup_db_normal
fi
fi
if [ "$DB_TYPE" == "rac" ] ; then
for NODENAME in $NODE_LIST
do
if [ ${HOSTNAME_LOCAL_NODE} == ${NODENAME} ] ; then # local node
echo
echo "Patch Summary for GRID_HOME on $NODENAME: (for details please run in seperate window $ opatch lsinv)"
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
echo "Which OPATCH:"
which opatch
echo "==========================================================================================="
echo
$GGRID_HOME/OPatch/opatch lsinventory -detail -oh $GGRID_HOME | grep "Database Patch Set"
echo
export PATH=$GORACLE_HOME/OPatch:$GORACLE_HOME/bin:$PATH
echo
echo "Patch Summary for ORACLE_HOME on $NODENAME: (for details please run in seperate window $ opatch lsinv)"
echo "Which OPATCH:"
which opatch
echo "==========================================================================================="
echo
$GORACLE_HOME/OPatch/opatch lsinventory | grep Patch
else # remote node
echo
echo "Patch Summary for GRID_HOME on $NODENAME: (for details please run in seperate window $ opatch lsinv)"
echo "==========================================================================================="
echo
ssh -t ${NODENAME} "export ORACLE_HOME=GGRID_HOME && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && echo 'Which OPatch: ' && which opatch && $GGRID_HOME/OPatch/opatch lsinventory -detail -oh $ORACLE_HOME | grep 'Database Patch Set' && exit"
echo
echo "Patch Summary for ORACLE_HOME on $NODENAME: (for details please run in seperate window $ opatch lsinv)"
echo "==========================================================================================="
echo
ssh -t ${NODENAME} "export PATH=$GORACLE_HOME/OPatch:$GORACLE_HOME/bin:$PATH && which opatch && $GORACLE_HOME/OPatch/opatch lsinventory -detail | grep Patch && exit"
fi
done
elif [ "$DB_TYPE" == "nonrac" ] ; then
echo
echo "Patch Summary for ORACLE_HOME: (for details please run in seperate window $ opatch lsinv)"
echo "==========================================================================================="
export PATH=$GORACLE_HOME/OPatch:$GORACLE_HOME/bin:$PATH
opatch lsinventory | grep Patch
fi
for NAME in $NAME_LIST
do
set_oracle_home_env $GORACLE_HOME $NAME
export ORACLE_SID=${NAME}${NODE_POSITION}
echo
echo "Oracle SID: $ORACLE_SID"
echo "Which OPATCH:"
which opatch
echo "==========================================================================================="
echo
sqlplus '/ as sysdba' << EOD
Select Name, DATABASE_ROLE, OPEN_MODE from V\$DATABASE;
col owner for a20
col object_name for a30
col object_type for a25
Select owner, object_name, object_type from dba_objects where status != 'VALID' order by 1,2,3;
Select status, count(1) from dba_objects group by status;
set linesize 200
col COMP_NAME for A40
SELECT COMP_NAME, VERSION, STATUS FROM SYS.DBA_REGISTRY;
set linesize 200
col ACTION_TIME for A30
col ACTION for A10
col VERSION for A25
col COMMENTS for A30
Select ACTION_TIME,ACTION,VERSION,COMMENTS from registry\$history order by 1;
EOD
if [ "$DB_VERSION" == "12c" ] ; then
export ORACLE_SID=${NAME}${NODE_POSITION}
echo "Oracle SID: $ORACLE_SID"
sqlplus '/ as sysdba' << EOD
set linesize 120
col DESCRIPTION for a50
col ACTION for a8
col STATUS for a8
col ACTION_TIME for a28
col VERSION for a8
Select PATCH_ID,PATCH_UID,VERSION,ACTION,STATUS,ACTION_TIME,substr(logfile,1,55) from DBA_REGISTRY_SQLPATCH order by 6,2,1;
EOD
fi
done
}
# Rollback patch
function patch_rollback
{
patch_loc_validation
if [ "$OS_TYPE" == 'Linux' ] ; then
vINSTANCE_ID=`ps -ef | grep smon | grep +ASM | awk '{ print $8 }' | cut -d '_' -f3 | sed 's/:\{1\}$//'`
elif [ "$OS_TYPE" == 'AIX' ] ; then
vINSTANCE_ID=`ps -ef | grep smon | grep +ASM | awk '{ print $9 }' | cut -d '_' -f3 | sed 's/:\{1\}$//'`
fi
shutdown_db_normal
if [ "$DB_TYPE" == "rac" ] ; then
if [ "${vINSTANCE_ID##*( )}" == "" ] || [ -z "$vINSTANCE_ID" ] ; then
START_MODE=normal
rac_startup
fi
# JVM Patch rollback for RAC
set_oracle_home_env $GORACLE_HOME $NAME_LIST
export PATH=$GORACLE_HOME/OPatch:$GORACLE_HOME/bin:$PATH
i=0
for NODENAME in $NODE_LIST
do
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue JVM patch # ${JVM_PATCH_ID} rollback on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: " INPUT
echo
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue JVM patch # ${JVM_PATCH_ID} rollback on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: \c"
read INPUT?
fi
: '
while true;
do
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue JVM patch # ${JVM_PATCH_ID} rollback on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: " INPUT
echo
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue JVM patch # ${JVM_PATCH_ID} rollback on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: \c"
read INPUT?
fi
#read -p "Do you wish to install this program?" yn
case "$INPUT" in
[Yy]* )
echo
echo "Patching rollback is progressing...."
echo "==================================================================================="
;;
[Nn]* )
echo
echo "Canceling patching rollback..."
i=$(( i + 1 ))
j=$(( j + 1 ))
echo $i
echo $j
break
;;
* ) echo "Please answer y|n|yes|no"
;;
esac
done
'
if [ "$INPUT" == "y" ] ; then
echo
echo "Patching rollback is progressing...."
echo "==================================================================================="
elif [ "$INPUT" == "n" ] ; then
echo
echo "Canceling patching rollback..."
echo
i=$i+1
j=$(( j + 1 ))
continue
fi
export PATH=$GORACLE_HOME/bin:$GORACLE_HOME/OPatch:$PATH
if [ ${HOSTNAME_LOCAL_NODE} == ${NODENAME} ] ; then # local node
echo
echo "Rolling back JVM patch on [${NODENAME}]: $JVM_PATCH_ID"
echo "==================================================================================="
cd ${PATCH_LOC_REMOTE_N[$i]}/$JVM_PATCH_ID
opatch rollback -id $JVM_PATCH_ID || { echo "Rollback JVM : $JVM_PATCH_ID failed";}
i=$i+1
else # remote node
cd ${PATCH_LOC_REMOTE_N[$i]}/$JVM_PATCH_ID
echo
echo "JVM Patch Location: ${PATCH_LOC_REMOTE_N[$i]}/$JVM_PATCH_ID"
echo
echo "Rolling back JVM patch on [${NODENAME}]: $JVM_PATCH_ID"
echo "==================================================================================="
echo
ssh -t ${NODENAME} "export ORACLE_HOME=$GORACLE_HOME && export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH && cd ${PATCH_LOC_REMOTE_N[$i]}/${JVM_PATCH_ID} && opatch rollback -id $JVM_PATCH_ID && exit"
i=$i+1
fi
done
# GI and DB Patch
i=0
for NODENAME in $NODE_LIST
do
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue for rolling back for GRID/DB patch # ${DB_PATCH_ID} on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue for rolling back for GRID/DB patch # ${DB_PATCH_ID} on Node ${HOSTNAME_REMOTE_N[$i]} (y|n) [y]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo
echo "Patching rollback is progressing...."
echo "==================================================================================="
else
echo
echo "Canceling patching rollback..."
j=$(( j + 1 ))
i=$i+1
continue
fi
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
if [ ${HOSTNAME_LOCAL_NODE} == ${NODENAME} ] ; then # local node
echo
echo "Patch Location : ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID"
echo "Rolling back GRID/DB patch on Local Node [${HOSTNAME_LOCAL_NODE}]: $DB_PATCH_ID"
echo "==================================================================================="
cd ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
echo "Patch Location: ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID"
which opatch
# sudo $GGRID_HOME/OPatch/opatchauto rollback ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID -nonrolling
sudo $GGRID_HOME/OPatch/opatchauto rollback ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID
echo
i=$i+1
else # remote node
echo
echo "Patch Location : ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID"
echo "Rolling back GRID/DB patch on Remote Node [${NODENAME}]: $DB_PATCH_ID"
echo "==================================================================================="
export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH
ssh -t ${NODENAME} "export ORACLE_HOME=$GGRID_HOME && export PATH=$GGRID_HOME/bin:$GGRID_HOME/OPatch:$PATH && cd ${PATCH_LOC_REMOTE_N[$i]}/${DB_PATCH_ID} && which opatch && sudo $GGRID_HOME/OPatch/opatchauto rollback ${PATCH_LOC_REMOTE_N[$i]}/$DB_PATCH_ID && exit"
i=$i+1
fi
done
if [ $j != 0 ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "You canceled patch rollback $j times. Do you want to continue for next step [ post patch deinstall] (y|n) [n] : " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "You canceled patch rollback $j times. Do you want to continue for next step [ post patch deinstall] (y|n) [n] : \c"
read INPUT?
fi
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "n" ] ; then
echo
echo "Post Patch deinstall is canceled by user.."
echo "==================================================================================="
return 1
else
echo
echo "Post Patch deinstall will continue...."
echo "==================================================================================="
fi
SHUTDOWN_MODE=normal
rac_shutdown
START_MODE=normal
rac_startup
# iSTARTUP_DB_INST=patch
# startup_db_normal
# iSTARTUP_DB_INST=normal
elif [ "$DB_TYPE" == "nonrac" ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue for rolling back for JVM patch # ${JVM_PATCH_ID} on Node ${HOSTNAME_LOCAL_NODE} (y|n) [y]: " INPUT
echo
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue for rolling back for JVM patch # ${JVM_PATCH_ID} on Node ${HOSTNAME_LOCAL_NODE} (y|n) [y]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo
echo "Patching rollback is progressing...."
echo "==================================================================================="
else
echo "Canceling patching rollback..."
return 1
fi
echo "Rolling back JVM patch # $JVM_PATCH_ID"
echo "==================================================================================="
echo
PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
opatch rollback -id $JVM_PATCH_ID || { echo "Rollback JVM : $JVM_PATCH_ID failed"; return 1; }
if [ "$OS_TYPE" == 'Linux' ] ; then
echo
read -p "Do you want to continue for rolling back for DB patch # ${DB_PATCH_ID} on Node ${HOSTNAME_LOCAL_NODE} (y|n) [y]: " INPUT
echo
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo
echo "Do you want to continue for rolling back for DB patch # ${DB_PATCH_ID} on Node ${HOSTNAME_LOCAL_NODE} (y|n) [y]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo
echo "Patching rollback is progressing...."
echo "==================================================================================="
else
echo "Canceling patching rollback..."
return 1
fi
echo "Rolling back DB patch # $DB_PATCH_ID"
echo "==================================================================================="
echo
PATH=$ORACLE_HOME/OPatch:$PATH
opatch rollback -id $DB_PATCH_ID || { echo "Rollback DB : $DB_PATCH_ID failed"; return 1; }
echo
echo "DB and JVM Patchs rolledback successfully!!!"
echo "==================================================================================="
echo
fi
#echo -en "\007"
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you want to continue post patch rollback?(y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you want to continue post patch rollback?(y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "y" ] || [ "$INPUT" == "yes" ] || [ "${INPUT##*( )}" == "" ] ; then
psu_rollback
else
echo
echo "This is mendatory to run post_patch after applying or rolling back patch....You may run it from main manu.."
return 1;
fi
}
function psu_rollback
{
patch_loc_validation
shutdown_db_normal
startup_db_upgrade
for NAME in $NAME_LIST
do
export ORACLE_SID=${NAME}${NODE_POSITION}
echo "Oracle SID: $ORACLE_SID"
if [ "$DB_VERSION" == "12c" ] ; then
echo
echo "datapatch is progressing for $NAME database..."
echo "==================================================================================="
echo
cd $ORACLE_HOME/OPatch
./datapatch -verbose
elif [ "$DB_VERSION" == "11g" ] ; then
echo
echo "postdeinstall is progressing for $NAME database..."
echo "==================================================================================="
echo
cd $ORACLE_HOME/sqlpatch/$JVM_PATCH_ID
sqlplus '/ as sysdba' << EOD
@postdeinstall.sql
EOD
shutdown_db_normal
startup_db_normal
UNAME=`echo $NAME | tr '[:lower:]' '[:upper:]'`
cd $ORACLE_HOME/rdbms/admin
echo
echo "@catbundle_PSU_${UNAME}_ROLLBACK.sql is progressing for $NAME database..."
echo "==================================================================================="
echo
sqlplus '/ as sysdba' << EOD
@catbundle_PSU_${UNAME}_ROLLBACK.sql
EOD
fi
done
if [ "$DB_TYPE" == "rac" ] ; then
iSTARTUP_DB_INST=patch
startup_db_normal
fi
echo
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you want to continue to run UTLRP package to validate for invalide objects?(y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you want to continue to run UTLRP package to validate for invalide objects?(y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "y" ] || [ "$INPUT" == "yes" ] || [ "${INPUT##*( )}" == "" ] ; then
run_utlrp
else
echo
echo "Highly recommanded to run this package. You may run it from main manu.."
echo
fi
}
function home_backup_location
{
if [ "$DB_TYPE" == "rac" ] ; then
echo
echo "Setting GRID/DATABASE Home backup location for all Nodes"
echo "==================================================================================="
i=0
for NODENAME in $NODE_LIST
do
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "GRID/DATABASE home backup location for ${HOSTNAME_REMOTE_N[$i]}: [${PATCH_LOC_REMOTE_N[$i]}]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "GRID/DATABASE home backup location for ${HOSTNAME_REMOTE_N[$i]}: [${PATCH_LOC_REMOTE_N[$i]}]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
HOME_BACKUP_REMOTE_N[$i]=${PATCH_LOC_REMOTE_N[$i]}
if [ ${HOME_BACKUP_LOCAL} == ${HOSTNAME_REMOTE_N[$i]} ] ; then
HOME_BACKUP_LOCAL=${PATCH_LOC_REMOTE_N[$i]}
fi
echo "Confirmed HOME backup location for ${HOSTNAME_REMOTE_N[$i]} : ${PATCH_LOC_REMOTE_N[$i]}"
else
HOME_BACKUP_REMOTE_N[$i]=$INPUT
echo "Confirmed HOME backup location for ${HOSTNAME_REMOTE_N[$i]}: ${HOME_BACKUP_REMOTE_N[$i]}"
if [ ${HOME_BACKUP_LOCAL} == ${HOSTNAME_REMOTE_N[$i]} ] ; then
HOME_BACKUP_LOCAL=$INPUT
fi
fi
i=$i+1
done
elif [ "$DB_TYPE" == "nonrac" ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Location for binary/home backup: [$HOME_BACKUP]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Location for binary/home backup: [$HOME_BACKUP]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Oracle home backup location: $HOME_BACKUP"
HOME_BACKUP_LOCAL=${HOME_BACKUP}
else
HOME_BACKUP=$INPUT
HOME_BACKUP_LOCAL=${HOME_BACKUP}
echo "HOME backup location: $HOME_BACKUP"
fi
fi
}
function patch_loc_validation
{
if [ "$iPATCH_LOCATION" == 0 ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "GRID/DB Patch Number:$DB_PATCH_ID [y or number]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "GRID/DB Patch Number:$DB_PATCH_ID [y or number]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Confirmed default db patch number: $DB_PATCH_ID"
else
DB_PATCH_ID=$INPUT
echo "DB Patch number: $DB_PATCH_ID"
fi
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "JVM Patch number: $JVM_PATCH_ID [y or number]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "JVM Patch number: $JVM_PATCH_ID [y or number]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Confirmed default jvm patch number: $JVM_PATCH_ID"
else
JVM_PATCH_ID=$INPUT
echo "JVM Patch number: $DB_PATCH_ID"
fi
# echo "\007"
if [ "$DB_TYPE" == "rac" ] ; then
echo
echo "Setting GRID/DATABASE Patch binary location for all Nodes"
echo "==================================================================================="
i=0
for NODENAME in $NODE_LIST
do
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Patch location for Node [${HOSTNAME_REMOTE_N[$i]}]: [${PATCH_LOC_REMOTE_N[$i]}]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Patch location for Node [${HOSTNAME_REMOTE_N[$i]}]: [${PATCH_LOC_REMOTE_N[$i]}]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Patch location for Node [${HOSTNAME_REMOTE_N[$i]}]: ${PATCH_LOC_REMOTE_N[$i]}"
else
PATCH_LOC_REMOTE_N[$i]=$INPUT
echo "Patch location for Node [${HOSTNAME_REMOTE_N[$i]}]: ${PATCH_LOC_REMOTE_N[$i]}"
fi
i=$i+1
done
elif [ "$DB_TYPE" == "nonrac" ] ; then
echo
echo "Setting Oracle patch location"
echo "==================================================================================="
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Patch location: [$PATCH_LOCATION]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Patch location: [$PATCH_LOCATION]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Confirmed default patch location: $PATCH_LOCATION"
else
PATCH_LOCATION=$INPUT
echo "Patch location: $PATCH_LOCATION"
fi
cd $PATCH_LOCATION
if [ -z "$( ls -lrt | grep $DB_PATCH_ID )" ] ; then
echo "DB patch location is not valid."
patch_loc_validation
fi
if [ -z "$( ls -lrt | grep $JVM_PATCH_ID )" ] ; then
echo "JVM patch location is not valid."
patch_loc_validation
fi
fi
home_backup_location
iPATCH_LOCATION=1
fi
}
# Check Prerequisite
function check_prerequisite
{
if [ "$iCHECK_PRE" == 1 ] ; then
return 1
fi
echo "Prerequsite Check:"
echo "==================================================================================="
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Has application been stopped?(y|n)[y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Has application been stopped?[y]: \c"
read INPUT?
fi
if [ "$INPUT" == "n" ] || [ "$INPUT" == "no" ] ; then
echo "Please contact with applicaton team to stop application before procced...[y]"
quit
else
echo "Thanks for confirmation..."
fi
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Have you created blackout and stopped OEM agent and ITM?(y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Have you created blackout and stopped OEM agent and ITM? (y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "n" ] || [ "$INPUT" == "no" ] ; then
echo "Please create blackout and stop OEM agent before procced..."
quit
else
echo "Thanks for confirmation..."
fi
# echo -en "\007"
echo
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Do you have enough free space on GRID/ORACLE Home filesystem [/u001 or /u01]? (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Do you have enough free space on GRID/ORACLE Home filesystem [/u001 or /u01]? (y|n) [y]: \c"
read INPUT?
fi
if [ "$INPUT" == "n" ] || [ "$INPUT" == "no" ] ; then
echo "Patching task will be failed...Try to make some room on /u001 or /u01"
return 1
else
echo "Thanks for confirmation..."
fi
# echo -en "\007"
echo
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Database Version:11g|12c: [$DB_VERSION] :" INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Database Version:11g|12c: [$DB_VERSION] : \c"
read INPUT?
fi
if [ "$INPUT" == "11g" ] || [ "$INPUT" == "12c" ] || [ "$INPUT" == "y" ] ; then
DB_VERSION=$INPUT
echo "DB Version: $DB_VERSION"
elif [ "${INPUT##*( )}" == "" ] ; then
echo "Confirmed Default DB Version: $DB_VERSION "
else
echo "Wrong Input...bye.."
quit
fi
}
function set_home_env
{
if [ "$iSET_HOME_ENV" == 0 ] ; then
# echo -en "\007"
if [ "$INPUT" == "nonrac" ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "ORACLE HOME PATH: [$ORACLE_HOME]?: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "ORACLE HOME PATH: [$ORACLE_HOME]?: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Confirmed default ORACLE_HOME: $ORACLE_HOME"
else
ORACLE_HOME=$INPUT
echo "ORACLE_HOME: $ORACLE_HOME"
fi
elif [ "$INPUT" == "rac" ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "ORACLE HOME PATH: [$ORACLE_HOME]?: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "ORACLE HOME PATH: [$ORACLE_HOME]?: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Confirmed default ORACLE_HOME: $GORACLE_HOME"
else
GORACLE_HOME=$INPUT
echo "ORACLE_HOME: $ORACLE_HOME"
fi
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "GRID HOME PATH: [$GGRID_HOME]?: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "GRID HOME PATH: [$GGRID_HOME]?: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Confirmed default GRID_HOME: $GGRID_HOME"
else
GGRID_HOME=$INPUT
echo "GRID_HOME: $GGRID_HOME"
fi
fi
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Database List on this Host [enter DB name with space]: [$NAME_LIST] :" INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Database List on this Host [enter DB name with space]: [$NAME_LIST] : \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Confirmed DB List: $NAME_LIST"
else
NAME_LIST=$INPUT
echo "Confirmed DB List: $NAME_LIST"
fi
iSET_HOME_ENV=1
fi
}
# Set Environment Variable
function set_env_variable
{
if [ "$iSETENV" == 1 ] ; then
return 1
fi
echo
echo "Please set/confirm environment variable"
echo "============================================================================================"
echo
OPATCH=$ORACLE_HOME/OPatch/opatch
echo "OPatch Details:"
echo "============================================================================================"
echo
export PATH=$ORACLE_HOME/OPatch:$PATH
which opatch
$OPATCH version
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Please verify required opatch version from readme file otherwise you will encounter error during patching. want to continue? (y|n) [y]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Please verify required opatch version from readme file otherwise you will encounter error during patching. want to continue? (y|n) [y]: \c"
read INPUT?
fi
if [ "${INPUT##*( )}" == "" ] || [ "$INPUT" == "y" ] ; then
echo "Thanks for confirmation..."
else
echo "Update the OPatch version then start again..."
quit
fi
patch_loc_validation
}
function stop_all_services
{
shutdown_db_normal
rac_shutdown
}
function start_all_services
{
rac_startup
startup_db_normal
}
function rac_home_backup
{
if [ "$DB_TYPE" == "rac" ] ; then
home_backup
elif [ "$DB_TYPE" == "nonrac" ] ; then
home_backup
fi
}
function manu
{
################
# clear
if [ "$DB_TYPE" == "nonrac" ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
echo -e "\033[32m";
read -p "Choose Option: [db_startup|db_shutdown|home_backup|patch_prerequisite|patch_apply|post_patch|run_utlrp|patch_rollback|postpatch_rollback|validation|quit]: " option
echo -e "\033[00m";
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "\033[32m";
echo "Choose Option: [db_startup|db_shutdown|home_backup|patch_prerequisite|patch_apply|post_patch|run_utlrp|patch_rollback|postpatch_rollback|validation|quit]: \c"
read option?
echo "\033[00m";
fi
elif [ "$DB_TYPE" == "rac" ] || [ "${DB_TYPE##*( )}" == "" ] || [ "$DB_TYPE" == "y" ] ; then
if [ "$OS_TYPE" == 'Linux' ] ; then
echo -e "\033[32m";
read -p "Choose Option: [service_start|service_stop|home_backup|patch_prerequisite|patch_apply|post_patch|run_utlrp|patch_rollback|postpatch_rollback|validation|quit]: " option
echo -e "\033[00m";
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "\033[32m";
echo "Choose Option: [service_start|service_stop|home_backup|patch_prerequisite|patch_apply|post_patch|run_utlrp|patch_rollback|postpatch_rollback|validation|quit]: \c"
read option?
echo "\033[00m";
fi
# echo -e "\033[00m";
else
echo "Wrong Input....Pleae try again..."
#set_home_env
return 1
fi
################
if [ "${option##*( )}" == "" ] ; then
echo "Wrong option selected. Please try again..."
manu
fi
#case "$1" in
case "$option" in
'db_startup')
startup_db_normal
manu
;;
'service_stop')
stop_all_services
manu
;;
'service_start')
start_all_services
manu
;;
'run_utlrp')
run_utlrp
manu
;;
'validation')
check_db_registry
manu
;;
'db_shutdown')
shutdown_db_normal
manu
;;
'home_backup')
rac_home_backup
manu
;;
'patch_prerequisite')
patch_check
manu
;;
'patch_apply')
patch_apply
manu
;;
'post_patch')
psu_apply
manu
;;
'patch_rollback')
patch_rollback
manu
;;
'postpatch_rollback')
psu_rollback
manu
;;
'quit')
quit
;;
*)
echo "Wrong option selected. Please try again..."
manu
esac
}
function quit
{
echo "Thank you so much for using Oracle DB Patching automation script..."
exit 1
}
##############################################################################################################
# main #
##############################################################################################################
# Must NOT be run as root
if [ "$(id -n -u)" != "oracle" ]
then
echo "This script must be run as oracle" 1>&2
exit 1
fi
clear
OS_PRINT=0
echo "Loading initial variable..."
echo "============================================================================================"
HOSTNAME=`hostname | awk -F . '{ print $1 }'`
echo "Hostname: $HOSTNAME"
OS_TYPE=`uname -a | awk ' { print $1} '`
echo "OS: $OS_TYPE"
ORACLE_HOME=`cat /etc/oratab | grep -v ASM | grep -v agent | grep "^[^#;]" | grep "^[^-;]" | awk '{ print $1 }' | cut -d ':' -f2 | sed 's/:\{1\}$//' | sort -u`
GORACLE_HOME=$ORACLE_HOME
ORACLE_HOME_COUNT=`cat /etc/oratab | grep -v ASM | grep -v agent | grep "^[^#;]" | grep "^[^-;]" | awk '{ print $1 }' | cut -d ':' -f2 | sed 's/:\{1\}$//' | sort -u | wc -l`
ORACLE_HOME_COUNT1=1
if [ "$ORACLE_HOME_COUNT" -gt "$ORACLE_HOME_COUNT1" ] ; then
GORACLE_HOME=${ORACLE_HOME}
echo "ORACLE_HOME:"
echo "$GORACLE_HOME"
if [ "$OS_TYPE" == 'Linux' ] ; then
read -p "Found more than one Oracle Home. Please select [patching will support one home]: " INPUT
elif [ "$OS_TYPE" == 'AIX' ] ; then
echo "Found more than one Oracle Home. Please select [patching will support one home]: \c"
read INPUT?
fi
ORACLE_HOME=$INPUT
GORACLE_HOME=$INPUT
fi
echo "ORACLE_HOME: $GORACLE_HOME"
HOME_BACKUP=/u01/software/patches/jan19
HOME_BACKUP_LOCAL=/u01/software/patches/jan19/28980120
echo "Oralce home backup: $HOME_BACKUP"
OPATCH=$ORACLE_HOME/OPatch/opatch
echo "OPatch Path: $OPATCH"
#JRE=`ls -l $ORACLE_HOME|grep jre1|awk -F" " '{ print $9 }'`
PATCH_LOCATION=/u01/software/patches/jan19/28980120
echo "Patch Location: $PATCH_LOCATION"
DB_PATCH_ID=28813884
echo "DB Patch #: $DB_PATCH_ID"
JVM_PATCH_ID=28790654
echo "JVM Patch #: $JVM_PATCH_ID"
DATENTIME=`date '+%d_%m_%Y_%H_%M_%S'`
TDATE=`date '+%m%d%y'`
DB_VERSION=`$GORACLE_HOME/OPatch/opatch lsinventory | awk '/^Oracle Database/ {print $NF}' | cut -d '.' -f1`
DB_VERSION1=g
DB_VERSION2=c
if [ "$DB_VERSION" == '12' ] ; then
DB_VERSION=$DB_VERSION"c"
elif [ "$DB_VERSION" == '11' ] ; then
DB_VERSION=$DB_VERSION"g"
fi
echo "DB Version: $DB_VERSION"
DB_ROLE=primary
echo "DB Role: $DB_ROLE"
vINSTANCE_ID=''
# All Flag Variable
iHOME_BK=0
iPATCH_LOCATION=0
iCHECK_PRE=0
iSETENV=0
iSETRACHOME=0
iSET_HOME_ENV=0
iSTARTUP_DB_INST='normal'
iSHUTDOWN_DB_INST='normal'
iSHUTDOWN=0
iSTARTUP=0
iSHUTDOWN_UNLOCK=0
iSTARTUP_PATCH=0
iCOUNT=0
if [ "$OS_TYPE" == 'Linux' ] ; then
export iECHO=-e
elif [ "$OS_TYPE" == 'AIX' ] ; then
export iECHO=""
fi
if [ "$OS_TYPE" == 'Linux' ] ; then
export iSOUND=-en
elif [ "$OS_TYPE" == 'AIX' ] ; then
export iSOUND=""
fi
# Host Name for RAC
HOSTNAME_LOCAL_NODE=`hostname | awk -F . '{print $1}'`
GASM_INSTANCE=`cat /etc/oratab | grep +ASM | awk '{ print $1 }' | cut -d ':' -f1 | sed 's/:\{1\}$//' | sort -u`
if [ "${GASM_INSTANCE##*( )}" != "" ] || [ ! -z "$GASM_INSTANCE" ]; then
# set_grid_env $GGRID_HOME $GASM_INSTANCE
# cat inventory file to fine node list
INVENTORY_LOC=`find / -name inventory.xml 2>/dev/null | grep oraInventory/ContentsXML/inventory.xml`
# NODE_NUMBER=`olsnodes -n | wc -l`
NODE_NUMBER=''
DB_TYPE=rac
#LOCAL_NODE
GGRID_HOME=`cat /etc/oratab | grep +ASM | awk '{ print $1 }' | cut -d ':' -f2 | sed 's/:\{1\}$//' | sort -u`
GASM_INSTANCE=`cat /etc/oratab | grep +ASM | awk '{ print $1 }' | cut -d ':' -f1 | sed 's/:\{1\}$//' | sort -u`
NODE_POSITION=`cat /etc/oratab | grep +ASM | awk '{ print $1 }' | cut -d ':' -f1 | sed 's/:\{1\}$//' | tr -cd '[[:digit:]]'`
GORACLE_HOME=`cat /etc/oratab | grep -v ASM | grep -v agent | grep "^[^#;]" | grep "^[^-;]" | awk '{ print $1 }' | cut -d ':' -f2 | sed 's/:\{1\}$//' | sort -u`
# NODE_NUMBER=`olsnodes -n | wc -l`
NODE_NUMBER=`cat "$INVENTORY_LOC" | grep "NODE NAME" | awk '!seen[$0]++' | cut -d '"' -f2 | sed 's/"\{1\}$//' | wc -l`
NODE_LIST=`cat $INVENTORY_LOC | grep "NODE NAME" | awk '!seen[$0]++' | cut -d '"' -f2 | sed 's/"\{1\}$//' | awk '{print}' ORS=' '`
PATCH_LOC_LOCAL_NODE=/u01/software/patches/jan19/28980120
SHUTDOWN_MODE=normal
START_MODE=normal
#EMOTE_NODE
HOSTNAME_REMOTE_N1=''
HOSTNAME_REMOTE_N2=''
HOSTNAME_REMOTE_N3=''
HOSTNAME_REMOTE_N[0]=''
HOSTNAME_REMOTE_N[1]=''
HOSTNAME_REMOTE_N[2]='';
HOSTNAME_REMOTE_N[3]=''
PATCH_LOC_REMOTE_N[0]=/u01/software/patches/jan19/28980120
PATCH_LOC_REMOTE_N[1]=''
PATCH_LOC_REMOTE_N[2]=''
PATCH_LOC_REMOTE_N[3]=''
HOME_BACKUP_REMOTE_N[0]=''
HOME_BACKUP_REMOTE_N[1]=''
HOME_BACKUP_REMOTE_N[2]=''
HOME_BACKUP_REMOTE_N[3]=''
i=0
for NODENAME in $NODE_LIST
do
HOSTNAME_REMOTE_N[$i]=$NODENAME
echo "NODE$(($i+1)) Hostname: ${HOSTNAME_REMOTE_N[$i]}"
i=$i+1
done
echo "LOCAL NODE : $HOSTNAME_LOCAL_NODE"
echo "GRID HOME: $GGRID_HOME"
echo "ORACLE_HOME: $GORACLE_HOME"
else
DB_TYPE=nonrac
fi
echo "DB TYPE: $DB_TYPE"
if [ "$OS_TYPE" == "Linux" ] ; then
LISTENER_NAME=`ps -ef | grep tns | grep $ORACLE_HOME | grep -v grep | awk '{ print $9 }'`
elif [ "$OS_TYPE" == "AIX" ] ; then
LISTENER_NAME=`ps -ef | grep tns | grep $ORACLE_HOME | grep -v grep | awk '{ print $10 }'`
fi
if [ "$DB_TYPE" == "rac" ] ; then
NAME_LIST=`cat /etc/oratab | grep -v ASM | grep "^[^#;]" | grep -v agent | grep $GORACLE_HOME | grep "^[^-;]" | awk '{ print $1 }' | cut -d ':' -f1 | sed 's/[0-9]*//g' | sort -u | awk '{print}' ORS=' '`
echo "Database List on this server: $NAME_LIST"
else
NAME_LIST=`cat /etc/oratab | grep -v ASM | grep "^[^#;]" | grep -v agent | grep $GORACLE_HOME | grep "^[^-;]" | awk '{ print $1 }' | cut -d ':' -f1 | sed 's/:\{1\}$//' | awk '{print}' ORS=' '`
echo "Database List on this server: $NAME_LIST"
echo "Listener List: ${LISTENER_NAME}"
fi
manu
If you need this script please make a request on below message with your email address.

