124 lines
3.8 KiB
Bash
124 lines
3.8 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
[ ! -z "$DEBUG" ] && set -x
|
|
|
|
# first argument is the old version; a path 15 or 16
|
|
if [[ $1 == /nix/store* ]]; then
|
|
if [ ! -L "$1/receipt.json" ] || [ ! -e "$1/receipt.json" ]; then
|
|
echo "ERROR: $1 does not look like a valid Postgres install"
|
|
exit 1
|
|
fi
|
|
OLDVER="$1"
|
|
elif [ "$1" == "15" ]; then
|
|
PSQL15=@PSQL15_BINDIR@
|
|
OLDVER="$PSQL15"
|
|
elif [ "$1" == "16" ]; then
|
|
PSQL16=@PSQL16_BINDIR@
|
|
OLDVER="$PSQL16"
|
|
else
|
|
echo "Please provide a valid Postgres version (15 or 16), or a /nix/store path"
|
|
exit 1
|
|
fi
|
|
|
|
# second argument is the new version; 15 or 16
|
|
if [[ $2 == /nix/store* ]]; then
|
|
if [ ! -L "$2/receipt.json" ] || [ ! -e "$2/receipt.json" ]; then
|
|
echo "ERROR: $1 does not look like a valid Postgres install"
|
|
exit 1
|
|
fi
|
|
NEWVER="$2"
|
|
elif [ "$2" == "15" ]; then
|
|
PSQL15=@PSQL15_BINDIR@
|
|
NEWVER="$PSQL15"
|
|
elif [ "$2" == "16" ]; then
|
|
PSQL16=@PSQL16_BINDIR@
|
|
NEWVER="$PSQL16"
|
|
echo "NEWVER IS $NEWVER"
|
|
else
|
|
echo "Please provide a valid Postgres version (15 or 16), or a /nix/store path"
|
|
exit 1
|
|
fi
|
|
|
|
# thid argument is the upgrade method: either pg_dumpall or pg_ugprade
|
|
if [ "$3" != "pg_dumpall" ] && [ "$3" != "pg_upgrade" ]; then
|
|
echo "Please provide a valid upgrade method (pg_dumpall or pg_upgrade)"
|
|
exit 1
|
|
fi
|
|
UPGRADE_METHOD="$3"
|
|
|
|
echo "Old server build: PSQL $1"
|
|
echo "New server build: PSQL $2"
|
|
echo "Upgrade method: $UPGRADE_METHOD"
|
|
|
|
PORTNO="${2:-@PGSQL_DEFAULT_PORT@}"
|
|
DATDIR=$(mktemp -d)
|
|
NEWDAT=$(mktemp -d)
|
|
mkdir -p "$DATDIR" "$NEWDAT"
|
|
|
|
echo "NOTE: using temporary directory $DATDIR for PSQL $1 data, which will not be removed"
|
|
echo "NOTE: you are free to re-use this data directory at will"
|
|
echo
|
|
|
|
$OLDVER/bin/initdb -D "$DATDIR" --locale=C --username=supabase_admin
|
|
$NEWVER/bin/initdb -D "$NEWDAT" --locale=C --username=supabase_admin
|
|
|
|
# NOTE (aseipp): we need to patch postgresql.conf to have the right pgsodium_getkey script
|
|
PSQL_CONF_FILE=@PSQL_CONF_FILE@
|
|
PGSODIUM_GETKEY_SCRIPT=@PGSODIUM_GETKEY@
|
|
echo "NOTE: patching postgresql.conf files"
|
|
for x in "$DATDIR" "$NEWDAT"; do
|
|
sed \
|
|
"s#@PGSODIUM_GETKEY_SCRIPT@#$PGSODIUM_GETKEY_SCRIPT#g" \
|
|
$PSQL_CONF_FILE > "$x/postgresql.conf"
|
|
done
|
|
|
|
echo "NOTE: Starting first server (v${1}) to load data into the system"
|
|
$OLDVER/bin/pg_ctl start -D "$DATDIR"
|
|
|
|
PRIMING_SCRIPT=@PRIMING_SCRIPT@
|
|
MIGRATION_DATA=@MIGRATION_DATA@
|
|
|
|
$OLDVER/bin/psql -h localhost -d postgres -Xf "$PRIMING_SCRIPT"
|
|
$OLDVER/bin/psql -h localhost -d postgres -Xf "$MIGRATION_DATA"
|
|
|
|
if [ "$UPGRADE_METHOD" == "pg_upgrade" ]; then
|
|
echo "NOTE: Stopping old server (v${1}) to prepare for migration"
|
|
$OLDVER/bin/pg_ctl stop -D "$DATDIR"
|
|
|
|
echo "NOTE: Migrating old data $DATDIR to $NEWDAT using pg_upgrade"
|
|
|
|
export PGDATAOLD="$DATDIR"
|
|
export PGDATANEW="$NEWDAT"
|
|
export PGBINOLD="$OLDVER/bin"
|
|
export PGBINNEW="$NEWVER/bin"
|
|
|
|
if ! $NEWVER/bin/pg_upgrade --check; then
|
|
echo "ERROR: pg_upgrade check failed"
|
|
exit 1
|
|
fi
|
|
|
|
echo "NOTE: pg_upgrade check passed, proceeding with migration"
|
|
$NEWVER/bin/pg_upgrade
|
|
rm -f delete_old_cluster.sh # we don't need this
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$UPGRADE_METHOD" == "pg_dumpall" ]; then
|
|
SQLDAT="$DATDIR/dump.sql"
|
|
echo "NOTE: Exporting data via pg_dumpall ($SQLDAT)"
|
|
$NEWVER/bin/pg_dumpall -h localhost > "$SQLDAT"
|
|
|
|
echo "NOTE: Stopping old server (v${1}) to prepare for migration"
|
|
$OLDVER/bin/pg_ctl stop -D "$DATDIR"
|
|
|
|
echo "NOTE: Starting second server (v${2}) to load data into the system"
|
|
$NEWVER/bin/pg_ctl start -D "$NEWDAT"
|
|
|
|
echo "NOTE: Loading data into new server (v${2}) via 'cat | psql'"
|
|
cat "$SQLDAT" | $NEWVER/bin/psql -h localhost -d postgres
|
|
|
|
printf "\n\n\n\n"
|
|
echo "NOTE: Done, check logs. Stopping the server; new database is located at $NEWDAT"
|
|
$NEWVER/bin/pg_ctl stop -D "$NEWDAT"
|
|
fi
|