次の方法で共有


Azure Database for PostgreSQL - フレキシブル サーバーに固有の拡張機能に関する考慮事項

この記事では、Azure Database for PostgreSQL フレキシブル サーバーのインスタンスで特定の拡張機能を使用するときに注意する必要がある特別な考慮事項について説明します。

前提条件

以下の方法については、Azure Database for PostgreSQL の PostgreSQL 拡張機能の使用方法に関する記事を参照してください。

  • Azure Database for PostgreSQL フレキシブル サーバーの許可リスト拡張機能
  • バイナリ ライブラリをデプロイする拡張機能のライブラリを読み込みます。それには共有メモリの割り当てとアクセスが必要で、サーバーの起動時に読み込む必要があります。
  • 拡張機能を一部のデータベースにインストールします。これにより、その拡張機能にパッケージ化された SQL オブジェクトがそのデータベースにデプロイされ、そのコンテキストでアクセスできるようになります。
  • 拡張機能を一部のデータベースからドロップします。これにより、その拡張機能にパッケージ化された SQL オブジェクトがそのデータベースから削除されます。
  • 既にインストールされている拡張機能によってデプロイされた SQL 成果物を更新します。
  • インストールされている拡張機能とそれに対応するバージョンを表示します。
  • Azure Database for PostgreSQL フレキシブル サーバーで拡張機能を管理するときに発生する可能性のあるエラーと、それぞれの原因として考えられるものについて説明します。

Extensions

以下の一覧は、Azure Database for PostgreSQL フレキシブル サーバー サービスで使用するときに特定の考慮事項が必要な、サポートされているすべての拡張機能を列挙したものです。

  • dblink
  • pg_buffercache
  • pg_cron
  • pg_failover_slots
  • pg_hint_plan
  • pg_prewarm
  • pg_repack
  • pg_stat_statements
  • postgres_fdw
  • pgstattuple

dblink 拡張機能を使用すると、1 つの Azure Database for PostgreSQL フレキシブル サーバー インスタンスから別のインスタンスに、または同じサーバー内の別のデータベースに接続することができます。 Azure Database for PostgreSQL フレキシブル サーバーは、任意の PostgreSQL サーバーとの受信接続と送信接続の両方をサポートします。 送信側サーバーでは、受信側サーバーへの送信接続を許可している必要があります。 同様に、受信側サーバーでは、送信側サーバーからの接続を許可している必要があります。

この拡張機能を使用する予定がある場合は、仮想ネットワーク統合でサーバーをデプロイすることをお勧めします。 既定では、仮想ネットワーク統合によって、仮想ネットワーク内のサーバー間の接続が可能になります。 仮想ネットワークのネットワーク セキュリティ グループを使用してアクセスをカスタマイズすることもできます。

pg_buffercache

pg_buffercache 拡張機能を使用して、shared_buffers の内容を調査できます。 この拡張機能を使用すると、特定の関係が (shared_buffers 内に) キャッシュされているかどうかを確認できます。 この拡張機能は、パフォーマンスの問題 (キャッシュ関連のパフォーマンスの問題) のトラブルシューティングに役立ちます。

この拡張機能は PostgreSQL のコア インストールと統合されており、簡単にインストールできます。

CREATE EXTENSION pg_buffercache;

pg_cron

pg_cron 拡張機能は、PostgreSQL のための cron ベースの簡単なジョブ スケジューラであり、拡張機能としてデータベース内で実行されます。 pg_cron 拡張機能では、PostgreSQL データベース内でスケジュールされたメンテナンス タスクを実行できます。 たとえば、テーブルの定期的なバキュームを実行したり、古いデータ ジョブを削除したりできます。

pg_cron 拡張機能では、複数のジョブを並行して実行できますが、一度に実行されるジョブのインスタンスは多くても 1 つです。 2 回目の実行が初回の完了前になった場合、2 回目の実行がキューに入り、初回実行の完了直後に開始されます。 このようにすることで、ジョブがスケジュールどおりに正確に実行され、それら自身と同時に実行されないことが保証されます。

shared_preload_libraries に設定される値に pg_cron が含まれていることを確認します。 この拡張機能は、CREATE EXTENSION の実行効果によるライブラリの読み込みをサポートしていません。 拡張機能が shared_preload_libraries に追加されなかった場合、または追加後にサーバーが再起動されなかった場合に CREATE EXTENSION を実行しようとすると、テキストが pg_cron can only be loaded via shared_preload_libraries でヒントが Add pg_cron to the shared_preload_libraries configuration variable in postgresql.conf のエラーが発生します。

