論理レプリケーションクラスタの移行は、旧論理レプリケーションクラスタがすべてバージョン17.0以降の場合にのみ可能です。
pg_upgradeは論理スロットの移行を試みます。 これは、新しいパブリッシャー上で同じ論理スロットを手動で定義する必要性を回避するのに役立ちます。 論理スロットの移行は、古いクラスタがバージョン17.0以降の場合にのみサポートされます。 バージョン17.0より前のクラスタ上の論理スロットは、警告なく無視されます。
パブリッシャークラスタのアップグレードを開始する前に、ALTER SUBSCRIPTION ... DISABLEを実行して、サブスクリプションが一時的に無効になっていることを確認してください。
アップグレード後にサブスクリプションを再度有効にしてください。
pg_upgradeが論理スロットをアップグレードできるようにするための前提条件がいくつかあります。 これらが満たされていない場合はエラーが報告されます。
新しいクラスタはwal_levelをlogicalにする必要があります。
新しいクラスタは、古いクラスタに存在するスロットの数以上の値にmax_replication_slotsを設定する必要があります。
古いクラスタのスロットで参照される出力プラグインは、新しいPostgreSQLの実行ファイル格納ディレクトリにインストールする必要があります。
古いクラスタは、すべてのトランザクションとロジカルデコーディングメッセージをサブスクライバーに複製済です。
古いクラスタの全てのスロットが使用可能でなければなりません。
つまりpg_replication_slots.conflictingがtrueであってはいけません。
新しいクラスタは、永続的な論理スロットを持ってはなりません。
つまり、pg_replication_slots.temporaryがfalseであってはいけません。
新しいサブスクライバーにサブスクライバー構成を設定します。 pg_upgradeは、pg_subscription_relシステムカタログに存在するサブスクリプションのテーブル情報と、サブスクリプションのレプリケーション元を含むサブスクリプション依存関係の移行を試みます。 これにより、新しいサブスクライバーで論理レプリケーションを、古いサブスクライバーが存在していた場所から継続できます。 サブスクリプションの依存関係の移行は、古いクラスタがバージョン17.0以降の場合にのみサポートされます。 バージョン17.0より前のクラスタに対するサブスクリプションの依存関係は、警告なく無視されます。
pg_upgradeがサブスクリプションをアップグレードできるようにするための前提条件がいくつかあります。 これらが満たされていない場合はエラーが報告されます。
古いサブスクライバーのすべてのサブスクリプションテーブルはi(初期化)またはr(準備完了)の状態である必要があります。
これはpg_subscription_rel.srsubstateを調べることで確認できます。
各サブスクリプションに対応するレプリケーション起点エントリは、古いクラスタに存在する必要があります。 これは、pg_subscriptionとpg_replication_originシステムテーブルを調べることで見つけることができます。
新しいクラスタは、古いクラスタに存在するサブスクリプションの数以上の値にmax_active_replication_originsを設定する必要があります。
サブスクライバーをアップグレードしている間、書き込み操作はパブリッシャーでのみ実行できます。 これらの変更は、サブスクライバーのアップグレードが完了すると複製されます。
論理レプリケーションの制限は、論理レプリケーションクラスタのアップグレードにも適用されます。 詳細は29.8を参照してください。
パブリッシャーアップグレードの前提条件は、論理レプリケーションクラスタのアップグレードにも適用されます。 詳細は29.13.1を参照してください。
サブスクライバーアップグレードの前提条件は、論理レプリケーションクラスタのアップグレードにも適用されます。 詳細は29.13.2を参照してください。
論理レプリケーションクラスタのアップグレードは、様々なノードで複数の手順を実行する必要があります。 すべての処理がトランザクションのように振る舞うわけではないため、25.3.2の手順に従ってバックアップを取得することをお薦めします。
論理レプリケーションクラスタをアップグレードする手順は以下の通りです。
パブリッシャーがnode1にあり、サブスクライバーがnode2にあるとします。
サブスクライバーnode2には、node1から変更をサブスクライブしているサブスクリプションsub1_node1_node2があります。
ALTER SUBSCRIPTION ... DISABLEを使用して、node1からの変更をサブスクライブしているnode2上のすべてのサブスクリプションを無効にします。以下は、その例です。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 DISABLE;
node1にあるパブリッシャーサーバを停止します。
pg_ctl -D /opt/PostgreSQL/data1 stop
必要とされる新しいバージョンを使用して、data1_upgradedインスタンスを初期化します。
必要とされる新しいバージョンを使用して、node1にあるパブリッシャーサーバをアップグレードします。
pg_upgrade
--old-datadir "/opt/PostgreSQL/postgres/17/data1"
--new-datadir "/opt/PostgreSQL/postgres/18/data1_upgraded"
--old-bindir "/opt/PostgreSQL/postgres/17/bin"
--new-bindir "/opt/PostgreSQL/postgres/18/bin"
node1にあるアップグレードされたパブリッシャーサーバを起動します。
pg_ctl -D /opt/PostgreSQL/data1_upgraded start -l logfile
node2にあるサブスクライバーサーバを停止します。
pg_ctl -D /opt/PostgreSQL/data2 stop
必要とされる新しいバージョンを使用して、data2_upgradedインスタンスを初期化します。
必要とされる新しいバージョンを使用して、node2にあるサブスクライバーサーバをアップグレードします。
pg_upgrade
--old-datadir "/opt/PostgreSQL/postgres/17/data2"
--new-datadir "/opt/PostgreSQL/postgres/18/data2_upgraded"
--old-bindir "/opt/PostgreSQL/postgres/17/bin"
--new-bindir "/opt/PostgreSQL/postgres/18/bin"
node2にあるアップグレードされたサブスクライバーサーバを起動します。
pg_ctl -D /opt/PostgreSQL/data2_upgraded start -l logfile
node2上で、ステップ 1と現在までの間に、パブリッシャーサーバnode1で作成されたすべてのテーブルを作成します。
/* node2 # */ CREATE TABLE distributors (did integer PRIMARY KEY, name varchar(40));
ALTER SUBSCRIPTION ... ENABLEコマンドを使用して、node1からの変更をサブスクライブするnode2上のすべてのサブスクリプションを有効にします。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 ENABLE;
ALTER SUBSCRIPTION ... REFRESH PUBLICATIONコマンドを使用して、node2サブスクリプションのパブリケーションをリフレッシュします。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 REFRESH PUBLICATION;
上記の手順では、パブリッシャーが最初にアップグレードされ、次にサブスクライバーがアップグレードされます。 または、同様の手順を使用して、まずサブスクライバーをアップグレードし、次にパブリッシャーをアップグレードすることもできます。
カスケードされた論理レプリケーションセットアップnode1->node2->node3があるとします。
ここで、node2はnode1からの変更をサブスクライブしており、node3はnode2からの変更をサブスクライブしています。
node2にはnode1からの変更をサブスクライブしているsub1_node1_node2サブスクリプションがあります。
node3にはnode2からの変更をサブスクライブしているsub1_node2_node3サブスクリプションがあります。
node3
ALTER SUBSCRIPTION ... DISABLEを使用して、node1からの変更をサブスクライブしているnode2上のすべてのサブスクリプションを無効にします。以下は、その例です。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 DISABLE;
node1にあるサーバを停止します。
pg_ctl -D /opt/PostgreSQL/data1 stop
必要とされる新しいバージョンを使用して、data1_upgradedインスタンスを初期化します。
必要とされる新しいバージョンを使用して、node1にあるサーバをアップグレードします。
pg_upgrade
--old-datadir "/opt/PostgreSQL/postgres/17/data1"
--new-datadir "/opt/PostgreSQL/postgres/18/data1_upgraded"
--old-bindir "/opt/PostgreSQL/postgres/17/bin"
--new-bindir "/opt/PostgreSQL/postgres/18/bin"
node1にあるアップグレードされたサーバを起動します。
pg_ctl -D /opt/PostgreSQL/data1_upgraded start -l logfile
ALTER SUBSCRIPTION ... DISABLEを使用して、node2からの変更をサブスクライブしているnode3上のすべてのサブスクリプションを無効にします。
/* node3 # */ ALTER SUBSCRIPTION sub1_node2_node3 DISABLE;
node2にあるサーバを停止します。
pg_ctl -D /opt/PostgreSQL/data2 stop
必要とされる新しいバージョンを使用して、data2_upgradedインスタンスを初期化します。
必要とされる新しいバージョンを使用して、node2にあるサーバをアップグレードします。
pg_upgrade
--old-datadir "/opt/PostgreSQL/postgres/17/data2"
--new-datadir "/opt/PostgreSQL/postgres/18/data2_upgraded"
--old-bindir "/opt/PostgreSQL/postgres/17/bin"
--new-bindir "/opt/PostgreSQL/postgres/18/bin"
node2にあるアップグレードされたサーバを起動します。
pg_ctl -D /opt/PostgreSQL/data2_upgraded start -l logfile
node2上で、ステップ 1と現在までの間に、パブリッシャーサーバnode1で作成されたすべてのテーブルを作成します。
/* node2 # */ CREATE TABLE distributors (did integer PRIMARY KEY, name varchar(40));
ALTER SUBSCRIPTION ... ENABLEコマンドを使用して、node1からの変更をサブスクライブするnode2上のすべてのサブスクリプションを有効にします。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 ENABLE;
ALTER SUBSCRIPTION ... REFRESH PUBLICATIONコマンドを使用して、node2サブスクリプションのパブリケーションをリフレッシュします。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 REFRESH PUBLICATION;
node3にあるサーバを停止します。
pg_ctl -D /opt/PostgreSQL/data3 stop
必要とされる新しいバージョンを使用して、data3_upgradedインスタンスを初期化します。
必要とされる新しいバージョンを使用して、node3にあるサーバをアップグレードします。
pg_upgrade
--old-datadir "/opt/PostgreSQL/postgres/17/data3"
--new-datadir "/opt/PostgreSQL/postgres/18/data3_upgraded"
--old-bindir "/opt/PostgreSQL/postgres/17/bin"
--new-bindir "/opt/PostgreSQL/postgres/18/bin"
node3にあるアップグレードされたサーバを起動します。
pg_ctl -D /opt/PostgreSQL/data3_upgraded start -l logfile
node3上で、ステップ 6と現在までの間に、パブリッシャーサーバnode2で作成されたすべてのテーブルを作成します。
/* node3 # */ CREATE TABLE distributors (did integer PRIMARY KEY, name varchar(40));
ALTER SUBSCRIPTION ... ENABLEコマンドを使用して、node2からの変更をサブスクライブするnode3上のすべてのサブスクリプションを有効にします。
/* node3 # */ ALTER SUBSCRIPTION sub1_node2_node3 ENABLE;
ALTER SUBSCRIPTION ... REFRESH PUBLICATIONコマンドを使用して、node3サブスクリプションのパブリケーションをリフレッシュします。
/* node3 # */ ALTER SUBSCRIPTION sub1_node2_node3 REFRESH PUBLICATION;
循環論理レプリケーションセットアップnode1->node2およびnode2->node1があるとします。
ここで、node2はnode1からの変更をサブスクライブしており、node1はnode2からの変更をサブスクライブしています。
node1にはnode2からの変更をサブスクライブしているsub1_node2_node1サブスクリプションがあります。
node2にはnode1からの変更をサブスクライブしているsub1_node1_node2サブスクリプションがあります。
ALTER SUBSCRIPTION ... DISABLEを使用して、node1からの変更をサブスクライブしているnode2上のすべてのサブスクリプションを無効にします。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 DISABLE;
node1にあるサーバを停止します。
pg_ctl -D /opt/PostgreSQL/data1 stop
必要とされる新しいバージョンを使用して、data1_upgradedインスタンスを初期化します。
必要とされる新しいバージョンを使用して、node1にあるサーバをアップグレードします。
pg_upgrade
--old-datadir "/opt/PostgreSQL/postgres/17/data1"
--new-datadir "/opt/PostgreSQL/postgres/18/data1_upgraded"
--old-bindir "/opt/PostgreSQL/postgres/17/bin"
--new-bindir "/opt/PostgreSQL/postgres/18/bin"
node1にあるアップグレードされたサーバを起動します。
pg_ctl -D /opt/PostgreSQL/data1_upgraded start -l logfile
ALTER SUBSCRIPTION ... ENABLEコマンドを使用して、node1からの変更をサブスクライブするnode2上のすべてのサブスクリプションを有効にします。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 ENABLE;
node1上で、ステップ 1と現在までの間に、パブリッシャーサーバnode2で作成されたすべてのテーブルを作成します。
/* node1 # */ CREATE TABLE distributors (did integer PRIMARY KEY, name varchar(40));
node1サブスクリプションのパブリケーションをリフレッシュして、初期テーブルデータをnode2からコピーするために、ALTER SUBSCRIPTION ... REFRESH PUBLICATIONコマンドを使用します。
/* node1 # */ ALTER SUBSCRIPTION sub1_node2_node1 REFRESH PUBLICATION;
ALTER SUBSCRIPTION ... DISABLEを使用して、node2からの変更をサブスクライブしているnode1上のすべてのサブスクリプションを無効にします。
/* node1 # */ ALTER SUBSCRIPTION sub1_node2_node1 DISABLE;
node2にあるサーバを停止します。
pg_ctl -D /opt/PostgreSQL/data2 stop
必要とされる新しいバージョンを使用して、data2_upgradedインスタンスを初期化します。
必要とされる新しいバージョンを使用して、node2にあるサーバをアップグレードします。
pg_upgrade
--old-datadir "/opt/PostgreSQL/postgres/17/data2"
--new-datadir "/opt/PostgreSQL/postgres/18/data2_upgraded"
--old-bindir "/opt/PostgreSQL/postgres/17/bin"
--new-bindir "/opt/PostgreSQL/postgres/18/bin"
node2にあるアップグレードされたサーバを起動します。
pg_ctl -D /opt/PostgreSQL/data2_upgraded start -l logfile
ALTER SUBSCRIPTION ... ENABLEコマンドを使用して、node2からの変更をサブスクライブするnode1上のすべてのサブスクリプションを有効にします。
/* node1 # */ ALTER SUBSCRIPTION sub1_node2_node1 ENABLE;
node2上で、ステップ 9と現在までの間に、パブリッシャーサーバnode1で作成されたすべてのテーブルを作成します。
/* node2 # */ CREATE TABLE distributors (did integer PRIMARY KEY, name varchar(40));
ALTER SUBSCRIPTION ... REFRESH PUBLICATIONコマンドを使用して、初期テーブルデータをnode1からコピーするために、node2サブスクリプションのパブリケーションをリフレッシュします。
/* node2 # */ ALTER SUBSCRIPTION sub1_node1_node2 REFRESH PUBLICATION;