Shell Script xmpDB2Util – Frame for DB2 utilities which connect to database
This KSH shell script executes DB2 SQL statements and commands. The script and starts an DB2 enviroment connects itself to the database specified as argument.Â
#!/bin/ksh
################################################################################
# xmpDB2Util - Frame for DB2 utilities which connect to database
# ------------------------------------------------------------------------------
# Parameter: DML - Dateiname der LOAD DML
# TDB - Target Database
# LOG - (opt) Log File Name
# Calls ...: xmpSetFunktion.sh - Funktionsbibliothek
# xmpSetInstance.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: Changed comments and message after applying SetInstanz.sh
# 27.07.01/GR - V1.2.4: Check, wether log file accessible
# 05.11.01/GR - V1.2.5: Write start/stop timestamp into log
# 29.01.02/GR - V1.3: Neew option, TEMPFILES support for DB2 LOAD Utility
# 08.05.02/GR - V1.4: Adapted to Solaris 2.8 (chmod 755 for temporary path),
# now considering error message SQL10018N
# 21.08.02/GR - V1.5: Print SQL Messages in case of errors
# 14.05.03/GR - V1.6: Now considering error message SQL3304N
# 04.08.03/GR - V1.7: Now considering error message SQL0911N w/o "error" keyword
# 03.03.04/GR - V1.8: DB2 w/o autocommit, w/o stop at execution error
# 08.03.04/GR - V1.9: Adapt to AIX usage, changed xmpSetInstanz.sh to xmpSetInstance.sh
# 16.05.07/GR - V1.9.1: SQL0091N is not an error message
# 18.05.07/GR - V2.0: Amendment when instance already allocated
################################################################################
#-------------------------------------------------------------------------------
# Init
#-------------------------------------------------------------------------------
PROGM=`basename $0`
VER="2.0"
#-------------------------------------------------------------------------------
# Plattform-spezifisch
#-------------------------------------------------------------------------------
case `uname` in
AIX)
StringEQ="="
;;
SunOS)
StringEQ="=="
;;
*)
echo "$PROG: Unknown plaform, is not AIX or SunOS."
exit 8
;;
esac
#-------------------------------------------------------------------------------
# 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 $PROGM $Msg
return 128
fi
#-------------------------------------------------------------------------------
# Funktionen aktivieren
#-------------------------------------------------------------------------------
. ${xmpDbaDir}/bin/xmpFunktion.sh
if [ $? -ne 0 ] ; then
Msg="Aktivieren der Funktionen $Funktion ist fehlgeschlagen. Abend!"
echo $PROGM $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"
InfoMsg "Execution Mode ..............: NO AUTOCOMMIT and"
InfoMsg " (constant, not modifyable) NO STOP ON ERROR"
#-------------------------------------------------------------------------------
# Argumente prüfen
#-------------------------------------------------------------------------------
if [ $# -lt 1 or $1 = ? ] ; then
InfoMsg "Syntax für $PROGM 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 "$PROGM: Keine DB2 DML File angegeben!"
ErrorMsg "Abend mit RC=16"
exit 16
fi
if [ ! "$2" ]; then
WarningMsg "$PROGM: 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 "$PROGM: DML File $dml nicht verarbeitbar!"
ErrorMsg "Abend mit RC=16"
exit 16
fi
#-------------------------------------------------------------------------------
# Keyword gefunden: Parallel LOAD Support über TEMPFILES
#-------------------------------------------------------------------------------
if [ "$3" $StringEQ "TEMPFILES" ]; then
log=""
tf=$3
fi
if [ "$4" $StringEQ "TEMPFILES" ]; then
tf=$4
fi
#-------------------------------------------------------------------------------
# Dateiname der DML File bearbeiten
#-------------------------------------------------------------------------------
dmlpath=`dirname $dml`
if [ $dmlpath $StringEQ "." ]; 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 $StringEQ "." ]; 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 "$PROGM: $logfile nicht lösch-/wiederverwendbar."
ErrorMsg "Abend mit RC=128"
exit 128
fi
echo "">$logfile
rc=$?
if [ $rc -ne 0 ] ; then
WarningMsg "$PROGM: $logfile nicht beschreibbar (Autorisierung)."
ErrorMsg "Abend mit RC=128"
exit 128
fi
#-------------------------------------------------------------------------------
# If TEMPFILES specified, extend LOAD control card, if necessary
#-------------------------------------------------------------------------------
if [ "$tf" $StringEQ "TEMPFILES" ]; then
#---------------------------------------------------------------------------
# Create temporary path using command name and process id
#---------------------------------------------------------------------------
tfnam="/tmp/$PROGM.$$"
#echo ">>>$tfnam"
mkdir $tfnam
if [ ! -w $tfnam ] ; then
WarningMsg "$PROGM: TEMPFILE Path $tfnam nicht nutzbar."
ErrorMsg "Abend mit RC=128"
exit 128
fi
#-----------------------------------------------------------------------
# Grant access to group and others V 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\/$PROGM\.$$/g" \
$dml > $tfnam/$dmlfnam
#-----------------------------------------------------------------------
# DML input has been modified now
#-----------------------------------------------------------------------
dml=$tfnam/$dmlfnam
fi
#-------------------------------------------------------------------------------
# DB2 Umgebung setzen
#-------------------------------------------------------------------------------
save_db=$db # restore later V1.9
if [ "$lP_BANN" == "xmpSetInstance.sh" ]; then
INSTHOME=`db2usrinf -d $DB2INSTANCE`
InfoMsg "DB2 Umgebung existiert ......: $DB2INSTANCE at $INSTHOME"
else
if [ -x "$xmpDbaDir/bin/xmpFunktion.sh" ]; then
. ${xmpDbaDir}/bin/xmpSetInstance.sh $db >> /dev/null
rc=$?
if [ $rc -ne 0 ] ; then
WarningMsg "$PROGM: 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 "$PROGM: 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"
fi
db=$save_db # restore previous V1.9
#-------------------------------------------------------------------------------
# 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 "$PROGM: 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 "$PROGM: DB2 Connect zu $db endet mit RC=$rc."
db2 "connect to $db" # V1.5
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: -tvf terminator/verbose on/file input
# +s do not stop execution on error
# +c autocommit off
#-------------------------------------------------------------------------------
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
db2 +s +c -z$logfile -tvf $dml
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 "$PROGM: 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."
#cat $logfile # V 1.5
WarningMsg "$PROGM: DB2 Utility endet mit RC=$rc."
ErrorMsg "Abend mit RC=$rc"
exit $rc
fi
#errcnt=`cat $logfile | grep -i error | grep 'SQL....N' | wc -l` #V1.9.1
errcnt=`cat $logfile | egrep -i error | egrep -v 'SQL0091N' | egrep '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."
cat $logfile | egrep '(SQL....C|SQL....N|SQL....W|SQL.....N)' # V 1.6
WarningMsg "$PROGM: DB2 Utility endet mit $errcnt Fehlern."
ErrorMsg "Abend mit RC=64"
exit 64
fi
# errcnt=`cat $logfile | egrep '(SQL....C|SQL10018N|SQL3304N)' | wc -l` # V 1.6
errcnt=`cat $logfile | egrep '(SQL....C|SQL10018N|SQL3304N|SQL0911N)' | wc -l` # V 1.7
if [ $errcnt -ne 0 ] ; then
${xmpDbaDir}/bin/xmpLog.pl -a $db -s E -t "xmpDB2Util.sh mit $dmlfile endet mit $errcnt Fehlern."
# cat $logfile | egrep '(SQL....C|SQL10018N|SQL3304N)' # V 1.6
cat $logfile | egrep '(SQL....C|SQL10018N|SQL3304N|SQL0911N)' # V 1.7
WarningMsg "$PROGM: 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" $StringEQ "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 "$PROGM finished. (RC=0)"
exit 0






Comments
Comments are closed.