pg_profile は、PolarDB for PostgreSQL および でサポートされているサードパーティ製の拡張機能です。ターゲットデータベース内でリソースを大量に消費するアクティビティに関する統計情報を収集し、データベースの分析と最適化を支援します。この拡張機能は、PostgreSQL の統計ビューといくつかのコミュニティ拡張機能に基づいています。完全に PL/pgSQL で記述されており、外部ライブラリやソフトウェアは必要ありません。pg_cron 拡張機能と併用することで、定期的にデータを収集し、リソースを大量に消費するアクティビティを監視できます。
適用範囲
以下のバージョンの PolarDB for PostgreSQL がサポートされています。
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.9.9.0 以降)
PostgreSQL 15 (マイナーエンジンバージョン 2.0.15.14.6.0 以降)
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.10.18.0 以降)
マイナーエンジンバージョンは、コンソールで表示するか、SHOW polardb_version; 文を実行して確認できます。ご利用のクラスターがマイナーエンジンバージョンの要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
注意事項
データ収集には
pg_stat_statementsおよびpg_stat_kcache拡張機能が必要です。これらがサンプリング対象データベースのshared_preload_librariesパラメーターに追加されていることを確認してください。これらはデフォルトでロードされます。説明shared_preload_libraries パラメーターの変更方法の詳細については、クラスターパラメーターの設定をご参照ください。このパラメーターを変更するとクラスターが再起動します。続行する前に、ビジネス運用を慎重に計画してください。
サンプリング対象データベースでは、
pg_stat_statements拡張機能を作成する必要があります。より多くの情報を収集するために、pg_stat_kcache拡張機能を作成することもできます。サンプル情報を格納するとディスク領域を消費します。この拡張機能には自動クリーンアップメカニズムがありますが、データ保持期間はユーザー自身で管理する必要があります。
1 回のサンプリング操作には時間がかかります。そのため、サンプリングを頻繁に実行しないでください。推奨される頻度は 1 時間に 1〜2 回です。
使用方法
dblink のセキュリティ制限により、プロファイルデータベースとサーバーデータベースは、同じ PolarDB for PostgreSQL または クラスター内に作成する必要があります。
次の手順では、サーバーデータベースとプロファイルデータベースの作成方法について説明します。
サンプリング中、プロファイルデータベースはサーバーデータベースにサンプリングリクエストを送信します。サーバーデータベースはリクエストを受信した後、その統計情報をプロファイルデータベースに返します。統計情報はテーブルに格納されます。これにより、プロファイルデータベースから他のデータベースの統計情報を取得できます。
サーバーデータベース
サーバーデータベースを作成します:
CREATE DATABASE server;サーバーデータベースに接続し、統計拡張機能を作成します:
\c server
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS pg_stat_kcache;プロファイルデータベース
プロファイルデータベースを作成します:
CREATE DATABASE profile;プロファイルデータベースに接続し、拡張機能を作成します:
\c profile
CREATE EXTENSION IF NOT EXISTS pg_profile CASCADE;サンプリング接続の作成
SELECT create_server(
'server',
'dbname=server channel_name=localhost user=<privileged_account_of_the_server_database> password=<password_for_the_account>'
);次の表にパラメーターを示します。
パラメーター | 例 | 説明 |
server | server | 接続名。ユーザー定義です。 |
dbname | server | データベース名。 |
channel_name | localhost | 接続情報。`localhost` のみがサポートされています。 |
user | test_user | サーバーデータベースが存在するクラスターの特権アカウント。 |
password | T123456! | アカウントのパスワード。 |
次の例に出力を示します:
show_servers
-------------------------------------------------------------------------------------
(server,"dbname=server channel_name=localhost user=test_user password=****",t,)
(1 row)サンプリング接続情報の変更
SELECT set_server_connstr(
'server',
'dbname=server channel_name=localhost user=<privileged_account_of_the_profile_database> password=<password_for_the_account>'
);次の表にパラメーターを示します。
パラメーター | 例 | 説明 |
server | server | 接続名。変更しないでください。 |
dbname | server | データベース名。 |
channel_name | localhost | 接続情報。`localhost` に固定されています。 |
user | test_user | サーバーデータベースが存在するクラスターの特権アカウント。 |
password | T123456! | アカウントのパスワード。 |
初期データ収集の実行
SELECT take_sample();次の例に出力を示します:
take_sample
-------------------------
(server,OK,00:00:02.81)
(1 row)サンプリング対象データベースのストレステスト後の再データ収集
pgbench ツールを使用して、サンプリング対象のサーバーデータベースでストレステストを実行します:
pgbench -s 100 -i server -U test_user -h pc-****.pg.rds.aliyuncs.com -p 5432次の表にパラメーターを示します。
パラメーター | 例 | 説明 |
-s | 100 | `100` は、`pgbench_accounts` テーブルに 10,000,000 行が作成されることを示します。 |
-i | server | テスト対象のデータベース。 |
-U | test_user | サーバーデータベースが存在するクラスターの特権アカウント。 |
-h | pc-****.pg.rds.aliyuncs.com | サーバーデータベースが存在するクラスターのエンドポイント。 |
-p | 5432 | クラスターのポート。コンソールに表示されるポート番号を指定します。 |
プロファイルデータベースに接続し、再度データを収集します:
SELECT take_sample();収集したデータを表示します:
SELECT * FROM show_samples('server');次の例に出力を示します:
sample | sample_time | sizes_collected | dbstats_reset | bgwrstats_reset | archstats_reset
--------+------------------------+-----------------+---------------+-----------------+-----------------
1 | 2024-02-23 07:29:53+00 | t | | |
2 | 2024-02-23 08:11:39+00 | t | | |収集結果からレポートを生成する
次の 2 つのいずれかの方法を使用して、収集したデータをローカルファイルにエクスポートできます。
方法 1:
psqlクライアントツールの対話型コマンドラインで次の SQL 文を実行して、出力ファイルを生成します。\o report_1_2.html SELECT get_report('server',1,2);方法 2: コマンドラインを使用して
psqlにデータを直接ファイルに書き込むように指示します。psql -Aqtc "SELECT get_report('server',1,2)" \ -o report_server_1_2.html -d profile \ -h <endpoint_of_the_profile_database_cluster> \ -p <port_of_the_database_cluster> \ -U <privileged_account_for_the_profile_database_cluster>