2019年10月3日、世界で最も先進的なオープンソースデータベースの新しいバージョンがリリースされました。 PostgreSQL 12が利用可能になり、他の重要な機能の中でも特に、クエリのパフォーマンス(特に、より大きなデータセットと全体的なスペース使用率)が大幅に改善されました。
このブログでは、これらの新機能を確認し、この新しいPostgreSQL12バージョンを入手してインストールする方法を紹介します。また、アップグレード時に考慮すべきいくつかの考慮事項についても説明します。
PostgreSQL12の機能と改善点
- Bツリーインデックスのスペース使用率と読み取り/書き込みパフォーマンスが最適化されています。
- GiST、GIN、およびSP-GiSTインデックスを作成するためのWALオーバーヘッドの削減。
- SP-GiSTインデックスを使用して、距離演算子(<->)でK最近傍クエリを実行できます。
- REINDEX CONCURRENTLYコマンドを使用してインデックスへの書き込みをブロックせずにインデックスを再構築し、ユーザーが長時間のインデックス再構築のダウンタイムシナリオを回避できるようにします。
- 特に、限られたサブセットからデータを取得するだけでよい数千のパーティションを持つテーブルの場合、パーティション化されたテーブルに対するクエリが改善されています。
- INSERTとCOPYを使用してパーティションテーブルにデータを追加するためのパフォーマンスの向上。
- クエリをブロックせずに、新しいパーティションをテーブルにアタッチできます。
SQL
- SQL / JSON標準で定義されたJSONパス式を使用してJSONドキュメントに対してクエリを実行できるようになり、JSONB形式で保存されたドキュメントの既存のインデックス作成メカニズムを利用してデータを効率的に取得できるようになりました。
- WITHクエリをPostgreSQL12で自動的にインライン化できるようになりました(再帰的でなく、副作用がなく、クエリの後の部分で1回だけ参照される場合)。これにより、パフォーマンスが向上します。多くの既存のクエリの。
- 「生成された列」を導入します。このタイプの列は、同じテーブル内の他の列の内容からその値を計算します。この計算値をこれに保存することもサポートされています。
- PostgreSQL 12は、ユーザーが「非決定論的照合」を定義できるようにすることで、ICU照合のサポートを拡張します。これにより、たとえば、大文字と小文字を区別しない、またはアクセントを区別しない比較が可能になります。
- GSSAPIインターフェイスを介した認証のためにクライアント側とサーバー側の両方の暗号化を導入します。
- PostgreSQLサービスは、OpenLDAPでコンパイルされている場合、LDAPサーバーを検出できます。
- clientcert=verify-fullオプションとpg_hba.confファイルで構成された追加の認証方法を使用した多要素認証。
これらの新機能と改善点を利用したい場合は、ダウンロードページにアクセスして、最新のPostgreSQLバージョンを入手できます。 HAのセットアップが必要な場合は、次のブログでPostgreSQLforHAをインストールして構成する方法を紹介します。
PostgreSQL12のインストール方法
この例では、オペレーティングシステムとしてCentOS7を使用します。そのため、RedHatベースのOSダウンロードサイトにアクセスして、対応するバージョンをインストールする必要があります。
$ yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
安定した、テスト用の、ソースパッケージを含むPostgreSQLリポジトリをインストールします。
$ head /etc/yum.repos.d/pgdg-redhat-all.repo
# PGDG Red Hat Enterprise Linux / CentOS stable repositories:
[pgdg12]
name=PostgreSQL 12 for RHEL/CentOS $releasever - $basearch
baseurl=https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
...
次に、クライアントとサーバーのPostgreSQL12パッケージをインストールします。いくつかのPython依存関係がインストールされます。
$ yum install postgresql12 postgresql12-server
これで、新しいPostgreSQL12データベースを初期化できます。
$ /usr/pgsql-12/bin/postgresql-12-setup initdb
Initializing database ... OK
$ systemctl enable postgresql-12
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-12.service to /usr/lib/systemd/system/postgresql-12.service.
$ systemctl start postgresql-12
$ psql
psql (12.0)
Type "help" for help.
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 12.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)
これで、PostgreSQLの最後のバージョンがインストールされたので、データをこの新しいデータベースノードに移行できます。
PostgreSQL12へのアップグレード
現在のPostgreSQLバージョンをこの新しいバージョンにアップグレードする場合は、このタスクを実行する3つの主要なオプションがあります。
- pg_dump :これは、データをダンプして新しいPostgreSQLバージョンに復元できる論理バックアップツールです。ここでは、データサイズに応じて異なるダウンタイム期間が発生します。システムを停止するか、マスターノードで新しいデータを回避し、pg_dumpを実行し、生成されたダンプを新しいデータベースノードに移動して復元する必要があります。この間、データの不整合を回避するためにマスターPostgreSQLデータベースに書き込むことはできません。
- Pg_upgrade :PostgreSQLのバージョンをインプレースでアップグレードするためのPostgreSQLツールです。実稼働環境では危険である可能性があるため、その場合はこの方法をお勧めしません。この方法を使用すると、ダウンタイムも発生しますが、おそらく以前のpg_dump方法を使用した場合よりも大幅に少なくなります。
- 論理レプリケーション :PostgreSQL 10以降、このレプリケーション方法を使用できるようになりました。これにより、ダウンタイムがゼロ(またはほぼゼロ)でメジャーバージョンのアップグレードを実行できます。このようにして、最新のPostgreSQLバージョンでスタンバイノードを追加できます。レプリケーションが最新の場合は、フェイルオーバープロセスを実行して、新しいPostgreSQLノードを昇格させることができます。
PostgreSQL12にアップグレードする前の考慮事項
一般に、すべてのアップグレードプロセス、およびすべてのテクノロジーにおいて、考慮すべき点がいくつかあります。主なものをいくつか見てみましょう。
- データ型abstime、reltime、およびtintervalが削除されました。
- Recovery.conf設定はpostgresql.confファイルにあり、使用されなくなりました。このファイルを作成した場合、サーバーは起動しません。ファイルrecovery.signalおよびstandby.signalファイルは、非プライマリモードに切り替えるために使用されるようになりました。 trigger_file設定はpromote_trigger_fileに名前が変更され、standby_mode設定は削除されました。
- 複数の競合するrecovery_target仕様は許可されていません。
- pg_restoreでは、ダンプの内容を標準出力に送信するための「-f」の指定が必要です。
- 重複エントリの処理を改善するために、Bツリーインデックスではインデックスエントリの最大長が8バイト短縮されています。以前のバージョンからpg_upgradeされたインデックスに対するREINDEX操作が失敗する可能性があります。
- DROP IF EXISTS FUNCTION / PROCEDURE / AGGREGATE / ROUTINEは、引数リストが指定されておらず、一致するオブジェクトが複数ある場合にエラーを生成します。
PostgreSQL 12の新機能と移行前の考慮事項の詳細については、公式リリースノートのWebページを参照してください。