pg_upgrade --linkによるメジャーバージョンアップグレード(エンドツーエンドの手順書)
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を実行し直ちに新しいfullバックアップを取得する。旧バージョンのバックアップは新クラスタにリストアできない。