blob: 4990a167f5579b22aa39804850bec25223c2a74c [file] [log] [blame]
#!/bin/sh
# @@@ START COPYRIGHT @@@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# @@@ END COPYRIGHT @@@
#
# 1. Get row count of USTAT_AUTO_TABLES for 'USER' entries
# 2. If row count = 0, then repopulate with all tables in NEO catalog.
# Set up: ------------------------------------------------------------
if [ `uname` != "Linux" ]; then
if [[ $mxcidir != "" && $mxlibdir != "" ]]; then
# This is test debug environment. Set vars accordingly
MXCI="$mxcidir/mxci"
autoloc="$mxlibdir"
else
# This is a production environment.
MXCI="/usr/tandem/sqlmx/bin/mxci"
autoloc="/usr/tandem/mx_ustat"
fi
sys=$1 # The system name
else
export SQLMX_TERMINAL_CHARSET=UTF8
MXCI=$TRAF_HOME/export/bin32/sqlci
autoloc=$TRAF_HOME/export/lib/mx_ustat
alias print=echo
sys=NSK
fi
MAX_READ_AGE=$2 # Max time since hist was read that it will be retrieved
tableCat="NEO"
autoCat="MANAGEABILITY"
autoSch="HP_USTAT"
autoTable="${autoCat}.${autoSch}.USTAT_AUTO_TABLES"
AUTODIR="$autoloc/autodir"
query10="${AUTODIR}/query10"
query12_13="${AUTODIR}/query12_13"
filllog="${AUTODIR}/USTAT_FILLLOG"
print "FillAutoTbl: MXCI=$MXCI" > $filllog
print "FillAutoTbl: autoloc=$autoloc" >> $filllog
# Functions: ---------------------------------------------------------
checkForErrs()
{
errsOutput=$1
errnum=0
errtext=""
if [[ "$errsOutput" != "" ]]; then # Errors
# Get errors.
let errcnt=$errcnt+1
errnum=$(print "$errsOutput" | cut -d" " -f2) # Get rid of text
errnum=${errnum#"ERROR["} # Get rid of surrounding word and brackets.
errnum=${errnum%"]"}
errtext=${errsOutput#"*** ERROR[$errnum]"}
print "FillAutoTbl: Update auto table err: $errnum, $errtext" >> $filllog
return 1
fi
return 0
}
# return the number of row field SQL cout output.
# The value should be contained in the 7th row. Valid only for SQ
alias getRow="sed '1,6 d' | sed '2,6 d' | sed '1,\$s/ //g'"
# Main code: ---------------------------------------------------------
query="SELECT COUNT(*) FROM $autoTable FOR READ UNCOMMITTED ACCESS;"
let rows=$(echo $query | $MXCI | getRow)
# 1. Get row count of USTAT_AUTO_TABLES for 'USER' entries
query="SELECT COUNT(*) FROM $autoTable WHERE ADDED_BY=_ISO88591'USER' FOR READ UNCOMMITTED ACCESS;"
let userRows=$(echo $query | $MXCI | getRow)
print "FillAutoTbl: Starting to search for tables." >> $filllog
print "FillAutoTbl: USTAT_AUTO_TABLE current sysRows=$rows, userRows=$userRows." >> $filllog
# Create timestamp to compare READ_TIME to.
currentTime=$(date +"%Y-%m-%d %H:%M:%S")
# Find maximum age in seconds for histogram read. Allow 10^6 minutes max (about 2 yrs).
if [[ $MAX_READ_AGE < 1000000 ]]; then let MAX_READ_SECS=$MAX_READ_AGE*60
else MAX_READ_SECS="345600"; fi # default of 4 days.
print "FillAutoTbl: Current time is $currentTime." >> $filllog
print "FillAutoTbl: Max age of READ_TIME = $MAX_READ_SECS (secs)." >> $filllog
# Create list of schema versions.
print "FillAutoTbl: Obtaining schema versions >= 2300." >> $filllog
query1="SELECT DISTINCT 'Version:', S.SCHEMA_VERSION
FROM HP_SYSTEM_CATALOG.SYSTEM_SCHEMA.CATSYS C,
HP_SYSTEM_CATALOG.SYSTEM_SCHEMA.SCHEMATA S
WHERE C.CAT_UID=S.CAT_UID AND
C.CAT_NAME=_UCS2'NEO' AND
S.SCHEMA_VERSION >= 2300;"
print "$query1" | $MXCI >$AUTODIR/tmp
errs=$(cat $AUTODIR/tmp | grep "\*\*\* ERROR" | sed -n '1p')
checkForErrs "$errs"
versions=$(cat $AUTODIR/tmp | grep "Version:" | grep -v "SELECT" |\
tr -s ' ' ' ' | cut -d" " -f2)
print "FillAutoTbl: Schema versions found: $versions" >> $filllog
errcnt=0
# When automation becomes default, replace following line with:
# if [[ $userRows = 0 ]]; then
if [[ $rows -ne 0 && $userRows = 0 ]]; then
# USTAT AUTOMATION DYNAMIC TABLE LIST
print "FillAutoTbl: USTAT_AUTO_TABLES is dynamic - recreating." >> $filllog
if checkForErrs "$errs"; then for ver in $versions; do
# No errors getting versions. Loop for each version.
# 1. Update USTAT_AUTO_TABLES
print "FillAutoTbl: Updating tables in USTAT_AUTO_TABLE for vers=$ver" >> $filllog
# -- Add tables and MVs in NEO catalog that are not in list. ------------------------
query2="INSERT INTO $autoTable
SELECT C.CAT_NAME, S.SCHEMA_NAME, O.OBJECT_NAME,
TIMESTAMP '0001-01-01 00:00:00',
TIMESTAMP '0001-01-01 00:00:00',
0, _UCS2'', _ISO88591'SYSTEM'
FROM HP_SYSTEM_CATALOG.SYSTEM_SCHEMA.CATSYS C,
HP_SYSTEM_CATALOG.SYSTEM_SCHEMA.SCHEMATA S,
NEO.HP_DEFINITION_SCHEMA.OBJECTS O
WHERE C.CAT_UID=S.CAT_UID AND
S.SCHEMA_UID=O.SCHEMA_UID AND
(O.OBJECT_TYPE=_ISO88591'BT' OR O.OBJECT_TYPE=_ISO88591'MV') AND
O.OBJECT_NAME_SPACE=_ISO88591'TA' AND
C.CAT_NAME=_UCS2'NEO' AND
S.SCHEMA_NAME<>_UCS2'HP_DEFINITION_SCHEMA' AND
S.SCHEMA_NAME<>_UCS2'PUBLIC_ACCESS_SCHEMA' AND
S.SCHEMA_NAME NOT LIKE _UCS2'HP\_%' ESCAPE _UCS2'\' AND
S.SCHEMA_NAME NOT LIKE _UCS2'VOLATILE\_SCHEMA\_%' ESCAPE _UCS2'\' AND
O.OBJECT_NAME<>_UCS2'HISTOGRAMS' AND
O.OBJECT_NAME<>_UCS2'HISTOGRAM_INTERVALS' AND
O.OBJECT_NAME<>_UCS2'HISTOGRAMS_FREQ_VALS' AND
O.OBJECT_NAME<>_UCS2'MVS_TABLE_INFO_UMD' AND
O.OBJECT_NAME<>_UCS2'MVS_UMD' AND
O.OBJECT_NAME<>_UCS2'MVS_USED_UMD' AND
(C.CAT_NAME, S.SCHEMA_NAME, O.OBJECT_NAME) NOT IN
(SELECT CAT_NAME, SCH_NAME, TBL_NAME FROM $autoTable);"
# -- Delete tables and MVs that no longer exist in NEO catalog from list. -----------
query3="DELETE FROM $autoTable WHERE ADDED_BY<>_ISO88591'EXCLUD' AND
(CAT_NAME, SCH_NAME, TBL_NAME) NOT IN
(SELECT C.CAT_NAME, S.SCHEMA_NAME, O.OBJECT_NAME
FROM HP_SYSTEM_CATALOG.SYSTEM_SCHEMA.CATSYS C,
HP_SYSTEM_CATALOG.SYSTEM_SCHEMA.SCHEMATA S,
NEO.HP_DEFINITION_SCHEMA.OBJECTS O
WHERE C.CAT_UID=S.CAT_UID AND
S.SCHEMA_UID=O.SCHEMA_UID AND
(O.OBJECT_TYPE=_ISO88591'BT' OR O.OBJECT_TYPE=_ISO88591'MV') AND
O.OBJECT_NAME_SPACE=_ISO88591'TA' AND
C.CAT_NAME=_UCS2'NEO' AND
S.SCHEMA_NAME<>_UCS2'HP_DEFINITION_SCHEMA' AND
S.SCHEMA_NAME<>_UCS2'PUBLIC_ACCESS_SCHEMA' AND
S.SCHEMA_NAME NOT LIKE _UCS2'HP\_%' ESCAPE _UCS2'\' AND
S.SCHEMA_NAME NOT LIKE _UCS2'VOLATILE\_SCHEMA\_%' ESCAPE _UCS2'\' AND
O.OBJECT_NAME<>_UCS2'HISTOGRAMS' AND
O.OBJECT_NAME<>_UCS2'HISTOGRAM_INTERVALS' AND
O.OBJECT_NAME<>_UCS2'HISTOGRAMS_FREQ_VALS' AND
O.OBJECT_NAME<>_UCS2'MVS_TABLE_INFO_UMD' AND
O.OBJECT_NAME<>_UCS2'MVS_UMD' AND
O.OBJECT_NAME<>_UCS2'MVS_USED_UMD');"
errs=$(print "$query2 $query3" | $MXCI | grep "\*\*\* ERROR" | sed -n '1p')
checkForErrs "$errs"
done
fi
# Update 'rows' variable to new rowcount.
query="SELECT COUNT(*) FROM $autoTable FOR READ UNCOMMITTED ACCESS;"
print "$query" | $MXCI >$AUTODIR/tmp
errs=$(cat $AUTODIR/tmp | grep "\*\*\* ERROR" | sed -n '1p')
checkForErrs "$errs"
let rows=$(cat $AUTODIR/tmp | getRow)
fi
if [[ $rows -ne 0 ]]; then
# -- Get schemas from USTAT_AUTO_TABLES ------------------------------------------------
query4="SELECT DISTINCT 'Schema:', SCH_NAME FROM $autoTable
WHERE SCH_NAME NOT LIKE _UCS2'@%' AND
SCH_NAME<>_UCS2'';"
echo "$query4" | $MXCI >$AUTODIR/tmp
errs=$(cat $AUTODIR/tmp | grep "\*\*\* ERROR" | sed -n '1p')
# Create list of schemas.
cat $AUTODIR/tmp | grep "Schema:" | grep -v "SELECT" |\
tr -s ' ' ' ' | cut -d" " -f2- > $AUTODIR/USTAT_SCHEMAS
# -- Find all tables with empty histograms for schemas found. --------------------------
if checkForErrs "$errs"; then
# Drop temp tables, but don't check for errors.
query5="DROP TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_MISSING_STATS_TBLS;"
query6="DROP TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_RECENT_HISTS_TBLS;"
query7="DROP TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_AUTO_RUN_LIST;"
print "$query5 $query6 $query7" | $MXCI > /dev/null
query5="CREATE TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_MISSING_STATS_TBLS LIKE $autoTable;"
query6="CREATE TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_RECENT_HISTS_TBLS LIKE $autoTable;"
query7="CREATE TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_AUTO_RUN_LIST LIKE $autoTable;"
errs=$(print "$query5 $query6 $query7" | $MXCI | grep "\*\*\* ERROR" | sed -n '1p')
if checkForErrs "$errs"; then
print "FillAutoTbl: Finding tables w/ empty or recently read histograms." >> $filllog
rm -f $AUTODIR/findTblsWHistsToUpdate
touch $AUTODIR/findTblsWHistsToUpdate # Create empty file.
exec 4<$AUTODIR/USTAT_SCHEMAS
read schema <&4; # Get first schema name.
while [[ "$schema" != "" ]]; do
# Find all tables/MVs with empty histograms for a given schema. Note that the
# ADDED_BY column is used here only to store the object type, which should be
# only BT (table) or MV.
extsch=$(print "$schema" | sed 's/"/""/g')
print "FillAutoTbl: Creating query for schema \"$extsch\"." >> $filllog
intschstrlit=$(print "$schema" | sed "s/'/''/g")
query8="INSERT INTO NEO.PUBLIC_ACCESS_SCHEMA.USTAT_MISSING_STATS_TBLS
SELECT DISTINCT _UCS2'NEO', _UCS2'$intschstrlit', O.OBJECT_NAME,
TIMESTAMP '0001-01-01 00:00:00',
TIMESTAMP '0001-01-01 00:00:00',
0, _UCS2'', O.OBJECT_TYPE
FROM NEO.HP_DEFINITION_SCHEMA.OBJECTS O
, NEO.HP_DEFINITION_SCHEMA.COLS C
, NEO.\"$extsch\".HISTOGRAMS H
WHERE O.OBJECT_UID = H.TABLE_UID
AND O.OBJECT_UID = C.OBJECT_UID
AND O.OBJECT_NAME_SPACE = 'TA'
AND C.COLUMN_NUMBER = H.COLUMN_NUMBER
AND H.REASON = _ISO88591' '
AND O.OBJECT_NAME<>_UCS2'HISTOGRAMS'
AND O.OBJECT_NAME<>_UCS2'HISTOGRAM_INTERVALS'
AND O.OBJECT_NAME<>_UCS2'HISTOGRAMS_FREQ_VALS'
AND O.OBJECT_NAME<>_UCS2'MVS_TABLE_INFO_UMD'
AND O.OBJECT_NAME<>_UCS2'MVS_UMD'
AND O.OBJECT_NAME<>_UCS2'MVS_USED_UMD'
for read uncommitted access;"
# Find all tables/MVs with READ_TIME in recent past. Note that the ADDED_BY
# column is used here only to store the object type, which should be only
# BT (table) or MV.
query9="INSERT INTO NEO.PUBLIC_ACCESS_SCHEMA.USTAT_RECENT_HISTS_TBLS
SELECT DISTINCT _UCS2'NEO', _UCS2'$intschstrlit', O.OBJECT_NAME,
TIMESTAMP '0001-01-01 00:00:00',
TIMESTAMP '0001-01-01 00:00:00',
0, _UCS2'', O.OBJECT_TYPE
FROM NEO.HP_DEFINITION_SCHEMA.OBJECTS O
, NEO.HP_DEFINITION_SCHEMA.COLS C
, NEO.\"$extsch\".HISTOGRAMS H
WHERE O.OBJECT_UID = H.TABLE_UID
AND O.OBJECT_UID = C.OBJECT_UID
AND O.OBJECT_NAME_SPACE = 'TA'
AND C.COLUMN_NUMBER = H.COLUMN_NUMBER
AND O.OBJECT_NAME<>_UCS2'HISTOGRAMS'
AND O.OBJECT_NAME<>_UCS2'HISTOGRAM_INTERVALS'
AND O.OBJECT_NAME<>_UCS2'HISTOGRAMS_FREQ_VALS'
AND O.OBJECT_NAME<>_UCS2'MVS_TABLE_INFO_UMD'
AND O.OBJECT_NAME<>_UCS2'MVS_UMD'
AND O.OBJECT_NAME<>_UCS2'MVS_USED_UMD'
AND TIMESTAMP '$currentTime' - H.READ_TIME <
INTERVAL '$MAX_READ_SECS' SECOND(12,0)
for read uncommitted access;"
print "$query8 $query9" >> $AUTODIR/findTblsWHistsToUpdate
# Get next schema name and version.
read schema <&4;
done
# Run MXCI for all queries to find objects.
print "FillAutoTbl: Searching schemas to fill USTAT_MISSING/RECENT_TBLS." >> $filllog
errs=$($MXCI -i $AUTODIR/findTblsWHistsToUpdate | grep "\*\*\* ERROR" | sed -n '1p')
checkForErrs "$errs"
print "FillAutoTbl: List of tables with empty or recently read histograms:" >> $filllog
print "FillAutoTbl: Note: Recently read hists may not be obsolete." >> $filllog
queryP1="select _ISO88591'Empty hist: ',
SUBSTRING(SCH_NAME, 1, 30) || _UCS2' ' || SUBSTRING(TBL_NAME, 1, 30)
from NEO.PUBLIC_ACCESS_SCHEMA.USTAT_MISSING_STATS_TBLS;"
queryP2="select _ISO88591'Recent hist:',
SUBSTRING(SCH_NAME, 1, 30) || _UCS2' ' || SUBSTRING(TBL_NAME, 1, 30)
from NEO.PUBLIC_ACCESS_SCHEMA.USTAT_RECENT_HISTS_TBLS;"
print " Schema Table" >> $filllog
print "=================================================================" >> $filllog
print "${queryP1}${queryP2}" | $MXCI | grep " hist:" | grep -v ">>select" >> $filllog
# Fill AUTO_RUN_LIST with objects that are in both USTAT_AUTO_TABLES and
# MISSING_STATS_TBLS or RECENT_HISTS_TBLS. Objects for which ADDED_BY =
# 'EXCLUD' in USTAT_AUTO_TABLES are not inserted to AUTO_RUN_LIST. Instead,
# the ADDED_BY column of MISSING_STATS_TBLS and RECENT_HISTS_TBLS is prop-
# agated to AUTO_RUN_LIST which here stores the object type and is used by
# USAS.sh to issue correct MAINTAIN syntax.
print "FillAutoTbl: Updating USTAT_AUTO_RUN_LIST with list of tables to update." >> $filllog
# Send the query to file query10 first. This is to avoid * expansion
# if the entire query is assigned to a shell variable.
echo "INSERT INTO NEO.PUBLIC_ACCESS_SCHEMA.USTAT_AUTO_RUN_LIST
SELECT DISTINCT M.CAT_NAME, M.SCH_NAME, M.TBL_NAME,
M.LAST_RUN_GMT, M.LAST_RUN_LCT, M.RUN_STATUS,
M.ERROR_TEXT, T.ADDED_BY FROM $autoTable M,
(SELECT * FROM NEO.PUBLIC_ACCESS_SCHEMA.USTAT_MISSING_STATS_TBLS
UNION
SELECT * FROM NEO.PUBLIC_ACCESS_SCHEMA.USTAT_RECENT_HISTS_TBLS) T
WHERE (M.CAT_NAME=T.CAT_NAME AND M.SCH_NAME=T.SCH_NAME AND M.TBL_NAME=T.TBL_NAME
AND M.ADDED_BY <> _ISO88591'EXCLUD')
for read uncommitted access;" > $query10
errs=$($MXCI -i $query10 | grep "\*\*\* ERROR" | sed -n '1p')
checkForErrs "$errs"
else
print "FillAutoTbl: ERROR: Couldn't create USTAT_MISSING_STATS_TBLS, ..." >> $filllog
fi
else
print "FillAutoTbl: ERROR: Couldn't obtain schemas from USTAT_AUTO_TABLES." >> $filllog
fi
if [[ $errcnt != 0 ]]; then
print "FillAutoTbl: Because of errors, attempting to copy USTAT_AUTO_TABLES" >> $filllog
print " into USTAT_AUTO_RUN_LIST" >> $filllog
errcnt=0 # reset error count
query11="DROP TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_AUTO_RUN_LIST;"
print "$query11" | $MXCI > /dev/null
query12="CREATE TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_AUTO_RUN_LIST
LIKE $autoTable;"
query13="INSERT INTO NEO.PUBLIC_ACCESS_SCHEMA.USTAT_AUTO_RUN_LIST
SELECT CAT_NAME, SCH_NAME, TBL_NAME,
LAST_RUN_GMT, LAST_RUN_LCT, RUN_STATUS,
ERROR_TEXT, 'BT' FROM $autoTable
WHERE ADDED_BY <> _ISO88591'EXCLUD';"
print "$query12 $query13" | $MXCI >$AUTODIR/tmp
errs=$(cat $AUTODIR/tmp | grep "\*\*\* ERROR" | sed -n '1p')
checkForErrs "$errs"
fi
else
print "FillAutoTbl: There are no entries in USTAT_AUTO_TABLES." >> $filllog
# Drop temp tables, but don't check for errors.
query14="DROP TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_MISSING_STATS_TBLS;"
query15="DROP TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_RECENT_HISTS_TBLS;"
query16="DROP TABLE NEO.PUBLIC_ACCESS_SCHEMA.USTAT_AUTO_RUN_LIST;"
print "$query14 $query15 $query16" | $MXCI > /dev/null
fi
if [[ $errcnt != 0 ]]; then
# An error occurred.
print "FillAutoTbl: An error occurred while creating list of tables to run." >> $filllog
fi
print "FillAutoTbl: Processing completed." >> $filllog