chatdesk-ui/postgres_15.8.1.044/nix/tools/migrate-tool.sh.in

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