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