pg_cron を使用するには、サーバーの起動時に読み込まれるようにライブラリが追加されていること許可リストに登録されていること、作成される SQL 成果物を使用してその機能と対話する任意のデータベースにインストールされていることを確認します。

  1. 土曜日の午前 3 時 30 分 (GMT) に古いデータを削除する場合。

    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
    
  2. 既定のデータベース postgres で毎日午前 10 時 (GMT) にバキュームを実行する場合。

    SELECT cron.schedule('0 10 * * *', 'VACUUM');
    
  3. pg_cron からの全タスクのスケジュールを解除する場合。

    SELECT cron.unschedule(jobid) FROM cron.job;
    
  4. pg_cron で現在スケジュールされているすべてのジョブを表示する場合。

    SELECT * FROM cron.job;
    
  5. azure_pg_admin ロール アカウントのデータベース test cron で、毎日午前 10 時 (GMT) にバキュームを実行する場合。

    SELECT cron.schedule_in_database('VACUUM',' 0 10 * * * ', 'VACUUM', 'testcron',null,TRUE);
    

その他の例

pg_cron バージョン 1.4 以降では、cron.schedule_in_database および cron.alter_job 関数を使用して、それぞれ特定のデータベースでジョブをスケジュールし、既存のスケジュールを更新できます。

