📄 oraback.sh
字号:
#Try to find the appropriate sql command to use [ -f $ORACLE_HOME/bin/sqldba ] && SVRMGR=sqldba [ -f $ORACLE_HOME/bin/svrmgrl ] && SVRMGR=svrmgrl [ -f $ORACLE_HOME/bin/svrmgr30 ] && SVRMGR=svrmgr30 if [ -z "$SVRMGR" ] ; then Log_error 1 "$ORACLE_SID has an invalid working directory!" continue fi export CWD ORACLE_SID ORACLE_HOME SVRMGR mkdir $CWD 2>/dev/null echo " Checking the status of Oracle instance $ORACLE_SID.."|$TLOG chmod 775 $CWD ; chgrp $DBAGROUP $CWD PATH=$ORIG_PATH:$ORACLE_HOME/bin ; export PATH #This command will only work if the database is up #and that's exactly what I'm using it for, to see if it's up $SVRMGR << EOF_UP >$TMP/$X.databaseup 2>&1connect internal;select * from sys.dba_data_files;exit;EOF_UP Error_chk $TMP/$X.databaseup DBUP=`grep -i '[1-9][0-9]* rows selected\.' $TMP/$X.databaseup` if [ -n "$DBUP" ] ; then #Database is UP DB_UP=2 echo " Oracle instance $ORACLE_SID appears to be running..."|$TLOG #Make list of tablespaces $SVRMGR <<EOF_XTBS >$TMP/$X.tbs.tmpconnect internal;select tablespace_name, file_name, file_id from sys.dba_data_files;exit;EOF_XTBS awk 'NF == 3 && $2 ~ /\// {print $1":"$2":"$3}' $TMP/$X.tbs.tmp \ > $TMP/$X.tbs Error_chk $TMP/$X.tbs.tmp #Find out which datafiles are read-write and read-only $SVRMGR <<EOF_TB_READ >$TMP/$X.tbs.wrconnect internal;select name, enabled from v\$datafile;exit;EOF_TB_READ #Add this to the tablespace.list file cat $TMP/$X.tbs|while read LINE do FILE=`echo $LINE|awk -F: '{print $2}'` FILENUM=`echo $LINE|awk -F: '{print $3}'` STATUS=`grep "${FILE}.*WRITE" $TMP/$X.tbs.wr` [ -n "$STATUS" ] && STATUS=READWRITE || STATUS=READONLY echo "$LINE:$STATUS" done | sort >$CWD/$TBLSPACE_LIST #Get names of online redologs $SVRMGR <<EOF_LOGFILE > $TMP/$X.rdlconnect internal;select member from v\$logfile ;exit;EOF_LOGFILEcp $TMP/$X.rdl $TMP/backup.$X.rdl egrep '/|\\' $TMP/$X.rdl |grep -v "PL.SQL" > $CWD/$REDOLOGS_LIST Error_chk $TMP/$X.rdl #List archiving info $SVRMGR <<EOF_ARCHIVE >$TMP/$X.lfconnect internal;archive log list;exit;EOF_ARCHIVE awk '/^Ar/ {print $3}' $TMP/$X.lf |sed "s-\?-$ORACLE_HOME-" \ > $CWD/$LOGFILE_LIST Error_chk $TMP/$X.lf LOGMODE=`egrep -i ' log mode.*[^o] archive' $TMP/$X.lf` #The above grep pattern will match 'ARCHIVELOG'(V7) and 'Archive Mode' (V8) #But will NOT match "NOARCHIVELOG"(V7) or "No Archive Mode" (V8) if [ -n "$LOGMODE" ] ; then LOGS_UP=20 echo " Oracle instance $ORACLE_SID is in ARCHIVELOG mode..."|$TLOG else LOGS_UP=10 echo " Oracle instance $ORACLE_SID is NOT in ARCHIVELOG mode..."|$TLOG fi #Get names of controlfiles $SVRMGR <<EOF >$TMP/$X.cfconnect internal;select name from v\$controlfile;exit;EOF grep "^/" $TMP/$X.cf > $CWD/$CONTROLFILE_LIST Error_chk $TMP/$X.cf #Get v$parameter data $SVRMGR <<EOF |sed "s-\?-$ORACLE_HOME-" >$TMP/$X.parameterconnect internal;select name, value from v\$parameter;exit;EOF grep user_dump_dest $TMP/$X.parameter |awk '{print $NF}' > $CWD/$DUMPDEST_LIST Error_chk $TMP/$X.parameter else #else Database is DOWN DB_UP=1 ; LOGS_UP=10 echo " Oracle instance $ORACLE_SID appears to be down..."|$TLOG fi LOGDEST=`grep -v '^$' $CWD/$LOGFILE_LIST` #LOGDEST could be a directory, or a dir with a file pattern tacked #at the end. If it has a file pattern, delete it and leave dir. if [ ! -d "$LOGDEST" ] ; then ARCH_LOG_DIR=`echo $LOGDEST | sed 's-/[^/]*$--'` ARCH_LOG_FILE=`basename $LOGDEST` else ARCH_LOG_DIR=$LOGDEST #Get archive format from v$parameter data obtained above ARCH_LOG_FILE=`grep log_archive_format $TMP/$X.parameter \ |awk '{print $2}'|sed 's/%./*/g'` fi OLD=`ls -t $ARCH_LOG_DIR/${ARCH_LOG_FILE}* 2>/dev/null| head -3 | tail -1` if [ -z "$OLD" ] ; then echo " You don't seem to have any archivelogs in $ARCH_LOG_DIR. (This should be no cause for alarm if you are automatically moving them elsewhere.)"|$TLOG touch $ARCH_LOG_DIR/fake_old_logfile OLD="$ARCH_LOG_DIR/fake_old_logfile" fi BOLD=`basename $OLD` NOLOG=`grep "^$HOST:$ORACLE_SID:NOARCHIVELOG" $ORACONF` NOHOTBACKUP=`grep -i "$HOST:$ORACLE_SID:.*nohotbackup" $ORACONF` if [ -n "$NOHOTBACKUP" ] ; then HOTBACKUP=100 echo " Oracle instance $ORACLE_SID is NOT supposed to backed up live." \ |$TLOG else HOTBACKUP=200 echo " Oracle instance $ORACLE_SID is supposed to backed up live..." \ |$TLOG fi DB_STAT=`expr $HOTBACKUP + $LOGS_UP + $DB_UP` [ -f $TMP/$X.Fatal ] && DB_STAT=221 if [ "$TYPE" = COLD ] ; then #IF instance is not already down, and its cold backup #time, then shut it down, else set a variable to not #start it when we are done case $DB_STAT in 211|111|221) DONT_START=DONT ;; * ) Switch_logfile_n_backup_controlfile #Function Shutdown_instance #Function DB_UP=1 ; LOGS_UP=10 DB_STAT=`expr $HOTBACKUP + $LOGS_UP + $DB_UP` [ -f $TMP/$X.Fatal ] && DB_STAT=221 ;; esac fi case $DB_STAT in 222) #DB=up, LOGS=on, Backup gets green light INCLUDED=YES echo " Oracle instance $ORACLE_SID WILL receive a hot backup..." \ |$TLOG echo " Backing up to directory $CWD on $HOST" |$TLOG echo " Table of contents:" |$TLOG ;; 211|111) #Database is completely down. $0 can back it up if config files #are already in place from a previous run of $0 if [ -f $CWD/$TBLSPACE_LIST ] ; then INCLUDED=YES echo " Oracle instance $ORACLE_SID WILL receive a cold backup..." echo " Table of contents:" |$TLOG else echo " Oracle instance $ORACLE_SID WILL NOT be backed up..." echo " (It is down and there are no backup config files in" |$TLOG echo " $CWD from a previous run of $0)" |$TLOG INCLUDED=NO fi ;; 212) #Database is up, but is set to NOARCHIVELOG if [ -n "$NOLOG" ] ; then #Logs should be off if [ -n "`echo "$NOLOG"|grep ':offline'`" ] ; then #If the dba put "offline" in the $ORACONF, #Then it's supposed to be shutdown for a cold backup every time INCLUDED=YES echo " Oracle instance $ORACLE_SID has this custom line in $ORACONF:" echo " $NOLOG" echo " The word ":offline:" above specifies that this instance" |$TLOG echo " is always supposed to receive a cold backup. It will " |$TLOG echo " therefore be shutdown for this backup." echo " Table of contents:" |$TLOG else #Otherwise, logs are off, we know it, and we don't want to shut it down INCLUDED=NO echo " Oracle instance $ORACLE_SID is not in ARCHIVELOG mode, and" \ |$TLOG echo " has a custom line in $ORACONF. It cannot" |$TLOG echo " be backed up live without ARCHIVELOG," |$TLOG echo " so it will NOT be backed up." |$TLOG echo " If you want it to be backed up offline, you must put" |$TLOG echo " the following line in $ORACONF:" |$TLOG echo " $HOST:$ORACLE_SID:NOARCHIVELOG:offline" |$TLOG fi else #Logs are off, and no special flags have been placed in $ORACONF #Maybe the dba doesn't know... Tell the dba loudly! Log_error 1 "CANNOT BACKUP $ORACLE_SID (NOARCHIVELOG)!" INCLUDED=NO echo " Oracle instance $ORACLE_SID is not in ARCHIVELOG mode, and" |$TLOG echo " has NO custom line in $ORACONF. It cannot" |$TLOG echo " be backed up live without ARCHIVELOG, " |$TLOG echo " so it will NOT be backed up." |$TLOG echo " If you want to back it up only when cold backups run, you" |$TLOG echo " must put the following line in $ORACONF:" |$TLOG echo " $HOST:$ORACLE_SID:NOARCHIVELOG" |$TLOG echo " If you want it to be backed up cold every night, you must" |$TLOG echo " put the following line in $ORACONF:" |$TLOG echo " $HOST:$ORACLE_SID:NOARCHIVELOG:offline" |$TLOG fi ;; 112|122) #Word 'nohotbackup' is in ORACONF echo " Oracle instance $ORACLE_SID will not be backed up." |$TLOG echo " Found the following line in $ORATAB:" |$TLOG echo " $NOHOTBACKUP" |$TLOG echo " (It will only be backed up on cold backup nights" |$TLOG INCLUDED=NO ;; 221) #Fatal error in early sqldba command echo "Something REALLY bad happened!" |$TLOG INCLUDED=NO ;; esac if [ "$INCLUDED" = YES ] ; then echo "INSTANCE:$ORACLE_SID:$ORACLE_HOME:$DB_STAT" |tee -a $LABEL #Now a for loop to create a list that looks like: #ORACLE_SID:FILE_NUMBER:TABLESPACE:DATA_FILE for TABLESPACEnDATA_FILE in `cat $CWD/$TBLSPACE_LIST` do echo "$ORACLE_SID:$FILE_NUMBER:$TABLESPACEnDATA_FILE" |tee -a $LABEL FILE_NUMBER=`expr $FILE_NUMBER + 1` done echo "$ORACLE_SID:$FILE_NUMBER:Redologs (and other logs) in one tar file" \ |tee -a $LABEL FILE_NUMBER=`expr $FILE_NUMBER + 1` fi doneif [ -n "$TAPE" ]; then #If using tape, label if [ "$NOREWIND" != "Y" ] ; then $L_MT $L_F $TAPE $L_REWIND else echo "Starting in the middle of the tape (no rewind argument used)." | $TLOG fi if [ $? -eq 0 ]; then sleep 2 tar cf $TAPE $LABEL else Log_error 1 "$TAPE failed to rewind!" exit exit 1 fi if [ "$NOREWIND" != "Y" ] ; then if [ -n "`tar tf $LABEL 2>/dev/null|grep $LABEL`" ] then Log_error 1 "$TAPE NOT the non-rewind device" exit exit 1 else $L_MT $L_F $TAPE $L_REWIND $L_MT $L_F $TAPE fsf 1 fi echo "Label the tape in $TAPE: \"$LABEL\"." |$TLOG fifi #end of label creation and tape setup, if using a tapefor LINE in `grep '^INSTANCE:' $TMP/$LABEL`do #get sid name, status number from label file ORACLE_SID=`echo $LINE | awk -F':' '{print $2}' ` SID=$ORACLE_SID CWD=$BACKUPDIR/$ORACLE_SID ORACLE_HOME=`echo $LINE | awk -F':' '{print $3}' ` DB_STAT=`echo $LINE | awk -F':' '{print $4}' ` Find_config_files [ -f $ORACLE_HOME/bin/sqldba ] && SVRMGR=sqldba [ -f $ORACLE_HOME/bin/svrmgrl ] && SVRMGR=svrmgrl [ -f $ORACLE_HOME/bin/svrmgr30 ] && SVRMGR=svrmgr30 if [ -z "$SVRMGR" ] ; then Log_error 1 "$ORACLE_SID has an invalid working directory!" continue fi export CWD ORACLE_SID SID ORACLE_HOME SVRMGR echo " -----------------------------------------------------------"| $TLOG echo " Backup of $ORACLE_SID started `date +%T` by $LOGNAME " |$TLOG case $DB_STAT in 222) #DB=up, LOGS=on, Backup gets green light BTYPE=hot ; export BTYPE if [ "$QUERYONLY" != Y ] ; then Backup_instance #Function Switch_logfile_n_backup_controlfile #Function Copy_online_redologs Copy_control_and_essential_redolog_files Copy_config_files Check_bkmode fi ;; 211|111) #Database is completely down if [ $DB_STAT = 211 -a "$TYPE" = "HOT" ] ; then Log_error 1 "!!$ORACLE_SID IS DOWN During a Hot Backup!!" fi if [ "$QUERYONLY" != Y ] ; then Backup_offline Copy_online_redologs Copy_control_and_essential_redolog_files Copy_config_files fi ;; 212) #Database is up, but is set to NOARCHIVELOG #It should only be in the include list if it was set for an offline #Backup, so go ahead an do an offline backup! if [ "$QUERYONLY" != Y ] ; then Shutdown_instance #Configured for offline Backup_offline #backup, so do it Copy_online_redologs Copy_control_and_essential_redolog_files Startup_instance Switch_logfile_n_backup_controlfile Copy_config_files Error_chk $TMP/$X.control fi ;; esac #If instance was not already down before the /bu started, #then start it up if [ "$DONT_START" != DONT ] ; then if [ "$QUERYONLY" != Y ] ; then [ "$TYPE" = COLD ] && Startup_instance fi fi echo " Backup of $ORACLE_SID ended `date +%T` by $LOGNAME " |$TLOG done #done with all $ORACLE_SIDS Postback #Run Post-backup script if there is one if [ -n "$TAPE" ] ; then #eject tape $L_MT $L_F $TAPE $L_OFFLINE if [ $? -gt 0 ] ; then Log_error 1 "!! TAPE PROBLEM: `date +'%H:%M:%S %d/%m/%y'`" else echo " ---------------------------------------------------"| $TLOG echo " Backup tape ejected at `date +'%H:%M:%S %d/%m/%y'` " | $TLOG echo " ---------------------------------------------------"| $TLOG fi fi echo "==============================================================="| $TLOG echo "Oracle database backup ended on $HOST: `date '+%X %m/%d/%Y'`" |$TLOG echo "==============================================================="| $TLOG #Append current log to permanent log, then keep it at 10000 lines cat $LOG >> $PERMLOG tail -10000 $PERMLOG >$PERMLOG.$X mv $PERMLOG.$X $PERMLOG Mail_dbaesac#rm -f $TMP/$X.* #Remove temporary logs#End of oraback.sh
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -