PostgreSQLのデータベースクラスタをアップグレードする【pg_upgrade】

PostgreSQL

概要

PostgreSQLのデータベースをpg_upgradeを使用してアップグレード(バージョンアップ)する手順についてです。
PostgreSQLでは、メジャーバージョン間ではデータクラスタの互換性はありません。
そのためアップグレード用に「pg_upgrade」というコマンドが提供されています。

今回は以下の環境で試しています。

OSWindows 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
クラスタのインストールユーザの名称

pg_upgradeコマンドの詳細は公式のドキュメントを参照してください。

アップグレードの手順

今回のデータベースクラスタのアップグレードでは、以下のようなフォルダ構成になっています。

旧データベースクラスタ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」オプションを指定するとチェックのみ行うこともできます。
(ここでエラーがある場合は、エラーへの対処が必要となります。)

pg_upgrade --check
-cオプション指定時

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

pg_upgrade アップグレード
pg_upgrade アップグレード
pg_upgrade アップグレード

完了すると、後処理が必要な旨のメッセージと必要なファイル(バッチファイル、SQLファイル)が作業ディレクトリに出力されます。(後ほど実行します。)

pg_upgradeでは統計情報は移行されません。そのため完了後再集計する必要があります。

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
アップグレード後、統計情報集計

今回利用した環境では、PostgreSQL 10がインストールされている状態にPostgreSQL 16をインストールしているため、ポート番号がPostgreSQL 10が5432、PostgreSQL 16が5433となっています。
指定が面倒な場合は、サービス起動前にpostgresql.confのポート番号を入れ替えておくと良いです。

また、各コマンドをフルパスで指定していますが、PostgreSQL16側を環境変数に設定しておくと便利です。

終わりに

pg_upgrade完了時に出力された「delete_old_cluster.bat」ファイルは、名前の通り古い方のデータベースクラスタを削除するバッチです。中身は以下のような感じでdataフォルダをまるごと削除します。
古いデータクラスタを削除する必要があるならバッチを実行します。

@RMDIR /s/q "C:\Program Files\PostgreSQL\10\data"

以上でデータベースクラスタのアップグレードは完了です。

タイトルとURLをコピーしました