すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:pg_profile拡張機能を使用する

最終更新日:May 08, 2024

ApsaraDB RDS for PostgreSQLでは、データベース内のリソース集約型アクティビティに関する統計情報を収集し、データベースを分析および最適化するためのpg_profile拡張機能が提供されています。

エクステンションの説明

pg_profile拡張機能は、pg_stat_statementsビューとPostgreSQLのpg_stat_kcache拡張機能に基づいて開発されています。 pg_profile拡張はPL/pgSQLで記述されており、外部ライブラリやソフトウェアは必要ありません。 pg_profileエクステンションをpg_cronエクステンションと一緒に使用して、リソースを大量に消費するアクティビティに関する統計を収集できます。 詳細については、「pg_stat_statements」、「pg_stat_kcache拡張機能の使用」、および「pg_cron拡張機能の使用」をご参照ください。

前提条件

RDSインスタンスは次の要件を満たしています。

  • RDSインスタンスはPostgreSQL 10以降を実行します。

  • RDSインスタンスは、20230830以降のマイナーエンジンバージョンを実行します。

    重要

    拡張機能は、20230830より前のマイナーエンジンバージョンでサポートされています。 ApsaraDB RDS for PostgreSQLの拡張機能管理を標準化し、拡張機能のセキュリティを強化するために、ApsaraDB RDSはマイナーエンジンバージョンのイテレーションで脆弱な拡張機能を最適化する予定です。 その結果、以前のマイナーエンジンバージョンを実行するRDSインスタンスに対して、一部の拡張機能を作成できなくなりました。 詳細については、「 [製品の変更 /機能の変更] ApsaraDB RDS For PostgreSQLインスタンスの拡張機能作成の制限」をご参照ください。

    • 20230830より前のマイナーエンジンバージョンを実行するRDSインスタンスの拡張機能を作成した場合、その拡張機能は影響を受けません。

    • RDSインスタンスの拡張機能を初めて作成する場合、または拡張機能を再作成する場合は、RDSインスタンスのマイナーエンジンバージョンを最新バージョンに更新する必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。

  • 特権アカウントが作成されます。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスでのアカウントの作成」をご参照ください。

使用上の注意

  • pg_profile拡張機能を使用する前に、pg_stat_statements拡張機能を有効にする必要があります。 pg_stat_kcache拡張機能を有効にして、より多くの情報収集機能を使用することもできます。 詳細については、「pg_stat_ステートメント」および「pg_stat_kcache拡張機能の使用」をご参照ください。

  • 収集された情報の保存はディスク領域を占有します。 pg_profile拡張機能は、自動データクリーンアップメカニズムを提供します。 データが適切に保存されていることを確認してください。

  • pg_profile拡張機能が統計を収集するには長い時間が必要です。 収集頻度を1時間に1回または2回に設定することを推奨します。

エクステンションの作成と削除

説明

このセクションに含まれるステートメントを実行するには、特権アカウントを使用することを推奨します。

  • エクステンションを作成します。

    拡張の作成pg_profile;
  • 拡張を削除します。

    ドロップ延長pg_profile;

この例では、serverとprofileという名前のデータベースが作成されます。

データ収集中に、プロファイルデータベースはサーバデータベースに要求を送信する。 サーバ・データベースが要求を受信すると、サーバ・データベースはそれ自体の情報を収集し、収集結果をプロファイル・データベースに返す。 プロファイルデータベースは、返された結果をテーブルに格納します。 これにより、プロファイルデータベースから他のデータベースに関する情報を取得できます。

説明

プロファイルデータベースとサーバーデータベースは、異なるRDSインスタンスまたは同じRDSインスタンスに作成できます。

