⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oraback.sh

📁 oracle数据库备份脚本
💻 SH
📖 第 1 页 / 共 3 页
字号:
  #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 + -