70 lines
1.7 KiB
Bash
70 lines
1.7 KiB
Bash
#!/bin/sh
|
|
#
|
|
# pg_dumpall [pg_dump parameters]
|
|
# dumps all databases to standard output
|
|
# It also dumps the pg_shadow 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_pg_shadow \
|
|
from pg_database where datname = 'template1';"
|
|
echo "delete from pg_shadow where usesysid <> tmp_pg_shadow.datdba;"
|
|
echo "drop table tmp_pg_shadow;"
|
|
#
|
|
# load all the non-postgres users
|
|
#
|
|
echo "copy pg_shadow from stdin;"
|
|
psql -q template1 <<END
|
|
select pg_shadow.*
|
|
into table tmp_pg_shadow
|
|
from pg_shadow
|
|
where usesysid <> $POSTGRES_SUPER_USER_ID;
|
|
copy tmp_pg_shadow to stdout;
|
|
drop table tmp_pg_shadow;
|
|
END
|
|
echo "${BS}."
|
|
psql -A -q -t -c "select * from pg_database" template1 | grep '|' | tr '|' ' ' | \
|
|
grep -v '^template1 ' | \
|
|
while read DATABASE DBUSERID ENCODING DATAPATH
|
|
do
|
|
echo "${BS}connect template1 $DBUSERID"
|
|
|
|
if pg_encoding $ENCODING >/dev/null 2>&1
|
|
then
|
|
echo "create database $DATABASE with encoding='`pg_encoding $ENCODING`';"
|
|
else
|
|
echo "create database $DATABASE;"
|
|
fi
|
|
|
|
echo "${BS}connect $DATABASE $POSTGRES_USER"
|
|
pg_dump ${1+"$@"} $DATABASE
|
|
if [ "$?" -ne 0 ]
|
|
then echo "pg_dump failed on $DATABASE, exiting" 1>&2
|
|
exit 1
|
|
fi
|
|
done
|