Upgrade de versión mayor con pg_upgrade --link (runbook de principio a fin)
PostgreSQLUpgradeComando
# As the postgres user, in a writable directory; example 16 -> 17
export OLD_BIN=/usr/pgsql-16/bin NEW_BIN=/usr/pgsql-17/bin
export OLD_DATA=/var/lib/pgsql/16/data NEW_DATA=/var/lib/pgsql/17/data
# 0) initdb the new cluster with the same encoding/locale and checksum setting as the old one (-k if the old cluster has checksums)
# 1) Compatibility check (can run while the old cluster is up, changes no data):
$NEW_BIN/pg_upgrade --old-bindir=$OLD_BIN --new-bindir=$NEW_BIN --old-datadir=$OLD_DATA --new-datadir=$NEW_DATA --check
# 2) Stop the old cluster and upgrade with hard links:
$OLD_BIN/pg_ctl -D $OLD_DATA stop -m fast
$NEW_BIN/pg_upgrade --old-bindir=$OLD_BIN --new-bindir=$NEW_BIN --old-datadir=$OLD_DATA --new-datadir=$NEW_DATA --link --jobs=4
# 3) Carry postgresql.conf/pg_hba.conf customizations over to the new cluster, start it:
$NEW_BIN/pg_ctl -D $NEW_DATA -l /tmp/pg17_start.log start
# 4) Gather statistics, run generated scripts if any:
$NEW_BIN/vacuumdb --all --analyze-in-stages
# psql -X -f update_extensions.sql (if pg_upgrade generated it)
# 5) After validation and a fresh backup, delete the old cluster:
./delete_old_cluster.shQué hace
Primero valida la compatibilidad con --check y luego realiza el upgrade mayor en minutos, independientemente del tamaño de los datos, creando hard links de los archivos de datos del clúster antiguo hacia la nueva versión en lugar de copiarlos; después recopila estadísticas por etapas y elimina el clúster antiguo.
Cuándo usarlo
Para pasar in situ un clúster grande a una nueva versión mayor con una caída aceptablemente breve (minutos).
Precaución
Con --link, una vez arrancado el clúster nuevo, el antiguo ya no se puede usar con seguridad; la única vuelta atrás es un backup tomado antes del upgrade. Los directorios de datos antiguo y nuevo deben estar en el mismo sistema de archivos. Los planes pueden ser malos en el clúster nuevo hasta que termine analyze. Si usa pgBackRest, ejecute stanza-upgrade y tome de inmediato un backup full nuevo; los backups de la versión antigua no se pueden restaurar en el clúster nuevo.