cron_schedule_in_database 関数では、オプション パラメーターとしてユーザー名を使用できます。 ユーザー名を null 以外の値に設定するには PostgreSQL のスーパーユーザー権限が必要であり、これは Azure Database for PostgreSQL フレキシブル サーバーではサポートされていません。 上記の例で示したこの関数の実行では、オプションのユーザー名パラメーターを省略しているか null 値に設定しています。これによってジョブは、ジョブをスケジュールしているユーザーのコンテキストで実行され、このユーザーは azure_pg_admin ロールの特権を持っている必要があります。

  1. データベース DBName で土曜日の午前 3 時 30 分 (GMT) に古いデータを削除する場合。

    SELECT cron.schedule_in_database('JobName', '30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$,'DBName');
    
  2. 既存のスケジュールのデータベース名を更新または変更するには

    SELECT cron.alter_job(job_id:=MyJobID,database:='NewDBName');
    

pg_failover_slots

pg_failover_slots 拡張機能は、論理レプリケーションと高可用性が有効なサーバーの両方で運用している場合に、Azure Database for PostgreSQL フレキシブル サーバーを強化します。 これは、フェールオーバー後に、論理レプリケーション スロットを保持しない標準の PostgreSQL エンジン内の課題に効果的に対処します。 これらのスロットを維持することは、プライマリ サーバーの役割の変更中にレプリケーションの一時停止やデータの不一致を防止し、運用継続性とデータ整合性を確保するために重要です。

この拡張機能は、フェールオーバー プロセスを合理化するために必要な転送、クリーンアップ、およびレプリケーション スロットの同期を管理して、それによりサーバーの役割の変更時にシームレスな移行を提供します。

pg_failover_slots 拡張機能の使用方法の詳細と手順については、GitHub ページを参照してください。

pg_failover_slots 拡張機能を使用するには、サーバーの起動時にそのライブラリが読み込まれたことを確認します。

pg_hint_plan

pg_hint_plan 拡張機能により、SQL コメントでいわゆる "ヒント" を使って PostgreSQL 実行プランを微調整できるようになります。以下はその例です。

/*+ SeqScan(a) */

pg_hint_plan 拡張機能では、ターゲット SQL ステートメントで指定された特別な形式のコメント内のヒント フレーズを読み取ります。 特定の形式は文字シーケンス "/*+" で始まり、"*/" で終わります。 ヒント フレーズは、ヒント名と、それに続くかっこで囲まれスペースで区切られたパラメーターで構成されます。 それぞれのヒント フレーズは、改行で区切ると読みやすくなります。

例:

/*+
 HashJoin(a b)
 SeqScan(a)
 */
    SELECT *
    FROM pgbench_branches b
    JOIN pgbench_accounts an ON b.bid = a.bid
    ORDER BY a.aid;

先ほどの例では、プランナーは、テーブル aseqscan の結果を使用して、b としてテーブル hashjoin と組み合わせます。

pg_hint_plan 拡張機能を使用するには、拡張機能を許可リストに登録し、そのライブラリを読み込み、その機能を使用する予定のデータベースに拡張機能をインストールしてください。

pg_prewarm

pg_prewarm 拡張機能により、リレーショナル データがキャッシュに読み込まれます。 キャッシュをプレウォームすると、再起動後に最初に実行したときのクエリの応答時間が向上します。 PostgreSQL フレキシブル サーバーの自動プレウォーム機能は、現在、Azure Database では使用できません。

pg_repack

pg_repack 拡張機能を初めて使用するユーザーは、通常、次の疑問を持ちます: pg_repack は拡張機能なのか、それとも psqlpg_dump のようなクライアント側の実行可能ファイルなのか?

pg_repack は実際にはその両方です。 pg_repack/lib は拡張機能のコードを保持します。これには、拡張機能によって作成されるスキーマおよび SQL 成果物と、それらの複数の関数のコードを実装する C ライブラリが含まれます。

一方、pg_repack/bin にはクライアント アプリケーションのコードがあります。このコードは、拡張機能に実装されたプログラミング要素と対話する方法を認識します。 このクライアント アプリケーションは、サーバー側拡張機能によって表示されるさまざまなインターフェイスとの対話の複雑さを軽減することを目的としています。 ユーザーにわかりやすいコマンドライン オプションをいくつか提供します。 ポイントしているデータベースに拡張機能が作成されていないクライアント アプリケーションは、有用ではありません。 サーバー側拡張機能はそれ自体で完全に機能しますが、複雑な対話パターンをユーザーが理解する必要があります。 そのパターンは、拡張機能によって実装された関数への入力として使用されるデータを取得するためのクエリの実行などから構成されます。

スキーマ再パックのアクセス許可が拒否される

現在、この拡張機能によって作成された再パック スキーマへのアクセス許可が付与されているため、azure_pg_admin のコンテキストから pg_repack 機能を実行することのみがサポートされています。

azure_pg_admin でないテーブルの所有者が pg_repack を実行しようとすると、次のようなエラーが表示されることがあります。

NOTICE: Setting up workers.conns
ERROR: pg_repack failed with error: ERROR:  permission denied for schema repack
LINE 1: select repack.version(), repack.version_sql()

このエラーを回避するには、azure_pg_admin のコンテキストから pg_repack を実行します。

pg_stat_statements

pg_stat_statements 拡張機能を使用すると、データベースで実行されているすべてのクエリを表示できます。 これは、実稼働システムでのクエリ ワークロードのパフォーマンスを理解するのに役立ちます。

pg_stat_statements 拡張機能は、すべての Azure Database for PostgreSQL フレキシブル サーバー インスタンスの shared_preload_libraries にプリロードされます。これにより、SQL ステートメントの実行統計情報を追跡する手段が提供されます。

セキュリティ上の理由から、pg_stat_statements 拡張機能許可リストに載せCREATE EXTENSION コマンドを使用してインストールする必要があります。

拡張機能によって追跡されるステートメントを制御する設定 pg_stat_statements.track は、既定では top に設定されており、クライアントから直接発行されたすべてのステートメントが追跡されることを意味します。 その他の 2 つの追跡レベルはnoneallです。 この設定は、サーバー パラメーターとして構成できます。

各 SQL ステートメントをログに記録する場合、サーバーのパフォーマンスに関して pg_stat_statements 拡張機能が提供するクエリ実行情報の間にはトレードオフがあります。 pg_stat_statements 拡張機能を使用していない場合、pg_stat_statements.tracknone に設定することをお勧めします。 一部のサード パーティ監視サービスがクエリ パフォーマンスの分析情報を提供するために pg_stat_statements に依存する可能性があるため、そのようなケースに該当するかどうかを確認してください。

postgres_fdw

postgres_fdw 拡張機能を使用すると、1 つの Azure Database for PostgreSQL フレキシブル サーバー インスタンスから別のインスタンスに、または同じサーバー内の別のデータベースに接続することができます。 Azure Database for PostgreSQL フレキシブル サーバーは、任意の PostgreSQL サーバーとの受信接続と送信接続の両方をサポートします。 送信側サーバーでは、受信側サーバーへの送信接続を許可している必要があります。 同様に、受信側サーバーでは、送信側サーバーからの接続を許可している必要があります。

この拡張機能を使用する予定がある場合は、仮想ネットワーク統合でサーバーをデプロイすることをお勧めします。 既定では、仮想ネットワーク統合によって、仮想ネットワーク内のサーバー間の接続が可能になります。 仮想ネットワークのネットワーク セキュリティ グループを使用してアクセスをカスタマイズすることもできます。

pgstattuple

Postgres 11 から 13 のバージョンで pgstattuple 拡張機能を使用して pg_toast スキーマに保持されているオブジェクトからタプル統計を取得しようとすると、"スキーマ pg_toast に対するアクセス許可が拒否されました" というエラーが表示されます。

スキーマ pg_toast へのアクセス許可が拒否されました

Azure Database for Flexible Server で PostgreSQL バージョン 11 から 13 を使用しているお客様は、pg_toast スキーマ内のオブジェクトに対して pgstattuple 拡張機能を使用できません。

PostgreSQL 16 および 17 では、pg_read_all_data ロールが自動的に azure_pg_admin に付与され、pgstattuple が正常に機能できるようになります。 PostgreSQL 14 および 15 では、同じ結果を得るために pg_read_all_data ロールを azure_pg_admin に手動で付与できます。 しかし、PostgreSQL 11 から 13 には、pg_read_all_data ロールは存在しません。

お客様は、必要なアクセス許可を直接付与することはできません。 pgstattuple を実行して pg_toast スキーマの下のオブジェクトにアクセスできる必要がある場合は、「Azure サポート リクエストを作成する」に進んでください。

timescaleDB

timescaleDB 拡張機能は、PostgreSQL の拡張機能としてパッケージ化された時系列データベースです。 時間指向の分析関数と最適化を提供し、時系列ワークロードに合わせて PostgreSQL をスケーリングします。 Timescale, Inc. の登録商標である TimescaleDB の詳細についてはこちらから確認してください。Azure Database for PostgreSQL フレキシブル サーバーは、TimescaleDB Apache-2 エディションを提供しています。

TimescaleDB のインストール

timescaleDB を使用するには、拡張機能を許可リストに登録し、そのライブラリを読み込み、その機能を使用する予定のデータベースに拡張機能をインストールしてください。

次に、一から TimescaleDB ハイパーテーブルを作成するか、PostgreSQL 内の既存の時系列データを移行することができます。

pg_dump と pg_restore を使用して Timescale データベースを復元する

pg_dumppg_restore を使用して Timescale データベースを復元するには、復元先データベースで 2 つのヘルパー プロシージャ (timescaledb_pre_restore()timescaledb_post restore()) を実行する必要があります。

まず、復元先データベースを指定します。

--create the new database where you want to perform the restore
CREATE DATABASE tutorial;
\c tutorial --connect to the database
CREATE EXTENSION timescaledb;

SELECT timescaledb_pre_restore();

これで、元のデータベースで pg_dump を実行し、pg_restore を実行できます。 復元後、復元されたデータベースで、必ず次のコマンドを実行します:

SELECT timescaledb_post_restore();

Timescale が有効なデータベースでの復元方法の詳細については、Timescale のドキュメントを参照してください。

timescaledb-backup を使用して Timescale データベースを復元する

SELECT timescaledb_post_restore() プロシージャの実行中に、timescaledb.restoring フラグを更新するときにアクセス許可が拒否される場合があります。 これは、Cloud PaaS データベース サービスの ALTER DATABASE 権限が限られているためです。 この場合は、timescaledb-backup ツールを使用して、Timescale データベースをバックアップおよび復元する別の方法を実行できます。 Timescaledb-backup は、TimescaleDB データベースのダンプと復元をよりシンプルにし、エラーが発生しにくくし、パフォーマンスを向上させるプログラムです。

これを行うには、次のステップに従います。

  1. ツールをインストールします (詳細はこちら)。

  2. ターゲットの Azure Database for PostgreSQL フレキシブル サーバー インスタンスとデータベースを作成します。

  3. Timescale 拡張機能を有効にします。

  4. ts-restore で使用されるユーザーに azure_pg_admin ロールを付与します。

  5. ts-restore を実行してデータベースを復元します。

これらのユーティリティの詳細については、こちらを参照してください。

拡張機能とメジャー バージョン アップグレード

Azure Database for PostgreSQL フレキシブル サーバーには、インプレース メジャー バージョン アップグレード機能が用意されており、ユーザーの簡単な操作だけで、Azure Database for PostgreSQL フレキシブル サーバー インスタンスのインプレース アップグレードを実行できます。 インプレース メジャー バージョン アップグレードにより、Azure Database for PostgreSQL フレキシブル サーバーのアップグレード プロセスが簡素化され、サーバーにアクセスするユーザーとアプリケーションの中断が最小限に抑えられます。 インプレース メジャー バージョン アップグレードでは、特定の拡張機能がサポートされません。また、特定の拡張機能のアップグレードにはいくつかの制限があります。

インプレース メジャー バージョン更新機能を使用する場合、拡張機能 anonApache AGEdblinkorafcepgauditpostgres_fdw、および timescaledb は、すべての Azure Database for PostgreSQL フレキシブル サーバー バージョンでサポートされません。