In-place Postgres major version upgrades
========================================

コマンドラインユーティリティ
bdr_pg_upgradeを使用して、PGDノードをPostgresの新しいメジャーバージョンにアップグレードできます。

bdr_pg_upgradeは、標準の `pg_upgrade <https://www.postgresql.org/docs/current/pgupgrade.html>`_ のラッパーです

PGD固有のロジックをプロセスに追加して、スムーズなアップグレードを保証します。

用語
----

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

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

*古いPostgresクラスター*
—アップグレードする既存のPostgresクラスター、データを移行するクラスター。

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

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

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

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

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

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

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

-  両方のクラスターに同じPGDバージョンをインストールする必要があります。

-  PGDバージョンは4.1.0以上である必要があります。バージョン3.7.22以降もサポートされています。

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

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

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

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

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

使用法
------

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

bdr_pg_upgradeコマンドライン
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

概要
^^^^

.. code:: shell

   bdr_pg_upgrade [OPTION] ...

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

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

**必須パラメーター**

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

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

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

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

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

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

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

これらのパラメーターはオプショナルであり、bdr_pg_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``
   —アップグレード中にポストマスターソケットに使用するディレクトリ。

例
^^

次のようなシナリオがあるとします。

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

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

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

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

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

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

::

   bdr_pg_upgrade \
   - -old-bindir /usr/lib/postgresql/13/bin \
   - -new-bindir /usr/lib/postgresql/14/bin \
   - -old-datadir /var/lib/postgresql/13/main \
   - -new-datadir /var/lib/postgresql/14/main \
   - -database bdrdb

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

これらの手順は、 bdr_pg_upgradeの実行時に実行されます。

..  Note::
   `--check` がbdr_pg_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`
