Unix Code - Detail View


Date

Name

Plattform

Language

Kurzbeschreibung

Owner

Link

26.02.2003

xmpDB2Util.sh

Unix

Shell

Controlled execution of DB2 commands

Gernot Ruban

 

DB2 ist ein Produkt der
IBM Corporation. Bitte
Copyright-  und Trademark-Hinweise beachten!

#!/bin/ksh
################################################################################
# xmpDB2Util - Rahmen für DB2 Utilities, die Connect zur DB benötigen
# ------------------------------------------------------------------------------
# Parameter: DML          - Dateiname der LOAD DML
#            TDB         - Target Database
#            LOG                - (opt) Log File Name
# Calls ...: xmpSetFunktion.sh- Funktionsbibliothek
#            xmpSetInstanz.sh   - Setzen der xmp DB2 Umgebung
#            db2                - IBM DB2 Command Line Interface
#            xmpLog.pl          - Logging Funktion
# Comment  : Alle, für DB2 Utilities, die DB Connection benötigen (Export, Load
#            etc), erforderlichen Schritte durchführen.
#            - Umgebung aufbauen per xmpSetInstanz.sh
#            - Connect (implizit, ohne Angabe von User und Psw)
#            - Ausführung Utility
#            - Protokollierung auf xmpdba.log
#            - Connect abbauen
# ------------------------------------------------------------------------------
# Autor      GR /03.01.01       - erste Version V1.1
# 27.04.01/GR - V1.2.2: Aufruf von xmpLog.pl war nicht korrekt parameterisiert,
#               Ausgabe der DML im Utility Log und der xmpdba.log Datei,
#               Prüfung auf DB2/SQL Fehler im Utility Log,
#               Formatierung von Fehler- und Warnungen überarbeitet.
# 02.05.01/GR - Korrektur bei echo von "select * ..."
# 08.06.01/GR - V1.2.3: Änderung in den Kommentaren, sowie Meldung nach SetInstanz
# 27.07.01/GR - V1.2.4: Check, ob Log File beschreibbar
# 05.11.01/GR - V1.2.5: Timestamp Start/Ende in das Log schreiben
# 29.01.02/GR - V1.3: Neue Option, TEMPFILES Support für DB2 LOAD Utility
# 08.05.02/GR - V1.4: Anpassung an Solaris 2.8 (chmod 755 für temp. Pfad),
#                     Fehlermeldung SQL10018N berücksichtigen
################################################################################

#-------------------------------------------------------------------------------
# Init
#-------------------------------------------------------------------------------
  PROG=`basename $0`
  VER="1.4"

#-------------------------------------------------------------------------------
# Pfad der DBA's Administrationsfunktion, -steuerdaten festlegen
#-------------------------------------------------------------------------------
# der Defaultwert ist :
  xmpDBADIR="/opt/xmpdba"
  export xmpDBADIR
  xmpDbaDir="$xmpDBADIR"

  if [ ! -f "$xmpDbaDir/bin/xmpFunktion.sh" ] ; then
     Msg="Der Defaultwert des DBA-Pfad stimmt nicht mehr. Abend! "
     echo $PROG $Msg
     return 128
  fi
 
#-------------------------------------------------------------------------------
# Funktionen aktivieren
#-------------------------------------------------------------------------------
   . ${xmpDbaDir}/bin/xmpFunktion.sh
  if [ $? -ne 0 ] ; then
     Msg="Aktivieren der Funktionen $Funktion ist fehlgeschlagen. Abend!"
     echo $PROG $Msg
     exit 128
  fi

#-------------------------------------------------------------------------------
# Info Block ausgeben
#-------------------------------------------------------------------------------
  InfoMsg "$0 - V$VER"
  InfoMsg "======================================================="
  InfoMsg "Current User ................: "`id`
  InfoMsg "Current Date/Time ...........: "`date +%Y-%m-%d-%H.%M.%S`
  InfoMsg "System ......................: "`uname -n`
  InfoMsg "DML (export/import/load o.a.): $1"
  InfoMsg "Target Database .............: $2"
 
