#!/bin/sh # $Header: db_begin_bkup.sh,v 1.2 2002/11/20 02:02:49 $ # #bcpyrght #*************************************************************************** #* $VRTScprght: Copyright 1993 - 2007 Symantec Corporation, All Rights Reserved $ * #*************************************************************************** #ecpyrght # # db_begin_bkup # # This script is called by NetBackup when bpbkar is started up on the backup # host. The script is used when processing Split Mirror backup classes, to # place an oracle database in backup mode. # # To function correctly, this script: # * must have the appropriate values defined in either the # "Files" section of the class attributes, or in the # "CUSTOMIZATION" section of this script. # * must be executable by the root user # * should exit with 0 upon successful completion # # CAUTION: writing anything to stdout or stderr can cause backup problems so # direct any output to /dev/null or the file defined by DB_HOST_OUTF # to catpure debugging information. # ----------------------------------------------------------------------------- # FUNCTION get_tablespace_list # # Get the list of tablespaces. # ----------------------------------------------------------------------------- get_tablespace_list() { $ECHO "" $ECHO "`$TIME` ---------------------------" $ECHO "`$TIME` get_tablespace_list() START" $ECHO "`$TIME` ---------------------------" $ECHO "" /bin/rm -f $TABLES_FILE $LIST_FILE /bin/rm -f $CMDF /bin/touch $LIST_FILE /bin/chown $ORACLE_DBA $LIST_FILE /bin/chmod 644 $LIST_FILE $ECHO "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >>$CMDF $ECHO "export LD_LIBRARY_PATH" >>$CMDF $ECHO "$SQLCMD \"/as sysdba\" <>$CMDF $ECHO "set echo on;" >>$CMDF # $ECHO "connect internal;" >>$CMDF $ECHO "select distinct 'TABLE ' || tablespace_name from sys.dba_data_files;" >>$CMDF $ECHO "exit;" >>$CMDF $ECHO "EOF" >>$CMDF /bin/su $ORACLE_DBA -c "/bin/sh $CMDF" >>$LIST_FILE 2>>$LIST_FILE STAT=$? if [ ${STAT} -ne 0 ] then /bin/cat $LIST_FILE $ECHO "" $ECHO "`$TIME` Could not su to ${ORACLE_DBA}." abort fi $ECHO "" $ECHO "`$TIME` Database select tablespace_name command output:" $ECHO "" /bin/cat $LIST_FILE #The following line failed for me, so i had to change to it. # grep "^TABLE " $LIST_FILE |sed 's/^TABLE //g' > $TABLES_FILE grep "TABLE" $LIST_FILE |grep -v "TABLESPACE_NAME"|awk '{print $2}' > $TABLES_FILE if [ $? -ne 0 ] then # The grep failed, so the select for the tablespace list failed. $ECHO "" $ECHO "`$TIME` Could not get tablespace list." abort fi /bin/chmod 644 $TABLES_FILE $ECHO "" $ECHO "`$TIME` -------------------------" $ECHO "`$TIME` get_tablespace_list() END" $ECHO "`$TIME` -------------------------" $ECHO "" } # ----------------------------------------------------------------------------- # FUNCTION alter_tablespace_begin_backup # # Put the tablespaces in backup mode. # ----------------------------------------------------------------------------- alter_tablespace_begin_backup() { $ECHO "" $ECHO "`$TIME` -------------------------------------" $ECHO "`$TIME` alter_tablespace_begin_backup() START" $ECHO "`$TIME` -------------------------------------" $ECHO "" /bin/rm -f $WORKF /bin/rm -f $CMDF $ECHO "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >>$CMDF $ECHO "export LD_LIBRARY_PATH" >>$CMDF $ECHO "$SQLCMD \"/as sysdba\" <>$CMDF # $ECHO "connect internal;" >>$CMDF cat $TABLES_FILE | while read TBLSPACE do $ECHO "alter tablespace $TBLSPACE begin backup;" >>$CMDF done $ECHO "exit" >>$CMDF $ECHO "EOF" >>$CMDF /bin/su $ORACLE_DBA -c "/bin/sh $CMDF" >>$WORKF 2>>$WORKF STAT=$? if [ ${STAT} -ne 0 ] then /bin/cat $WORKF $ECHO "" $ECHO "`$TIME` Could not su to ${ORACLE_DBA}." abort fi $ECHO "" $ECHO "`$TIME` Database begin backup command output:" $ECHO "" /bin/cat $WORKF # Look for errors of the form "ORA-00000". STAT=`egrep "(ORA|DBA|SQL|LCC|MGR)-[0-9]" $WORKF|wc -l` if [ ${STAT} -ne 0 ] then $ECHO "" $ECHO "`$TIME` Could not put database ${ORACLE_SID} in backup mode." abort else $ECHO "" $ECHO "`$TIME` Database ${ORACLE_SID} was put in backup mode." fi $ECHO "" $ECHO "`$TIME` -----------------------------------" $ECHO "`$TIME` alter_tablespace_begin_backup() END" $ECHO "`$TIME` -----------------------------------" $ECHO "" } # ----------------------------------------------------------------------------- # FUNCTION abort # # Exit the script. # ----------------------------------------------------------------------------- abort() { $ECHO "" $ECHO "===================================================================" $ECHO "`$TIME` END ${MYNAME} exit status 1" $ECHO "===================================================================" $ECHO "" if [ "${MAIL_ADDR_FAILURE}" != "xxxxxx" ] then # Mail the output to someone. # CAUTION: Some platforms do not allow the -s parameter on mail. if [ $SUBJECT -eq 1 ] then cat $DB_HOST_OUTF | $MAIL -s "${MYNAME} exit 1" $MAIL_ADDR_FAILURE else cat $DB_HOST_OUTF | $MAIL $MAIL_ADDR_FAILURE fi fi sleep 1 exit 1 } # ----------------------------------------------------------------------------- # FUNCTION validate_params # # Validate input arguments to the script. # ----------------------------------------------------------------------------- validate_params() { $ECHO "`$TIME` ORACLE_DBA = ${ORACLE_DBA}" $ECHO "`$TIME` ORACLE_BASE = ${ORACLE_BASE}" $ECHO "`$TIME` ORACLE_HOME = ${ORACLE_HOME}" $ECHO "`$TIME` ORACLE_SID = ${ORACLE_SID}" $ECHO "`$TIME` SQLCMD = ${SQLCMD}" $ECHO "`$TIME` ORACLE_INIT = ${ORACLE_INIT}" $ECHO "`$TIME` LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}" $ECHO "" $ECHO "`$TIME` MAIL_ADDR_SUCCESS = ${MAIL_ADDR_SUCCESS}" $ECHO "`$TIME` MAIL_ADDR_FAILURE = ${MAIL_ADDR_FAILURE}" $ECHO "" if [ "$ORACLE_DBA" = "xxxxxx" ] then $ECHO "`$TIME` The ORACLE_DBA variable is not set" $ECHO $USAGE abort fi if [ "$ORACLE_BASE" = "xxxxxx" ] then $ECHO "`$TIME` The ORACLE_BASE variable is not set" $ECHO $USAGE abort fi if [ "$ORACLE_HOME" = "xxxxxx" ] then $ECHO "`$TIME` The ORACLE_HOME variable is not set" $ECHO $USAGE abort fi if [ "$ORACLE_SID" = "xxxxxx" ] then $ECHO "`$TIME` The ORACLE_SID variable is not set" $ECHO $USAGE abort fi if [ "$SQLCMD" = "xxxxxx" ] then $ECHO "`$TIME` The SQLCMD variable is not set" $ECHO $USAGE abort fi if [ ! -f ${SQLCMD} ] then $ECHO "`$TIME` SQLCMD ${SQLCMD} not found" $ECHO $USAGE abort fi if [ ! -f ${ORACLE_INIT} ] then $ECHO "`$TIME` ORACLE_INIT ${ORACLE_INIT} not found" $ECHO $USAGE abort fi if [ ! -d ${LD_LIBRARY_PATH} ] then $ECHO "`$TIME` LD_LIBRARY_PATH ${LD_LIBRARY_PATH} not found" $ECHO $USAGE abort fi if [ ${SMONPROC} -eq 0 ]; then $ECHO "`$TIME` Database ${ORACLE_SID} is down." abort fi } # ----------------------------------------------------------------------------- # Main script execution begins here. # ----------------------------------------------------------------------------- MYNAME=$0 USAGE="USAGE: $MYNAME -user -home \n \t -base -sid \n \t[-init ]\n \t[-sqlcmd ]\n \t[-mail_succ ] [-mail_fail ]" ECHO=/bin/echo TIME='/bin/date +%T' if [ -x /usr/bin/mailx ] then MAIL=/usr/bin/mailx SUBJECT=1 elif [ -x /usr/ucb/mail ] then MAIL=/usr/ucb/mail SUBJECT=1 elif [ -x /usr/bin/mail ] then MAIL=/usr/bin/mail SUBJECT=0 else MAIL=/bin/mail SUBJECT=0 fi if [ "$#" -eq 0 ] ; then $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi # Process options while true do if [ "$#" -eq 0 ] ; then break fi case "$1" in "-user") if [ "$#" -eq 1 ] ; then $ECHO "oracle user not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi ORACLE_DBA=$2 shift ;; "-base") if [ "$#" -eq 1 ] ; then $ECHO "oracle base not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi ORACLE_BASE=$2 shift ;; "-home") if [ "$#" -eq 1 ] ; then $ECHO "oracle home not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi ORACLE_HOME=$2 shift ;; "-sid") if [ "$#" -eq 1 ] ; then $ECHO "oracle_sid not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi ORACLE_SID=$2 shift ;; "-init") if [ "$#" -eq 1 ] ; then $ECHO "oracle_init not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi ORACLE_INIT=$2 shift ;; "-sqlcmd") if [ "$#" -eq 1 ] ; then $ECHO "sqlcmd not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi SQLCMD=$2 shift ;; "-class") if [ "$#" -eq 1 ] ; then $ECHO "class name not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi CLASSNAME=$2 shift ;; "-class_in_control") if [ "$#" -eq 1 ] ; then $ECHO "class in control not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi CLASS_IN_CONTROL=$2 shift ;; "-mail_succ") if [ "$#" -eq 1 ] ; then $ECHO "mailid not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi MAIL_ADDR_SUCCESS=$2 shift ;; "-mail_fail") if [ "$#" -eq 1 ] ; then $ECHO "mailid not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi MAIL_ADDR_FAILURE=$2 shift ;; "-method") if [ "$#" -eq 1 ] ; then $ECHO "method not specified" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 fi METHOD=$2 shift ;; *) $ECHO "unknown option: $1" $ECHO "" $ECHO $USAGE $ECHO "" exit 1 ;; esac # get next option shift done # ----------------------------------------------------------------------------- # ======== CUSTOMIZATION SECTION ======== # ----------------------------------------------------------------------------- # # You must supply default values for the following variables: # ORACLE_DBA, ORACLE_HOME, ORACLE_BASE, ORACLE_SID # # Please verify the script selected default values for the following # variables are appropriate for your configuration: # ORACLE_INIT, SQLCMD, PSCMD, LD_LIBRARY_PATH, # MAIL_ADDR_SUCCESS, MAIL_ADDR_FAILURE # # Please consult the documentation preceding each variable below for details. # ----------------------------------------------------------------------------- # Replace the default ORACLE_DBA value xxxxxx below with the oracle # administrator's user name. # ----------------------------------------------------------------------------- ORACLE_DBA=${ORACLE_DBA:=oracle} # ----------------------------------------------------------------------------- # Replace the xxxxxx in ORACLE_BASE with the directory at the top of the # Oracle software and administrative file structure. The recommended value # from Oracle is /MOUNTPOINT/app/oracle. # For example: ORACLE_BASE=/u01/app/oracle # ----------------------------------------------------------------------------- ORACLE_BASE=${ORACLE_BASE:=/u01/app/oracle} export ORACLE_BASE # ----------------------------------------------------------------------------- # Replace the xxxxxx in ORACLE_HOME with the directory containing the Oracle # software for a given Oracle Server release. The recommended value from # Oracle is ${ORACLE_BASE}/product/RELEASE. # For example: ORACLE_HOME=${ORACLE_BASE}/product/8.0.3 # ----------------------------------------------------------------------------- ORACLE_HOME=${ORACLE_HOME:=/u01/app/oracle/product/10.2.0/db_1} export ORACLE_HOME # ----------------------------------------------------------------------------- # Replace the xxxxxx in ORACLE_SID with the Oracle database identifier. # ----------------------------------------------------------------------------- ORACLE_SID=${ORACLE_SID:=orcl} export ORACLE_SID # ----------------------------------------------------------------------------- # Replace the default SQLCMD value xxxxxx below with the Oracle admin command # path. # ----------------------------------------------------------------------------- SQLCMD=${SQLCMD:=${ORACLE_HOME}/bin/sqlplus} # ----------------------------------------------------------------------------- # Verify the default value for ORACLE_INIT is appropriate for your oracle # installation. # ----------------------------------------------------------------------------- #ORACLE_INIT=${ORACLE_INIT:=${ORACLE_BASE}/admin/${ORACLE_SID}/pfile/init${ORACLE_SID}.ora} ORACLE_INIT=${ORACLE_INIT:=${ORACLE_HOME}/admin/${ORACLE_SID}/pfile/init.ora} # ----------------------------------------------------------------------------- # If mail is to be delivered upon successful execution of this script, replace # the default MAIL_ADDR_SUCCESS value xxxxxx with a mail address. If mail is # to be delivered upon failed execution of this script, replace the default # MAIL_ADDR_FAILURE value xxxxxx with a mail address. # ----------------------------------------------------------------------------- MAIL_ADDR_SUCCESS=${MAIL_ADDR_SUCCESS:=root@localhost} MAIL_ADDR_FAILURE=${MAIL_ADDR_FAILURE:=root@localhost} # ----------------------------------------------------------------------------- # Verify the default value for PSCMD is appropriate for the local operating # system. # ----------------------------------------------------------------------------- PSCMD="/bin/ps -ef" # ----------------------------------------------------------------------------- # Verify the default value for LD_LIBRARY_PATH is appropriate for your # configuration. # ----------------------------------------------------------------------------- LD_LIBRARY_PATH=${LD_LIBRARY_PATH:=${ORACLE_HOME}/lib} export LD_LIBRARY_PATH # ----------------------------------------------------------------------------- # ======== END OF CUSTOMIZATION SECTION ======== # ----------------------------------------------------------------------------- CONTROL_DIR=/tmp/ORACLE_BACKUP # need to determine applicability TABLES_FILE=${CONTROL_DIR}/tablespaces.${ORACLE_SID} CMDF=${CONTROL_DIR}/ora_cmd.${ORACLE_SID} LIST_FILE=${CONTROL_DIR}/tblspace_list.${ORACLE_SID} DB_HOST_OUTF=${CONTROL_DIR}/db_begin_bkup.${ORACLE_SID} WORKF=${CONTROL_DIR}/db_cmd_output.${ORACLE_SID} SMONPROC=`${PSCMD}|grep "smon_${ORACLE_SID}"|grep -v grep|wc -l` # #Need to do something about log file cleanup. # if [ -f $DB_HOST_OUTF ]; then /bin/rm -f $DB_HOST_OUTF fi if [ ! -d $CONTROL_DIR ]; then /bin/mkdir $CONTROL_DIR /bin/chmod 755 $CONTROL_DIR fi if [ ! -f $DB_HOST_OUTF ]; then /bin/touch $DB_HOST_OUTF fi $ECHO "" $ECHO "===================================================================" $ECHO "`date` START ${MYNAME}" $ECHO "===================================================================" $ECHO "" validate_params # # Place the DB in "hot backup" mode using the "alter tablespace begin backup". # if [ ${SMONPROC} -eq 0 ]; then $ECHO "`$TIME` Cannot do hot backup. DB not active." abort else get_tablespace_list alter_tablespace_begin_backup fi $ECHO "" $ECHO "===================================================================" $ECHO "`date` END ${MYNAME}" $ECHO "===================================================================" $ECHO "" if [ "${MAIL_ADDR_SUCCESS}" != "xxxxxx" ]; then # Mail the output to someone. # CAUTION: Some platforms do not allow the -s parameter on mail. if [ $SUBJECT -eq 1 ]; then cat $DB_HOST_OUTF | $MAIL -s "${MYNAME} exit 0" $MAIL_ADDR_SUCCESS else cat $DB_HOST_OUTF | $MAIL $MAIL_ADDR_SUCCESS fi fi exit 0