概要
PostgreSQLのデータベースをpg_upgradeを使用してアップグレード(バージョンアップ)する手順についてです。
PostgreSQLでは、メジャーバージョン間ではデータクラスタの互換性はありません。
そのためアップグレード用に「pg_upgrade」というコマンドが提供されています。
今回は以下の環境で試しています。
OS | Windows 10 64bit |
旧バージョン | PostgreSQL 10 |
新バージョン | PostgreSQL 16.4 |
pg_upgradeコマンドについて
pg_upgradeは、メジャーバージョンのアップグレードで通常必要とされるデータのダンプ/リストアを行うことなく、PostgreSQLのデータファイル内に格納されたデータをより最新のPostgreSQLメジャーバージョンに移行するためのツールです。
主なオプションには以下の通りです。
オプション | 内容 |
---|---|
-b bindir –old-bindir=bindir | 古いPostgreSQLの実行ファイル格納ディレクトリ |
-B bindir –new-bindir=bindir | 新しいPostgreSQLの実行ファイル格納ディレクトリ(デフォルトはpg_upgradeのあるディレクトリ) |
-c –check | クラスタの検査のみを行い、データの変更を行わない |
-d configdir –old-datadir=configdir | 古いクラスタの設定データディレクトリ |
-D configdir –new-datadir=configdir | 新しいクラスタの設定データディレクトリ |
-U username –username=username | クラスタのインストールユーザの名称 |
アップグレードの手順
今回のデータベースクラスタのアップグレードでは、以下のようなフォルダ構成になっています。
旧データベースクラスタ | C:\Program Files\PostgreSQL\10\data |
旧プログラムフォルダ | C:\Program Files\PostgresQL\10\bin |
新データベースクラスタ | C:\Program Files\PostgreSQL\16\data |
新プログラムフォルダ | C:\Program Files\PostgreSQL\16\bin |
作業フォルダ(任意のフォルダ) | C:\temp\upgrade |
それではpg_upgradeを使ってバージョンアップ作業を実施していきます。
PostgreSQLのサービス停止
旧バージョン、新バージョンのPostgreSQLのサービスを停止します。
管理者でコマンドプロンプトなどを開いて以下のコマンドを実行します。
net stop postgresql-x64-10
net stop postgresql-x64-16
pg_hba.confの編集
旧バージョン、新バージョン両方のpg_hba.confファイルを編集し、データベースの認証を「md5」や「scram-sh-256」などから「trust」へ変更します。
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
pg_upgradeの実行
管理者でコマンドプロンプトなどを開いて作業ディレクトリを作成し、作業ディレクトリに移動して新バージョン側のpg_upgradeコマンドを実行します。
引数にはユーザとして「postgres」、旧バージョン/新バージョンそれぞれのデータクラスタのフォルダとプログラムフォルダを渡します。
"C:\Program Files\PostgreSQL\16\bin\pg_upgrade.exe"
-U postgres
-d "C:\Program Files\PostgreSQL\10\data"
-D "C:\Program Files\PostgreSQL\16\data"
-b "C:\Program Files\PostgreSQL\10\bin"
-B "C:\program Files\PostgreSQL\16\bin"
実行時にチェック処理が動作しその後データのバージョンアップが行われますが、「-c」オプションを指定するとチェックのみ行うこともできます。
(ここでエラーがある場合は、エラーへの対処が必要となります。)

エラーは無いようなので「-c」オプションを外して実行します。



完了すると、後処理が必要な旨のメッセージと必要なファイル(バッチファイル、SQLファイル)が作業ディレクトリに出力されます。(後ほど実行します。)
pg_hba.confを元に戻す
pg_hba.confファイルのデータベースの認証を「trust」から元に戻します。その際、PostgreSQL16側は「scram-sh-256」でしたが、アップグレード前のPostgreSQL10側で「md5」であったため、PostgreSQL16側もそれに合わせ「md5」にします。
PostgreSQLのサービス開始
新バージョン側のサービスを開始します。
net start postgresql-x64-16
後処理
pg_upgrade完了時に表示されたメッセージに従って、拡張機能のアップグレードと統計情報の収集を行います。
まず、拡張機能のアップグレードです。
以下のコマンドでpsqlにて出力されたSQLファイルを実行します。
(PostgreSQL16側のポート番号はデフォルトではなく5433のため-pオプションで指定しています。)
"C:\Program Files\PostgreSQL\16\bin\psql.exe" -U postgres -p 5433 -f update_extensions.sql

次に統計情報の収集ですが、こちらは出力されたメッセージに従ってvacuumdbコマンドを実行します。(ポート番号の指定を追加しています。)
"C:\Program Files\PostgreSQL\16\bin\vacuumdb.exe" -U postgres -p 5433 --all --analyze-in-stages

終わりに
pg_upgrade完了時に出力された「delete_old_cluster.bat」ファイルは、名前の通り古い方のデータベースクラスタを削除するバッチです。中身は以下のような感じでdataフォルダをまるごと削除します。
古いデータクラスタを削除する必要があるならバッチを実行します。
@RMDIR /s/q "C:\Program Files\PostgreSQL\10\data"
以上でデータベースクラスタのアップグレードは完了です。