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以降を実行します。
説明この拡張機能は、PostgreSQL 17を実行するApsaraDB RDSインスタンスではサポートされていません。
RDSインスタンスは、20230830以降のマイナーエンジンバージョンを実行します。
重要この拡張機能は、20230830以前の一部のマイナーエンジンバージョンでサポートされています。 ただし、ApsaraDB RDSは、標準化された拡張機能管理とセキュリティ強化のために、マイナーエンジンバージョンの更新で脆弱な拡張機能を最適化する予定です。 したがって、20230830より前のマイナーエンジンバージョンを実行する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回に設定することを推奨します。
エクステンションの作成と削除
このセクションに含まれるステートメントを実行するには、特権アカウントを使用することを推奨します。
エクステンションを作成します。
CREATE EXTENSION pg_profile;
拡張を削除します。
DROP EXTENSION pg_profile;
例
この例では、serverとprofileという名前のデータベースが作成されます。
データ収集中に、プロファイルデータベースはサーバデータベースに要求を送信する。 サーバ・データベースが要求を受信すると、サーバ・データベースはそれ自体の情報を収集し、収集結果をプロファイル・データベースに返す。 プロファイルデータベースは、返された結果をテーブルに格納します。 これにより、プロファイルデータベースから他のデータベースに関する情報を取得できます。
プロファイルデータベースとサーバーデータベースは、異なるRDSインスタンスまたは同じRDSインスタンスに作成できます。
サーバデータベース
serverという名前のデータベースを作成します。
CREATE DATABASE server;
サーバーデータベースに接続し、拡張機能を作成します。
\c server CREATE EXTENSION pg_stat_statements; CREATE EXTENSION pg_stat_kcache;
説明pg_stat_kcache拡張は、pg_stat_statements拡張に依存します。 これらの拡張機能は、データベースの起動時にロードする必要があります。
pg_stat_statements
とpg_stat_kcache
がshared_preload_librariesパラメーターの値に追加されていることを確認します。 詳細については、「pg_stat_kcache拡張機能の使用」および「pg_stat_ステートメント」をご参照ください。 shared_preload_librariesパラメーターを変更する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの管理」をご参照ください。を実行します。Run the
\dx
コマンドを実行して、作成の詳細を照会します。Name | Version | Schema | Description --------------------+---------+------------+------------------------------------------------------------------------ pg_stat_kcache | 2.2.1 | public | Kernel statistics gathering pg_stat_statements | 1.9 | public | track planning and execution statistics of all SQL statements executed ...
プロフィールデータベース
profileという名前のデータベースを作成します。
CREATE DATABASE profile;
プロファイルデータベースに接続し、拡張機能を作成します。
\c profile CREATE EXTENSION plpgsql; CREATE EXTENSION dblink; CREATE EXTENSION pg_profile;
を実行します。Run the
\dx
コマンドを実行して、作成の詳細を照会します。Name | Version | Schema | Description ------------+---------+------------+-------------------------------------------------------------- dblink | 1.2 | public | connect to other PostgreSQL databases from within a database pg_profile | 4.0 | public | PostgreSQL load profile repository and report builder plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language ...
サーバーデータベースへの接続を確立します。
SELECT create_server('server', 'host=<Endpoint of the RDS instance in which the server database resides> dbname=server port=<Port number> user=<Username of the privileged account for the server database> password=<Password of the privileged account for the server database>');
パラメーター
例
説明
サーバー
サーバー
接続 の名前です。 カスタム名を使用できます。
host
127.0.0.1
サーバーデータベースが作成されるRDSインスタンスのエンドポイント。
プロファイルデータベースとサーバーデータベースが同じRDSインスタンスに作成されている場合は、このパラメーターを
127.0.0.1
に設定します。プロファイルデータベースとサーバーデータベースが同じ仮想プライベートクラウド (VPC) 内の異なるRDSインスタンスに作成されている場合、このパラメーターをサーバーデータベースが作成されているRDSインスタンスの内部エンドポイントに設定します。
プロファイルデータベースとサーバーデータベースが異なるVPCの異なるRDSインスタンスに作成されている場合は、次の項目に注意してください。
プロファイルデータベースが作成されるRDSインスタンスのNATゲートウェイを設定し、パブリックIPアドレスをNATゲートウェイに関連付けます。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスを使用したインターネット経由の外部データベースへのアクセス」をご参照ください。
サーバーデータベースが作成されている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 password=****",t,) (2 rows)
説明サーバーデータベースへの接続が確立されると、サンプル出力で
local
という名前の接続など、プロファイルデータベースへの接続が自動的に確立されます。プロファイルデータベースへの接続に関する情報を変更し、パスワードを指定します。
SELECT set_server_connstr('local','host=127.0.0.1 dbname=profile port=3002 user=<Username of the privileged account for the profile database> password=<Password of the privileged account for the profile database>');
パラメーター
例
説明
サーバー
local
接続 の名前です。 名前を変更する必要はありません。
host
127.0.0.1
このパラメーターを127.0.0.1に設定します。
dbname
profile
データベースの名前。
port
3002
SHOW PORT;
ステートメントを実行して、このパラメーターの値を取得できます。user
test_user
プロファイルデータベースが作成されたRDSインスタンスの特権アカウントのユーザー名。
password
T123456!
プロファイルデータベースが作成されるRDSインスタンスの特権アカウントのパスワード。
統計を収集します。
SELECT take_sample();
サンプル出力:
take_sample ------------------------- (server,OK,00:00:00.52) (local,OK,00:00:00.51) (2 rows)
サーバーデータベースでストレステストを実行し、統計を再度収集します。
CLIで次のコマンドを実行して、サーバーデータベースでストレステストを実行します。
説明CLIで次のコマンドを実行する必要があります。 PostgreSQLクライアントとpgbenchがインストールされていることを確認します。 pgbenchは、PostgreSQLでベンチマークテストを実行するシンプルなプログラムです。 詳細は、「PostgreSQL 公式ドキュメント」をご参照ください。
pgbench -s 100 -i server -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インスタンスへの接続に使用されるポート。
プロファイルデータベースが作成されているRDSインスタンスに接続し、統計を再度収集します。
SELECT take_sample();
収集されたデータの詳細を表示します。
SELECT * FROM show_samples('server');
サンプル収集結果:
sample | 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 | | |
収集結果のレポートを生成します。
次のいずれかの方法を使用して、収集結果をコンピューターにエクスポートできます。
プロファイルデータベースの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 <Endpoint of the RDS instance on which the profile database is created> -p 5432 -U <Username of the privileged account for the RDS instance on which the profile database is created>