Script to convert onstat -d to onspaces commands
Posted in 1997
#!/bin/sh
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# copy_spaces.sh -- A program to convert dbspace/chunk information # available from the [on|tb]stat -d command into onspaces # commands.
#
# Comes in very handy if you need to duplicate the dbspace
# setup onto an another instance or if you have to rebuild
# an instance.
#
# Currently, blobspaces will not be reproduced by this
# script. Also, it is assumed that none of the dbspaces
# are being recovered, either physically or logically.
#
# Output will go to standard output
#
# +-----------------------------------------------------------+
# | Pete Stiglich DBA (602)-941-6227 |
# | ProMark One Marketing Services stiglich@promarkone.com |
# | http://www.promarkone.com |
# +-----------------------------------------------------------+
#
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# This program comes as is. Standard disclaimers apply.
# Let me know your thoughts. I will try to answer any questions.
# This was written on a Solaris 2.5 machine. If nawk gives you problems you
# might need to pass the variable at the end of the nawk script instead of
# using the -v at the start of the nawk script. Here is an example:
# VAR="xyz"
# nawk ' if ($1 == var) { print $0 } ' var=$VAR /tmp/foobar
# instead of
# nawk -v var=$VAR ' if ($1 == var) { print $0 } ' /tmp/foobar
#
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# Determine Engine version
if [ -x $INFORMIXDIR/bin/onstat ]
then
STAT="onstat"
else
STAT="tbstat"
fi
# Get dbspace information
# Get the number, first chunk,flags and dbspace name
$STAT -d | sed '1,5d' | awk ' BEGIN { i=0 } {
if ($1 == "Chunks") { i=1 }
if (i == 0 && NF == 9) { printf ("%s %s %s %s %s\\n", $2,$4,$6,$9,$7) }
if (i == 0 && NF == 8) { printf ("%s %s %s %s\\n", $2,$4,$6,$8) }
} ' >/tmp/dbsp.$$
# Get chunk information
# Get the chunk number, dbs number, offset, size,flags & path
$STAT -d | awk ' BEGIN { i=0 } {
if ($1 == "Chunks") { i=1 }
if (i == 1 && $1 != "address" && NF == 8) {
printf ("%s %s %s %s %s %s\\n", $2,$3,$4,$5,$7,$8 )
}
} ' >/tmp/chunk.$$
# Just get primary chunks
for CHUNK in `cat /tmp/chunk.$$ |\\
awk ' { if ( substr($5,1,1) == "P") print $1 }'`
do
# Don't reproduce the onspaces for the 1'st root dbspace chunk
if [ $CHUNK -eq 1 ]
then
continue
fi
DBSNUM=`grep $CHUNK /tmp/chunk.$$ |\\
nawk -v chunk=$CHUNK ' { if ($1 == chunk && substr($5,1,1) == "P")
{ print $2 } } '`
OFFSET=`grep $CHUNK /tmp/chunk.$$ |\\
nawk -v chunk=$CHUNK ' { if ($1 == chunk && substr($5,1,1) == "P")
{ print $3 } } '`
SIZE=`grep $CHUNK /tmp/chunk.$$ |\\
nawk -v chunk=$CHUNK ' { if ($1 == chunk && substr($5,1,1) == "P")
{ print $4 } } '`
CHKPTH=`grep $CHUNK /tmp/chunk.$$ |\\
nawk -v chunk=$CHUNK ' { if ($1 == chunk && substr($5,1,1) == "P")
print $6 } '`
# Is this the first chunk in the dbspace?
ISFIRST=0
for i in `grep $CHUNK /tmp/dbsp.$$ | awk ' { print $2 } '`
do
if [ $i -eq $CHUNK ]
then
ISFIRST=$CHUNK
break
else
ISFIRST=0
fi
done
MIRRORED=`grep $DBSNUM /tmp/dbsp.$$ |\\
nawk -v dbsnum=$DBSNUM ' { if ($1 == dbsnum) print $3 } '`
if [ "$MIRRORED" = "M" ]
then
MPATH=`grep $CHUNK /tmp/chunk.$$ |\\
nawk -v chunk=$CHUNK ' { if ( $1 == chunk && substr($5,1,1) == "M")
{ print $6 } } '`
MOFFSET=`grep $CHUNK /tmp/chunk.$$ |\\
nawk -v chunk=$CHUNK ' { if ( $1 == chunk && substr($5,1,1) == "M")
{ print $3 } } '`
MPATH="-m $MPATH"
else
MPATH=""
MOFFSET=""
fi
DBSPACE=`grep $DBSNUM /tmp/dbsp.$$ |\\
nawk -v dbsnum=$DBSNUM ' { if ($1 == dbsnum) { print $4 } } '`
ISTEMP=`grep $DBSPACE /tmp/dbsp.$$ |\\
awk ' { if (NF == 5 && $5 == "T") printf ("%s", "-t")
else printf ("%s", "") } '`
echo "DBSPACE $DBSNUM $DBSPACE -- CHUNK $CHUNK "
# Convert pages to kbytes
OFFSET=`expr $OFFSET \\* 2`
SIZE=`expr $SIZE \\* 2`
if [ MOFFSET ]
then
MOFFSET=`expr MOFFSET \\* 2`
fi
# Output commands to build dbspaces/chunks
if [ "$STAT" = "onstat" ]
then
SPACES="onspaces"
else
SPACES="tbspaces"
fi
if [ $ISFIRST -ne 0 ] then echo "$SPACES -c -d $DBSPACE $ISTEMP -p
$CHKPTH -o $OFFSET -s $SIZE $MPATH $MOFFSET" else echo "$SPACES -a
$DBSPACE -p $CHKPTH -o $OFFSET -s $SIZE $MPATH $MOFFSET" fi done
rm /tmp/dbsp.$$
rm /tmp/chunk.$$
-------------------==== Posted via Deja News ====-----------------------
http://www.dejanews.com/ Search, Read, Post to Usenet