Upgrading the seed node and installing PGD
==========================================

このフェーズでは、シードノードでPostgresディストリビューションのメジャーバージョンのアップグレードを実行し、
Postgres Distributed用に準備します。

アップグレードのシードノードの準備
----------------------------------

メジャーバージョンのアップグレードを実行するには、シードノードをオフラインにする必要があります。アップグレード後にサブスクリプションのメタデータを手動で更新する必要があるため、サービスを停止する前に論理サブスクリプションを無効にすることを強くお勧めします。

1. シードノードで、論理レプリケーションを無効にします。

.. code:: sql

       ALTER SUBSCRIPTION migration_seed_sub DISABLE;

1. シードノードで既存のPostgresインスタンスを停止します。

.. code:: bash

       su -u enterprisedb --command "pg_ctl stop"

1. ターゲットバージョンのパッケージをシードノードにインストールします。
   ``pg_upgrade``
   は、移行を実行するために両方のバージョンのバイナリを必要とするため、古いバージョンがインストールされたままであることを確認します。詳細は、
   `Installing EPAS <https://www.enterprisedb.com/docs/epas/latest/installing/>`_  、 `Installing PGE <https://www.enterprisedb.com/docs/pge/latest/installing/>`_  、または
   :ref:`Postgresのインストール <Postgresのインストール>` を参照してください。

2. 新しいバイナリたとえば ``/usr/edb/as17/bin/``
   を指すように\ ``${PATH}`` 環境変数を調整し、バージョンを確認します。

.. code:: bash

       which pg_ctl

インプレースアップグレードの実行
--------------------------------

データファイルをコピーする代わりにハードリンクを使用するインプレースアップグレードには、
``--link`` フラグを\ ``pg_upgrade``
とともに使用します。これにより、必要なディスク領域と時間が大幅に削減されますが、古い
``${OLD_PGDATA}`` と新しい ``${NEW_PGDATA}``
ディレクトリの両方が同じファイルシステム上に存在する必要があります。

1. シードノードで、新しいデータディレクトリを準備します。

.. code:: bash

       OLD_PGDATA = ${PGDATA}
       unset PGDATA
       mkdir ${NEW_PGDATA}
       chown enterprisedb: ${NEW_PGDATA}
       chmod 700 ${NEW_PGDATA}
       su enterprisedb -c "initdb -D ${NEW_PGDATA} -E utf-8"

1. シードノードで、最初にチェックモードで\ ``pg_upgrade`` を実行します。

.. code:: bash

       mkdir /tmp/pg_upgrade
       cd /tmp/pg_upgrade
       su postgres -c "pg_upgrade \
       --old-datadir ${OLD_PGDATA} \
       --new-datadir ${NEW_PGDATA} \
       --old-bindir /usr/edb/as14/bin/ \
       --new-bindir /usr/edb/as17/bin/ \
       --link \
       --check"

1. チェックで肯定的な結果が返された場合は、 ``--check``
   フラグを使用せずに同じコマンドを実行して、実際のアップグレードを実行します。

.. code:: bash

       cd /tmp/pg_upgrade
       su postgres -c "pg_upgrade \
       --old-datadir ${OLD_PGDATA} \
       --new-datadir ${NEW_PGDATA} \
       --old-bindir /usr/edb/as14/bin/ \
       --new-bindir /usr/edb/as17/bin/ \
       --link"

1. 完了したら、Postgresディストリビューションの新しいバージョンを起動します。

.. code:: bash

       su -u enterprisedb --command "pg_ctl start"

サブスクリプションの再有効化
----------------------------

メジャーバージョンのアップグレードでは、サブスクリプションの内部テーブルマッピング情報は引き継がれません。特に、カタログテーブル\ ``pg_subscription_rel``
は空になります。サブスクリプションをすぐに有効にすると、テーブルデータを同期せずにレプリケーションスロットが前方に移動され、データ損失が発生します。

これを回避するには、サブスクリプションを「偽構成」して、テーブルメタデータの更新中に実際のスロットを進めないようにする必要があります。存在しないスロットについてシードノードログで報告されるエラーは無視して安全です。

1. シードノードで、偽のスロットをポイントしてメタデータを安全に更新します。

.. code:: sql

       ALTER SUBSCRIPTION migration_seed_sub SET (slot_name = bogus);

1. パブリケーションを有効にして更新します。

.. code:: sql

       ALTER SUBSCRIPTION migration_seed_sub ENABLE;
       ALTER SUBSCRIPTION migration_seed_sub REFRESH PUBLICATION WITH (copy_data = false);
       ALTER SUBSCRIPTION migration_seed_sub DISABLE;

1. サブスクリプションのテーブルリストが
   :ref:`シードノードへの論理レプリケーションの有効化 <シードノードへの論理レプリケーションの有効化>` で取得した構成と一致することを確認します。

.. code:: sql

       SELECT n.nspname AS schemaname,
           c.relname AS tablename,
           sr.srsubstate AS state,
           s.subname AS subscription_name
       FROM pg_subscription_rel sr
       JOIN pg_class c ON sr.srrelid = c.oid
       JOIN pg_namespace n ON c.relnamespace = n.oid
       JOIN pg_subscription s ON sr.srsubid = s.oid
       WHERE s.subname = migration_seed_sub
       ORDER BY n.nspname, c.relname;

1. サブスクリプションを正しいスロットに戻し、適切なLSNでレプリケーションを再開します。

.. code:: sql

       ALTER SUBSCRIPTION migration_seed_sub
           SET (slot_name = migration_node_${SEED_NODE_NAME});
       ALTER SUBSCRIPTION migration_seed_sub ENABLE;

この段階で、シードノードは新しいPostgresバージョンを実行し、ソースプライマリから論理更新を受信しています。
PGDの初期化に進む前に、システムが安定するまで待ち、シードノードが完全に追いついたことを確認します。

次のステップ :ref:`Initializing PGD <Initializing PGD>`  。
