Обновление мажорной версии через pg_upgrade --link (сквозной runbook)
PostgreSQLОбновлениеКоманда
# 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.shЧто делает
Сначала проверяет совместимость через --check, затем выполняет мажорное обновление за минуты независимо от объёма данных, создавая жёсткие ссылки на файлы данных старого кластера в новой версии вместо их копирования; после этого поэтапно собирает статистику и удаляет старый кластер.
Когда использовать
Чтобы перевести большой кластер на месте на новую мажорную версию с приемлемо коротким простоем (минуты).
Внимание
С --link после запуска нового кластера старый кластер больше нельзя безопасно использовать; единственный путь назад — бэкап, снятый до обновления. Старый и новый каталоги данных должны находиться в одной файловой системе. Пока analyze не завершён, планы в новом кластере могут быть плохими. Если используете pgBackRest, сразу выполните stanza-upgrade и снимите новый полный бэкап; бэкапы старой версии нельзя восстановить в новый кластер.