postgresql/src/bin/scripts/vacuumdb
Tom Lane 320b6db090 Changes from Vince Vielhaber to allow the optional clauses of CREATE
USER and ALTER USER to appear in any order, not only the fixed order
they used to be required to appear in.
Also, some changes from Tom Lane to create a FULL option for VACUUM;
it doesn't do anything yet, but I needed to change many of the same
files to make that happen, so now seemed like a good time.
2001-07-10 22:09:29 +00:00

169 lines
4.2 KiB
Bash

#!/bin/sh
#-------------------------------------------------------------------------
#
# vacuumdb--
# vacuum a postgres database
#
# This script runs psql with the "-c" option to vacuum
# the requested database.
#
# Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
# Portions Copyright (c) 1994, Regents of the University of California
#
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/bin/scripts/Attic/vacuumdb,v 1.17 2001/07/10 22:09:29 tgl Exp $
#
#-------------------------------------------------------------------------
CMDNAME=`basename $0`
PATHNAME=`echo $0 | sed "s,$CMDNAME\$,,"`
PSQLOPT=
full=
verbose=
analyze=
table=
dbname=
alldb=
quiet=0
while [ $# -gt 0 ]
do
case "$1" in
--help|-\?)
usage=t
break
;;
# options passed on to psql
--host|-h)
PSQLOPT="$PSQLOPT -h $2"
shift;;
-h*)
PSQLOPT="$PSQLOPT $1"
;;
--host=*)
PSQLOPT="$PSQLOPT -h "`echo $1 | sed 's/^--host=//'`
;;
--port|-p)
PSQLOPT="$PSQLOPT -p $2"
shift;;
-p*)
PSQLOPT="$PSQLOPT $1"
;;
--port=*)
PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
;;
--username|-U)
PSQLOPT="$PSQLOPT -U $2"
shift;;
-U*)
PSQLOPT="$PSQLOPT $1"
;;
--username=*)
PSQLOPT="$PSQLOPT -U "`echo $1 | sed 's/^--username=//'`
;;
--password|-W)
PSQLOPT="$PSQLOPT -W"
;;
--echo|-e)
ECHOOPT="-e"
;;
--quiet|-q)
ECHOOPT="$ECHOOPT -o /dev/null"
quiet=1
;;
--dbname|-d)
dbname="$2"
shift;;
-d*)
dbname=`echo $1 | sed 's/^-d//'`
;;
--dbname=*)
dbname=`echo $1 | sed 's/^--dbname=//'`
;;
# options converted into SQL command
--analyze|-z)
analyze="ANALYZE"
;;
--all|-a)
alldb=Y
;;
--table|-t)
table="$2"
shift;;
-t*)
table=`echo $1 | sed 's/^-t//'`
;;
--table=*)
table=`echo $1 | sed 's/^--table=//'`
;;
--full|-f)
full="FULL"
;;
--verbose|-v)
verbose="VERBOSE"
;;
-*)
echo "$CMDNAME: invalid option: $1" 1>&2
echo "Try '$CMDNAME --help' for more information." 1>&2
exit 1
;;
*)
dbname="$1"
;;
esac
shift
done
if [ "$usage" ]; then
echo "$CMDNAME cleans and analyzes a PostgreSQL database."
echo
echo "Usage:"
echo " $CMDNAME [options] [dbname]"
echo
echo "Options:"
echo " -h, --host=HOSTNAME Database server host"
echo " -p, --port=PORT Database server port"
echo " -U, --username=USERNAME Username to connect as"
echo " -W, --password Prompt for password"
echo " -d, --dbname=DBNAME Database to vacuum"
echo " -a, --all Vacuum all databases"
echo " -t, --table='TABLE[(columns)]' Vacuum specific table only"
echo " -f, --full Do full vacuuming"
echo " -v, --verbose Write a lot of output"
echo " -z, --analyze Update optimizer hints"
echo " -e, --echo Show the command being sent to the backend"
echo " -q, --quiet Don't write any output"
echo
echo "Read the description of the SQL command VACUUM for details."
echo
echo "Report bugs to <pgsql-bugs@postgresql.org>."
exit 0
fi
if [ "$alldb" ]; then
if [ "$dbname" -o "$table" ]; then
echo "$CMDNAME: cannot vacuum all databases and a specific one at the same time" 1>&2
exit 1
fi
dbname=`${PATHNAME}psql $PSQLOPT -q -t -A -d template1 -c 'SELECT datname FROM pg_database WHERE datallowconn'`
elif [ -z "$dbname" ]; then
echo "$CMDNAME: missing required argument: database name" 1>&2
echo "Try '$CMDNAME -?' for help." 1>&2
exit 1
fi
for db in $dbname
do
[ "$alldb" -a "$quiet" -ne 1 ] && echo "Vacuuming $db"
${PATHNAME}psql $PSQLOPT $ECHOOPT -c "VACUUM $full $verbose $analyze $table" -d $db
if [ $? -ne 0 ]; then
echo "$CMDNAME: vacuum $table $db failed" 1>&2
exit 1
fi
done
exit 0