#-------------------------------------------------------------------------------
# Argumente prüfen
#-------------------------------------------------------------------------------
  if [ $# -lt 1 or $1 = ? ] ; then
InfoMsg "Syntax für $PROG dmlfile tdb [logfile] [TEMPFILES]"
InfoMsg "... where dmlfile   = DB2 DML File"
InfoMsg "          tdb       = Target Database"
InfoMsg "          logifle   = Log File (optional)"
InfoMsg "          TEMPFILES = keyword, parallel LOAD Support"
ErrorMsg "Abend mit RC=4"
 exit 4
  fi

  if [ ! "$1" ]; then
WarningMsg "$PROG: Keine DB2 DML File angegeben!"
ErrorMsg "Abend mit RC=16"
 exit 16
  fi

  if [ ! "$2" ]; then
WarningMsg "$PROG: Keine Target Database angegeben."
ErrorMsg "Abend mit RC=16"
 exit 16
  fi

  dml=$1
  db=$2
  log=$3
  tf=""

#-------------------------------------------------------------------------------
# Checks on arguments
#-------------------------------------------------------------------------------
  if [ ! -r $dml ] ; then
WarningMsg "$PROG: DML File $dml nicht verarbeitbar!"
ErrorMsg "Abend mit RC=16"
exit 16
  fi


#-------------------------------------------------------------------------------
# Keyword gefunden: Parallel LOAD Support über TEMPFILES
#-------------------------------------------------------------------------------
  if [ "$3" == "TEMPFILES" ]; then
log=""
tf=$3
  fi

  if [ "$4" == "TEMPFILES" ]; then
tf=$4
  fi


#-------------------------------------------------------------------------------
# Dateiname der DML File bearbeiten
#-------------------------------------------------------------------------------
  dmlpath=`dirname $dml`
  if [ $dmlpath == "." ]; then
dmlpath=$PWD
  fi
  dmlfnam=`basename $dml`
  dmlfile="$dmlpath/$dmlfnam"


#-------------------------------------------------------------------------------
# DB2 Log-Datei Pfad setzen und falls vorhanden, löschen
#-------------------------------------------------------------------------------
  if [ ! "$log" ]; then
logpath=`dirname $dml`
if [ $logpath == "." ]; then
logpath=$PWD
fi
logfnam=`basename $dml | awk -F. '{print $1}'`
logfile="$logpath/$logfnam.LOG"
  else
        logfile=$log
  fi

  InfoMsg "Utility Log File Name .......: $logfile"

  rm -f $logfile
  rc=$?
  if [ $rc -gt 2 ] ; then
WarningMsg "$PROG: $logfile nicht lösch-/wiederverwendbar."
ErrorMsg "Abend mit RC=128"
        exit 128
  fi

  echo "">$logfile
  rc=$?
  if [ $rc -ne 0 ] ; then
WarningMsg "$PROG: $logfile nicht beschreibbar (Autorisierung)."
ErrorMsg "Abend mit RC=128"
        exit 128
  fi

#-------------------------------------------------------------------------------
# If TEMPFILES specified, extend LOAD control card, if necessary
#-------------------------------------------------------------------------------
  if [ "$tf" == "TEMPFILES" ]; then
#-----------------------------------------------------------------------
# Create temporary path using command name and process id
#-----------------------------------------------------------------------
tfnam="/tmp/$PROG.$$"
#echo ">>>$tfnam"
mkdir $tfnam
if [ ! -w $tfnam ] ; then
WarningMsg "$PROG: TEMPFILE Path $tfnam nicht nutzbar."
ErrorMsg "Abend mit RC=128"
        exit 128
fi
#-----------------------------------------------------------------------
# Grant access to group and othersV 1.4
#-----------------------------------------------------------------------
chmod 775 $tfnam

#-----------------------------------------------------------------------
# Insert TEMPFILES option into DB2 LOAD Statements only:
# change some words from mixed case to upper case, quit if insertion
        # already exists, if not insert new/temporary string. That's it!
# (Warning: Cannot replace $tfnam variable due to special chars (eg./)!)
#-----------------------------------------------------------------------
sed -e 's/[Ll][Oo][Aa][Dd]/LOAD/g' \
-e 's/ [Ii][Nn][Tt][Oo] / INTO /g' \
-e 's/ [Ii][Nn][Ss][Ee][Rr][Tt] / INSERT /g' \
-e 's/ [Rr][Ee][Pp][Ll][Aa][Cc][Ee] / REPLACE /g' \
-e 's/ [Rr][Ee][Ss][Tt][Aa][Rr][Tt] / RESTART /g' \
-e 's/ [Tt][Ee][Rr][Mm][Ii][Nn][Aa][Tt][Ee] / TERMINATE /g' \
  -e '/LOAD/,/INTO/{/TEMPFILES/q
s/REPLACE INTO/TEMPFILES PATH tfnam &/g
s/INSERT INTO/TEMPFILES PATH tfnam &/g
s/RESTART INTO/TEMPFILES PATH tfnam &/g
s/TERMINATE INTO/TEMPFILES PATH tfnam &/g
}' \
-e "s/tfnam/\/tmp\/$PROG\.$$/g" \
$dml > $tfnam/$dmlfnam
 
#-----------------------------------------------------------------------
# DML input has been modified now
#-----------------------------------------------------------------------
dml=$tfnam/$dmlfnam
  fi

#-------------------------------------------------------------------------------
# DB2 Umgebung setzen
#-------------------------------------------------------------------------------
  if [ -x "$xmpDbaDir/bin/xmpFunktion.sh" ]; then
. ${xmpDbaDir}/bin/xmpSetInstanz.sh $db >> /dev/null
rc=$?
if [ $rc -ne 0 ] ; then
WarningMsg "$PROG: DB2 Umgebung kann nicht per "
WarningMsg "$xmpDbaDir/bin/xmpFunktion.sh gesetzt werden,1 RC=$rc."
ErrorMsg "Abend mit RC=128"
exit 128
fi
  else
