Article Figure 1 Figure 2 Figure 3 Listing 1
Listing 2 Listing 3 Listing 4 Listing 5 Listing 6
Listing 7 may2007.tar

Listing 3 Automated script to check LGWR state

#!/bin/ksh
#########################################################################
#  Script       : lgwr_check.ksh
#
#  Description  : This script checks the status of Archive Log reception on 
#                 the Standby Database.
#                 
#  Options      : None
#
#  Diagnostics  : The exit status is 0 or 1
#
#  Author       : Aaron Diehl    
#  Date         : 10/31/2006
#
#  Modification : 11/27/2006, Aaron Diehl
#                 Corrected a logic error where the v$managed_standby 
#                 view may have a stale record
#
#########################################################################

############################
# Get Parameters
############################

if (( $# != 1 )) 
then
    ERROR="usage: $0 SID"
    RETURN_CODE=1
    print "$0:$ERROR"
    exit $RETURN_CODE
fi

############################
# Initialize UNIX variables
############################

. /opt/admin/scripts/unix_vars.ksh

####################################
# Initialize Global Variables
####################################
SCRIPT=lgwr_check
TYPE=DBA
SEVERITY=4
DATE=`date +%b%d`_`date +%H%M`
LOGFILE=$UNIX_OUTPUT_DIR/"$SCRIPT"."$DATE"
SUBJECT="Info: Script $SCRIPT was successful."

####################################
# Initialize job specific parameters
####################################
spool_dir=$BASE_DIR/tmp
run_date=`date +'%Y-%m-%d_%H:%M'`
tmp_sql=$spool_dir/$SCRIPT.tmp
scr_stat=$spool_dir/$SCRIPT.sql
cat /dev/null > $tmp_sql

#################
# Create log file
#################

print "Starting $SCRIPT on `date`" > $LOGFILE 2>&1
print "****************************************************" >>$LOGFILE 2>&1
print "" >> $LOGFILE 2>&1

##########################################
# Main
##########################################
SID=$1             # Set Oracle Environment for this Database
. define                #

print "Checking Log Writer Sequence for $SID ..." >> $LOGFILE

lgwr_stat=`sqlplus -s '/ as sysdba' <<LGWRstat
SET HEAD OFF
SELECT COUNT(*)||':', MAX(sequence#)
FROM v\\$managed_standby
WHERE client_process = 'LGWR';

exit;

LGWRstat
`
if (( $? != 0 ))
then
  RETURN_CODE=1
  ERROR="Error: Failed to get LGWR sequence from $SID."
  print "$ERROR" >> $LOGFILE 2>&1
  SUBJECT="$TYPE Alert: $SCRIPT failed on $DATE"
  $UNIX_SCRIPT_DIR/alert.ksh $SCRIPT $RETURN_CODE $SEVERITY $LOGFILE \
    $TYPE "$SUBJECT"
  exit $RETURN_CODE
fi
print "Checking Managed Recovery Sequence for $SID ..." >> $LOGFILE
mrp_seq=`sqlplus -s '/ as sysdba' <<MRPseq
SET HEAD OFF
SELECT sequence#||''
FROM v\\$managed_standby
WHERE process = 'MRP0';

exit;

MRPseq
`
if (( $? != 0 ))
then
  RETURN_CODE=1
  ERROR="Error: Failed to get MRP sequence from $SID."
  print "$ERROR" >> $LOGFILE 2>&1
  SUBJECT="$TYPE Alert: $SCRIPT failed on $DATE"
  $UNIX_SCRIPT_DIR/alert.ksh $SCRIPT $RETURN_CODE $SEVERITY $LOGFILE \
    $TYPE "$SUBJECT"
  exit $RETURN_CODE
else
  lgwr_count=`echo $lgwr_stat|cut -f 1 -d ":"|tail -1`
  lgwr_seq=`echo $lgwr_stat|cut -f 2 -d ":"|tail -1`
  lgwr_seq=`echo $lgwr_seq|tr -s " " ""`
  mrp_seq=`echo $mrp_seq|tail -1`
  print "LGWR count is $lgwr_count" >> $LOGFILE
  print "LGWR sequence is $lgwr_seq" >> $LOGFILE
  print "MRP sequence is $mrp_seq" >> $LOGFILE
  if [[ $lgwr_seq < $mrp_seq ]] || [[ $lgwr_count = 0 ]]
  then
    RETURN_CODE=1
    ERROR="Error: $SID is not in Log Writer Mode."
    print "$ERROR" >> $LOGFILE 2>&1
    SUBJECT="$TYPE Alert: $SID is not in Log Writer Mode."
    print "INSERT INTO lgwr_status" >> $tmp_sql
    print "  VALUES ('$SCRIPT','$run_date','$SID','0','1');" >> $tmp_sql
  fi
fi

######
# Exit 
######

print "\nEnding $SCRIPT on `date`" >> $LOGFILE 2>&1
print "****************************************************" >>$LOGFILE 2>&1
print "" >> $LOGFILE 2>&1

$UNIX_SCRIPT_DIR/alert.ksh $SCRIPT $RETURN_CODE $SEVERITY $LOGFILE \
  $TYPE "$SUBJECT"