サーバデータベース

  1. serverという名前のデータベースを作成します。

    CREATE DATABASEサーバー;
  2. サーバーデータベースに接続し、拡張機能を作成します。

    \cサーバー
    拡張の作成pg_stat_statements;
    拡張の作成pg_stat_kcache; 
    説明

    pg_stat_kcache拡張は、pg_stat_statements拡張に依存します。 これらの拡張機能は、データベースの起動時にロードする必要があります。 pg_stat_statementspg_stat_kcacheshared_preload_librariesパラメーターの値に追加されていることを確認します。 詳細については、「pg_stat_kcache拡張機能の使用」および「pg_stat_ステートメント」をご参照ください。 shared_preload_librariesパラメーターを変更する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの管理」をご参照ください。

  3. \dxコマンドを実行して、作成の詳細を照会します。

    名 | バージョン | スキーマ | 説明
    -------------------- -------- --------------- ------------------------------------------------------------------------
     pg_stat_kcache | 2.2.1 | public | カーネル統計収集
     pg_stat_statements | 1.9 | public | 実行されたすべてのSQL文の計画と実行統計を追跡する
     ...

プロフィールデータベース

  1. profileという名前のデータベースを作成します。

    CREATE DATABASEプロファイル;
  2. プロファイルデータベースに接続し、拡張機能を作成します。

    \cプロフィール
    拡張plpgsqlを作成します。拡張dblinkを作成します。拡張の作成pg_profile; 
  3. \dxコマンドを実行して、作成の詳細を照会します。

    名 | バージョン | スキーマ | 説明
    ----------- ---------------------------- --------------------------------------------------------------
     dblink | 1.2 | public | データベース内から他のPostgreSQLデータベースに接続する
     pg_profile | 4.0 | public | PostgreSQLロードプロファイルリポジトリとレポートビルダー
     plpgsql    | 1.0     | pg_catalog | PL/pgSQL procedural language
     ...
  4. サーバーデータベースへの接続を確立します。

    SELECT create_server('server' 、'host=<サーバーデータベースが存在するRDSインスタンスのエンドポイント> dbname=server port=<Port number> user=<サーバーデータベースの特権アカウントのユーザー名> password=<サーバーデータベースの特権アカウントのパスワード> ');

    パラメーター

    説明

    サーバー

    サーバー

    接続 の名前です。 カスタム名を使用できます。

    host

    127.0.0.1

    サーバーデータベースが作成されるRDSインスタンスのエンドポイント。

    • プロファイルデータベースとサーバーデータベースが同じRDSインスタンスに作成されている場合は、このパラメーターを127.0.0.1に設定します。

    • プロファイルデータベースとサーバーデータベースが同じ仮想プライベートクラウド (VPC) 内の異なるRDSインスタンスに作成されている場合、このパラメーターをサーバーデータベースが作成されているRDSインスタンスの内部エンドポイントに設定します。

    • プロファイルデータベースとサーバーデータベースが異なるVPCの異なるRDSインスタンスに作成されている場合は、次の項目に注意してください。

    説明

    RDSインスタンスの内部エンドポイントとパブリックエンドポイントを取得する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのエンドポイントとポート番号の表示と変更」をご参照ください。

    dbname

    サーバー

    データベースの名前。

    port

    3002

    サーバーデータベースが作成されているRDSインスタンスのポート番号。

    • プロファイルデータベースとサーバーデータベースが同じRDSインスタンスに作成されている場合、SHOW PORT; ステートメントを実行してこのパラメーターの値を取得できます。

    • プロファイルデータベースとサーバーデータベースが同じVPC内の異なるRDSインスタンスに作成されている場合、このパラメーターをサーバーデータベースが作成されているRDSインスタンスの内部ポート番号に設定します。

    • プロファイルデータベースとサーバーデータベースが異なるVPCの異なるRDSインスタンスに作成されている場合、このパラメーターをサーバーデータベースが作成されているRDSインスタンスのパブリックポート番号に設定します。

    user

    test_user

    サーバーデータベースが作成されたRDSインスタンスの特権アカウントのユーザー名。

    password

    T123456!

    サーバーデータベースが作成されるRDSインスタンスの特権アカウントのパスワード。

    サンプル出力:

    show_servers
    ---------------------------------------------------------------------------------------
     (local,"dbname=profile port=3002",t,)
     (server,"host=127.0.0.1 dbname=server port=3002 user=test_user=パスワード=****",t,)
    (2行) 
    説明

    サーバーデータベースへの接続が確立されると、サンプル出力でlocalという名前の接続など、プロファイルデータベースへの接続が自動的に確立されます。

  5. プロファイルデータベースへの接続に関する情報を変更し、パスワードを指定します。

    SELECT set_server_connstr('local','host=127.0.0.1 dbname=profile port=3002 user=<プロファイルデータベースの特権アカウントのユーザー名> password=<プロファイルデータベースの特権アカウントのパスワード> ');

    パラメーター

    説明

    サーバー

    local

    接続 の名前です。 名前を変更する必要はありません。

    host

    127.0.0.1

    このパラメーターを127.0.0.1に設定します。

    dbname

    profile

    データベースの名前。

    port

    3002

    SHOW PORT; ステートメントを実行して、このパラメーターの値を取得できます。

    user

    test_user

    プロファイルデータベースが作成されたRDSインスタンスの特権アカウントのユーザー名。

    password

    T123456!

    プロファイルデータベースが作成されるRDSインスタンスの特権アカウントのパスワード。

  6. 統計を収集します。

    SELECT take_sample();

    サンプル出力:

    take_sample
    -------------------------
     (サーバー、OK、00:00:00.52)
     (ローカル、OK、00:00:00.51)
    (2行) 
  7. サーバーデータベースでストレステストを実行し、統計を再度収集します。

    1. CLIで次のコマンドを実行して、サーバーデータベースでストレステストを実行します。

      説明

      CLIで次のコマンドを実行する必要があります。 PostgreSQLクライアントとpgbenchがインストールされていることを確認します。 pgbenchは、PostgreSQLでベンチマークテストを実行するシンプルなプログラムです。 詳細は、「PostgreSQL 公式ドキュメント」をご参照ください。

      pgbench -s 100 -iサーバー-U test_user -h pgm-**** .pg.rds.aliyuncs.com -p 5432

      パラメーター

      説明

      -s

      100

      作成するデータの行数。 たとえば、値100は、pgbench_accountsテーブルに10,000,000行のデータが作成されていることを示します。

      -i dbname

      サーバー

      ストレステストを実行するデータベースの名前。

      -U

      test_user

      サーバーデータベースが作成されたRDSインスタンスの特権アカウントのユーザー名。

      -h

      pgm-**** .pg.rds.aliyuncs.com

      サーバーデータベースが作成されるRDSインスタンスのエンドポイント。

      -p

      5432

      RDSインスタンスへの接続に使用されるポート。

    2. プロファイルデータベースが作成されているRDSインスタンスに接続し、統計を再度収集します。

      SELECT take_sample();
    3. 収集されたデータの詳細を表示します。

      SELECT * FROM show_samples('server');

      サンプル収集結果:

      サンプル | sample_time | sizes_collected | dbstats_reset | bgwrstats_reset | archstats_reset
      ------- ------------------------ ----------------- --------------- ----------------- -----------------
            1 | 2022-09-30 02:14:07 + 00 | t | | |
            2 | 2022-09-30 02:16:59 + 00 | t | | |
            3 | 2022-09-30 02:17:58 + 00 | t | | | 
  8. 収集結果のレポートを生成します。

    次のいずれかの方法を使用して、収集結果をコンピューターにエクスポートできます。

    • プロファイルデータベースのpsqlで次のコマンドを実行します。

      \o report_2_3.html
      SELECT get_report('server' 、2,3); 
    • コンピュータのCLIで次のコマンドを実行します。

      psql -Aqtc "SELECT profile.get_report('server',2,3)" -o report_server_2_3.html -d profile -h <プロファイルデータベースが作成されたRDSインスタンスのエンドポイント> -p 5432 -U <プロファイルデータベースが作成されたRDSインスタンスの特権アカウントのユーザー名>