WarningMsg "$PROG: DB2 Umgebung kann nicht per "
WarningMsg "$xmpDbaDir/bin/xmpFunktion.sh gesetzt werden, RC=$rc."
ErrorMsg "Abend mit RC=128"
exit 128
  fi
  InfoMsg "DB2 Instanz/Umgebung ........: $DB2INSTANCE at $INSTHOME"

#-------------------------------------------------------------------------------
# DB2 Command Interface Options setzen
#-------------------------------------------------------------------------------
  db2 "UPDATE COMMAND OPTIONS USING S ON Z ON $logfile V OFF">>/dev/null
  rc=$?
  if [ $rc -ne 0 ] ; then
WarningMsg "$PROG: DB2 Command Options nicht setzbar, RC=$rc."
ErrorMsg "Abend mit RC=128"
        exit 128
  fi

#-------------------------------------------------------------------------------
# DB2 Connect zur Target Database
#-------------------------------------------------------------------------------
  db2 "connect to $db">>/dev/null
  rc=$?
  if [ $rc -ne 0 ] ; then
WarningMsg "$PROG: DB2 Connect zu $db endet mit RC=$rc."
ErrorMsg "Abend mit RC=128"
        exit 128
  fi

#-------------------------------------------------------------------------------
# DB2 Steuerkarten ausgeben
#-------------------------------------------------------------------------------
  InfoMsg "Inhalt DML File zur Protokollierung ..."
  dmldump=`cat $dml`
  echo "File $dmlfile contains ..." | tee -a $logfile
  echo "$dmldump" | tee -a $logfile

#-------------------------------------------------------------------------------
# DB2 Utility starten
#-------------------------------------------------------------------------------
  echo "--------------------------------------------"  | tee -a $logfile
  echo "Processing starts at "`date +%Y-%m-%d-%H.%M.%S`" ..."  | tee -a $logfile
  echo "--------------------------------------------"  | tee -a $logfile
  db2 -tf $dml | tee -a $logfile
  rc=$?
  echo "------------------------------------------"  | tee -a $logfile
  echo "Processing ends at "`date +%Y-%m-%d-%H.%M.%S`" ..."  | tee -a $logfile
  echo "------------------------------------------"  | tee -a $logfile

#-------------------------------------------------------------------------------
# DB2 Disconnect von Target Database
#-------------------------------------------------------------------------------
  db2 "connect reset">>/dev/null
  rcd=$?
  if [ $rcd -ne 0 ] ; then
WarningMsg "$PROG: DB2 Disconnect von $db endet mit RC=$rcd."
WarningMsg "Verarbeitung wird fortgesetzt!"
  fi

#-------------------------------------------------------------------------------
# DB2 Command Interface Options weitesgehend zurücksetzen
#-------------------------------------------------------------------------------
db2 "UPDATE COMMAND OPTIONS USING V ON Z OFF">>/dev/null

#-------------------------------------------------------------------------------
# Erfolg des DB2 Utilities prüfen, DB2/SQL Fehler in Logfile suchen
#-------------------------------------------------------------------------------
  if [ $rc -ne 0 ] ; then
        ${xmpDbaDir}/bin/xmpLog.pl -a $db -s E -t "xmpDB2Util.sh mit $dmlfile fehlerhaft."
WarningMsg "$PROG: DB2 Utility endet mit RC=$rc."
ErrorMsg "Abend mit RC=128"
        exit 128
  fi

  errcnt=`cat $logfile | grep -i error | grep 'SQL....N' | wc -l`
  if [ $errcnt -ne 0 ] ; then
        ${xmpDbaDir}/bin/xmpLog.pl -a $db -s E -t "xmpDB2Util.sh mit $dmlfile endet mit $errcnt Fehlern."
WarningMsg "$PROG: DB2 Utility endet mit $errcnt Fehlern."
ErrorMsg "Abend mit RC=64"
        exit 64
  fi

  #errcnt=`cat $logfile | grep 'SQL....C' | wc -l`
  errcnt=`cat $logfile | egrep '(SQL....C|SQL10018N)' | wc -l`# V 1.4
  if [ $errcnt -ne 0 ] ; then
        ${xmpDbaDir}/bin/xmpLog.pl -a $db -s E -t "xmpDB2Util.sh mit $dmlfile endet mit $errcnt Fehlern."
WarningMsg "$PROG: DB2 Utility endet mit $errcnt Fehlern."
ErrorMsg "Abend mit RC=64"
        exit 64
  fi
#-------------------------------------------------------------------------------
# Remove temporary path used for TEMPFILES option (do not check success of rmdir)
#-------------------------------------------------------------------------------
  if [ "$tf" == "TEMPFILES" ]; then
rm -rf $tfnam
  fi

#-------------------------------------------------------------------------------
# Erfolg im xmpdba.log protokollieren
#-------------------------------------------------------------------------------
  ${xmpDbaDir}/bin/xmpLog.pl -a $db -s I -t "xmpDB2Util.sh mit $dmlfile erfolgreich."

#-------------------------------------------------------------------------------
# *** ENDE ***
#-------------------------------------------------------------------------------
  InfoMsg "$PROG finished. (RC=0)"
 
exit 0

© Gernot Ruban