In-place Postgres or Postgres and PGD major version upgrades
============================================================

コマンドラインユーティリティ `pgd node upgrade <https://www.enterprisedb.com/docs/pgd/latest/reference/cli/command_ref/node/upgrade.mdx>`_ 
を使用して、PGDノードをPostgresの新しいメジャーバージョン、またはPostgresとPGDのメジャーバージョンにアップグレードできます。

..  Note::
   5.7.0より前のバージョンでは、インプレースメジャーバージョンのアップグレードに使用されるコマンドは`bdr_pg_upgrade` でした。ただし、このコマンドには、 `pgd node upgrade` のように、PostgresメジャーバージョンとPGDバージョンの両方を同時にアップグレードするオプションがありません。

``pgd node upgrade``
は、標準の `pg_upgrade <https://www.postgresql.org/docs/current/pgupgrade.html>`_ のラッパーで、PGD固有のロジックをプロセスに追加して、スムーズなアップグレードを保証します。

用語
----

この用語は、アップグレードプロセスと関連するコンポーネントを説明するときに使用されます。

*Postgres cluster* -
データベースファイル実行可能ファイルとデータの両方。実行時にシステム上のPostgresデータベースインスタンスを構成します。

*Old Postgres cluster* -
アップグレードする既存のPostgresクラスター、データの移行元。

*New Postgres cluster* -
データの移行先の新しいPostgresクラスター。このPostgresクラスターは、古いクラスターの1つ前のメジャーバージョンである必要があります。

注意事項
--------

両方のPostgresクラスターが
`pg_upgrade <https://www.postgresql.org/docs/current/pgupgrade.html#id-1.9.5.12.7.>`_ のすべての要件を満たしている必要があるという事実を含む、標準のPostgresメジャーバージョンのアップグレードの注意事項が適用されます。

さらに、他のツールがレプリケーションスロットとレプリケーション起点を使用している場合、\ ``pgd node upgrade``
を使用しないでください。アップグレード後には、PGDスロットとオリジンのみが復元されます。

``pgd node upgrade`` のいくつかの前提条件を満たす必要があります。

- 古いPostgresクラスターを使用してアプリケーションを切断します。たとえば、PGDクラスター内の別のノードにリダイレクトできます。

- 両方のPostgresクラスターのピア認証を構成します。 ``bdr_pg_upgrade``
  はピア認証が必要です。

- 新しいバージョンのPGDと同じまたは新しいバージョンを新しいクラスターにインストールする必要があります。

- PGDバージョンは4.1.0以降である必要があります。

- 新しいクラスターはシャットダウン状態である必要があります。

- 新しいクラスターにPGDパッケージをインストールする必要があります。

- 新しいクラスターは、古いクラスター構成と一致するように、必要に応じて既に初期化および構成されている必要があります。

- データベース、テーブル、およびその他のオブジェクトは、新しいクラスターに存在してはなりません。

..  Note::
   PGD 5.7.0+にアップグレードする場合、両方のクラスターで同じPGDバージョンを実行する必要はありません。新しいクラスターは5.7.0以降で実行されている必要があります。その場合、`pgd node upgrade` はPGDバージョンを5.7.xにアップグレードし、Postgresメジャーバージョンをアップグレードします。

``pgd node upgrade``
を実行する前に、古いPostgresクラスターを起動することをお勧めします。
CLIは、古いPostgresクラスターがシャットダウンしている場合、それを起動します。

使用法
------

PostgresまたはPostgresとPGDの新しいメジャーバージョンにアップグレードするには、最初に新しいバージョンパッケージをインストールする必要があります。

``pgd node upgrade`` コマンドライン
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``pgd node upgrade``
は、すべてのパラメーターをpg_upgradeに渡します。したがって、
`pg_upgrade <https://www.postgresql.org/docs/current/pgupgrade.html#id-1.9.5.12.6>`_ でサポートされているパラメーターを指定できます。

概要
^^^^

.. code:: plaintext

   pgd node <NODE_NAME> upgrade [OPTION] ...

オプション
^^^^^^^^^^

pg_upgradeのオプションに加えて、次のパラメーターを\ ``pgd node upgrade``
に渡すことができます。

