#!/bin/sh # # pg_dumpall [pg_dump parameters] # dumps all databases to standard output # It also dumps the pg_user table # # to adapt to System V vs. BSD 'echo' #set -x if echo '\\' | grep '\\\\' >/dev/null 2>&1 then BS='\' # BSD else BS='\\' # System V fi # # Dump everyone but the postgres user # initdb creates him # # get the postgres user id # POSTGRES_SUPER_USER_ID="`echo \" \ select datdba \ from pg_database \ where datname = 'template1'; \" | \ psql -A -q -t template1`" echo "${BS}connect template1" # # delete all users in case they run this twice # # we don't use POSTGRES_SUPER_USER_ID because the postgres super user id # could be different on the two installations # echo "select datdba into table tmp_pguser \ from pg_database where datname = 'template1';" echo "delete from pg_user where usesysid <> tmp_pguser.datdba;" echo "drop table tmp_pguser;" # # load all the non-postgres users # echo "copy pg_user from stdin;" psql -q template1 < $POSTGRES_SUPER_USER_ID; copy tmp_pg_user to stdout; drop table tmp_pg_user; END echo "${BS}." psql -l -A -q -t| tr '|' ' ' | grep -v '^template1 ' | \ while read DATABASE DBUSERID DATAPATH do POSTGRES_USER="`echo \" \ select usename \ from pg_user \ where usesysid = $DBUSERID; \" | \ psql -A -q -t template1`" echo "${BS}connect template1 $POSTGRES_USER" echo "create database $DATABASE;" echo "${BS}connect $DATABASE $POSTGRES_USER" pg_dump "$@" $DATABASE if [ "$?" -ne 0 ] then echo "pg_dump failed on $DATABASE, exiting" 1>&2 exit 1 fi done