Upgrading PostgreSQL to EDB Postgres Extended Server while enabling TDE#

TDEを有効にして新しいEDB Postgres Extended Serverクラスターを作成し、 pg_upgradeを使用して既存のPostgreSQLクラスターから新しい暗号化されたクラスターにデータを転送します。

  • アップグレードの準備 既存のインスタンスのバックアップを実行する。

  • 暗号化されたサーバーの作成 .

    • 新しいサーバーの空のディレクトリを作成し、postgresユーザーがそれを所有していることを確認します。

    • 暗号化のためにwrap およびunwrap コマンドをエクスポートするように環境変数を設定します。

    • 暗号化を有効にしてサーバーを初期化します。

    • デフォルトポートを変更して、新しいサーバーが別のポートで利用できるようにします。

    • データベースサーバーを起動します。

    • データベースサーバーに接続し、機能していることを確認します。

  • 暗号化されたサーバーへのアップグレード .

    • ソースと新しいサーバーの両方を停止します。

    • pg_upgradeを--copy-by-block オプションとともに使用して、ソースサーバーから新しいサーバーにデータをコピーします。ソース、ターゲットのbin、およびデータディレクトリを指定します。

    • 新しい暗号化されたデータベースサーバーを開始します。

    • 暗号化されたデータベースサーバーに接続し、データが転送されたことを確認します。

  • アップグレード後のクリーンアップ .

    • データベースとその統計をクリーンアップします。

    • pg_upgradeが提供するスクリプトを使用して、ソースPostgreSQLクラスターを削除します。

実際の例#

この例では、Ubuntu 22.04マシンで透過的データの暗号化を有効にしながら、PostgreSQL 16インスタンスをEDB Postgres Extended Server 16にアップグレードします。 binおよびconfigディレクトリの場所は、オペレーティングシステムとPostgresバージョンによって異なります。

アップグレードの準備#

  • EDB repository からEDB Postgres Extended Serverをインストールします。インストールするバージョンのメジャーバージョンがソースサーバーと同じであることを確認します。 pg_upgradeは、マイナーバージョンとパッチバージョン間のアップグレードをサポートしていますが、異なるメジャーバージョン間のアップグレードはサポートしていません。

  • pg_dumpall 、 pgBackRest 、または Barman を使用して、暗号化されていないソースサーバーのバックアップを作成します。

暗号化されたサーバーの作成#

  1. 新しいサーバーの空のディレクトリを作成します。この例では、ディレクトリ名はTDE です。

mkdir /var/lib/edb-pge/16/TDE
  1. postgresユーザーがディレクトリを所有していることを確認します。

sudo chown postgres /var/lib/edb-pge/16/TDE
sudo chgrp /var/lib/edb-pge/16/TDE
  1. wrap およびunwrap コマンドをエクスポートするように環境変数を設定します。

export PGDATAKEYWRAPCMD=openssl enc -e -aes-128-cbc -pass pass:ok -out %p
export PGDATAKEYUNWRAPCMD=openssl enc -d -aes-128-cbc -pass pass:ok -in %p

注釈

または、暗号化されたサーバーを初期化するときに`--key-unwrap-command=<command>` および`--key-wrap-command=<command>` 引数を使用して、 wrap および`unwrap` コマンドを含めます。 考えられる構成の詳細については、 initdb TDE options を参照してください。

  1. 暗号化を使用して新しいサーバーを初期化します。

/usr/lib/edb-pge/16/bin/initdb --data-encryption -D /var/lib/edb-pge/16/TDE

このコマンドは、暗号化されたサーバーのすべての構成ファイルでconfigディレクトリを初期化します。

  1. 暗号化されたインスタンスの構成ファイルのデフォルトのポート番号を変更します。 #port という行のコメントを外し、ポート番号を変更します。例

port                    5590
  1. 暗号化されたサーバーを起動します。

/usr/lib/edb-pge/16/bin/pg_ctl -D /var/lib/edb-pge/16/TDE start
  1. サーバーに接続します。

/usr/lib/edb-pge/16/bin/psql -p 5590

注釈

2つの異なるPostgresバージョンを使用している場合、暗号化されたサーバーのpsqlユーティリティを使用します。それ以外の場合、システムは以前のインスタンスからpsqlを使用しようとします。

  1. 新しいサーバーが暗号化されるように保証には、 Verifying TDE is enabled 。

暗号化されたサーバーへのアップグレード#

  1. 両方のサーバーを停止します。

/usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/non-TDE stop
/usr/lib/edb-pge/16/bin/pg_ctl -D /var/lib/edb-pge/16/TDE stop
  1. 非互換性をテストするには、 checkモードでpg_upgrade コマンドを実行します。 -b および-B では、ソースおよびターゲットBINディレクトリを指定します。 -d および-D では、ソースおよびターゲットのconfigディレクトリを指定します。 --copy-by-block オプションを含めます。

/usr/lib/edb-pge/16/bin/pg_upgrade -b /usr/lib/postgresql/16/bin -B /usr/lib/edb-pge/16/bin -d /var/lib/postgresql/16/non-TDE -D /var/lib/edb-pge/16/TDE --copy-by-block --check

注釈

--check モードは、コマンドを実行せずに事前チェックを実行します。

  1. ソースサーバーからターゲットサーバーにデータをコピーするには、通常モードでpg_upgrade コマンドを実行します。

/usr/lib/edb-pge/16/bin/pg_upgrade -b /usr/lib/postgresql/16/bin -B /usr/lib/edb-pge/16/bin -d /var/lib/postgresql/16/non-TDE -D /var/lib/edb-pge/16/TDE --copy-by-block
  1. 暗号化されたサーバーを再起動します。

/usr/lib/edb-pge/16/bin/pg_ctl -D /var/lib/edb-pge/16/TDE start
  1. 暗号化されたデータベースサーバーに接続します。

/usr/lib/edb-pge/16/bin/psql -p 5590
  1. スポットチェックを実行して、暗号化されていないサーバーにあったデータベース、テーブル、スキーマ、およびリソースが新しいサーバーで利用できることを確認します。例、すべてのデータベースをリストします。

\l

データベースたとえば hr に接続し、既存のテーブルを検索します。

\c hr
SELECT * FROM dept;

アップグレード後のクリーンアップ#

pg_upgradeがデータを正常に暗号化したことを確認した後、クリーンアップを実行します。

  1. postgresユーザーとして、データベースとその統計をクリーンアップします。

/usr/lib/edb-pge/16/bin/vacuumdb --all --analyze-in-stages
  1. pg_upgradeによって生成されたスクリプトを使用して、暗号化されていないサーバーのすべてのデータファイルを削除します。

./delete_old_cluster.sh