必須パラメーター
''''''''''''''''

これらのパラメーターは、コマンドラインで指定するか、 ``--database``
パラメーターを除くすべての場合、同等の環境変数で指定します。これらは\ ``pgd node upgrade``
によって使用されます。

- ``-b, --old-bindir`` - 古いPostgresクラスターのbinディレクトリ。

- ``-B, --new-bindir`` - 新しいPostgresクラスターのbinディレクトリ。

- ``-d, --old-datadir`` - 古いPostgresクラスターデータディレクトリ。

- ``-D, --new-datadir`` - 新しいPostgresクラスターデータディレクトリ。

- ``--database`` - PGDデータベース名。

オプショナルパラメーター
''''''''''''''''''''''''

これらのパラメーターはオプショナルであり、\ ``pgd node upgrade``
によって使用されます。

- ``-p, --old-port`` - 古いクラスターポート番号。

- ``-s, --socketdir`` -
  アップグレード中にポストマスターソケットに使用するディレクトリ。

- ``--check`` -
  チェックのみを実行し、クラスターを変更しないように指定します。

その他のパラメーター
''''''''''''''''''''

上記のいずれでもない他のパラメーターはpg_upgradeに渡されます。
pg_upgradeは次のパラメーターを受け入れます。

- ``-j, --jobs`` - 同時に使用するプロセスまたはスレッドの数。

- ``-k, --link`` -
  新しいクラスターにファイルをコピーする代わりに、ハードリンクを使用します。

- ``-o, --old-options`` -
  古いpostgresコマンドに渡すオプション。複数の呼び出しが追加されます。

- ``-O, --new-options`` -
  新しいpostgresコマンドに渡すオプション。複数の呼び出しが追加されます。

- ``-N, --no-sync`` -
  アップグレードされたクラスター内のすべてのファイルがディスクに書き込まれるのを待たないでください。

- ``-P, --new-port`` - 新しいクラスターポート番号。

- ``-r, --retain`` -
  正常に完了した後でもSQLファイルとログファイルを保持します。

- ``-U, --username`` - クラスターのインストールユーザー名。

- ``--clone`` - 効率的なファイルのクローン作成を使用します。

環境変数
^^^^^^^^

コマンドラインパラメーターの代わりにこれらの環境変数を使用できます。

- ``PGBINOLD`` - 古いPostgresクラスターのbinディレクトリ。

- ``PGBINNEW`` - 新しいPostgresクラスターのbinディレクトリ。

- ``PGDATAOLD`` - 古いPostgresクラスターデータディレクトリ。

- ``PGDATANEW`` - 新しいPostgresクラスターデータディレクトリ。

- ``PGPORTOLD`` - 古いPostgresクラスターポート番号。

- ``PGSOCKETDIR`` -
  アップグレード中にポストマスターソケットに使用するディレクトリ。

例
^^

次のようなシナリオが考えられます。

- アップグレードするクラスターのノード名はkaolinです。

- 古いPostgresクラスターのbinディレクトリは\ ``/usr/lib/postgresql/16/bin``
  です。

- 新しいPostgresクラスターのbinディレクトリは\ ``/usr/lib/postgresql/17/bin``
  です。

- 古いPostgresクラスターデータディレクトリは\ ``/var/lib/postgresql/16/main``
  です。

- 新しいPostgresクラスターデータディレクトリは\ ``/var/lib/postgresql/17/main``
  です。

- データベース名は\ ``bdrdb`` です。

次のコマンドを使用して、クラスターをアップグレードできます。

::

   pgd node kaolin upgrade \
   - -old-bindir /usr/lib/postgresql/16/bin \
   - -new-bindir /usr/lib/postgresql/17/bin \
   - -old-datadir /var/lib/postgresql/16/main \
   - -new-datadir /var/lib/postgresql/17/main \
   - -database bdrdb

実行された手順
^^^^^^^^^^^^^^

これらの手順は、\ ``pgd node upgrade`` の実行時に実行されます。

..  Note::
   `--check` が`pgd node upgrade` への引数として指定される場合、CLIはデータベースを変更する手順をスキップします。

PGD Postgresチェック
^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Steps,`--check` supplied
  :widths: 30,10
  :align: left
  :class: longtable

  Collecting pre-upgrade new cluster control data,`run`
  Checking new cluster state is shutdown,`run`
  Checking PGD versions,`run`
  Starting old cluster (if shutdown),`skip`
  Connecting to old cluster,`skip`
  Checking if bdr schema exists,`skip`
  Turning DDL replication off,`skip`
  Terminating connections to database,`skip`
  Waiting for all slots to be flushed,`skip`
  Disconnecting from old cluster,`skip`
  Stopping old cluster,`skip`
  Starting old cluster with PGD disabled,`skip`
  Connecting to old cluster,`skip`
  Collecting replication origins,`skip`
  Collecting replication slots,`skip`
  Disconnecting from old cluster,`skip`
  Stopping old cluster,`skip`

pg_upgrade手順
^^^^^^^^^^^^^^

標準のpg_upgrade手順が実行されます。

..  Note::
   指定された場合、 `--check` はpg_upgradeに渡されます。

PGDのアップグレード後の手順
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Steps,`--check` supplied
  :widths: 30,10
  :align: left
  :class: longtable

  Collecting old cluster control data,`skip`
  Collecting new cluster control data,`skip`
  Advancing LSN of new cluster,`skip`
  Starting new cluster with PGD disabled,`skip`
  Connecting to new cluster,`skip`
  "Creating replication origin, repeated for each origin",`skip`
  "Advancing replication origin, repeated for each origin",`skip`
  "Creating replication slot, repeated for each slot",`skip`
  Stopping new cluster,`skip`
