pg_profile
是PolarDB PostgreSQL版支持的一款第三方插件,能够统计目标数据库中资源密集型活动,来分析和优化数据库。此扩展基于PostgreSQL的统计视图和部分社区插件,完全由PL/pgSQL编写,无需任何外部库或软件。配合pg_cron
插件可以实现资源密集活动的定期采集和监控。
前提条件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(内核小版本14.10.18.0及以上)。
您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:
select version();
注意事项
采集数据需要使用到
pg_stat_statements
和pg_stat_kcache
插件,请确保它们已被加到被采样数据库的shared_preload_libraries
参数中(默认加载)。被采样的数据库中必须创建
pg_stat_statements
插件,可选创建pg_stat_kcache
插件来收集更多信息。存储采样信息将会占用磁盘空间,该插件有自动清理机制,请注意数据保存。
一次采样较为耗时,无需频繁采样,推荐频率为每小时1~2次。
使用方法
由于使用dblink
的安全限制,profile数据库和server数据库仅可以创建在同一个PolarDB PostgreSQL版集群中。
以下将分别创建server数据库和profile数据库。
在采样时,profile数据库会向server数据库发出采样请求,server数据库收到请求后将自身的统计结果返回到profile数据库并存储在表中。这样就可以从profile数据库获取其他数据库的统计信息。
Server数据库
创建server数据库:
CREATE DATABASE server;
连接server数据库并创建统计信息插件:
\c server
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS pg_stat_kcache;
Profile数据库
创建profile数据库:
CREATE DATABASE profile;
连接profile数据库并创建插件:
\c profile
CREATE EXTENSION IF NOT EXISTS pg_profile CASCADE;
创建采样连接
SELECT create_server(
'server',
'dbname=server channel_name=localhost user=<server数据库的高权限账号> password=<账号对应的密码>'
);
参数说明如下:
参数 | 示例值 | 说明 |
server | server | 连接名,用户自定义。 |
dbname | server | 数据库名。 |
channel_name | localhost | 连接信息,当前仅支持localhost。 |
user | test_user | server数据库所在集群的高权限账号。 |
password | T123456! | 账号对应的密码。 |
示例结果如下:
show_servers
-------------------------------------------------------------------------------------
(server,"dbname=server channel_name=localhost user=test_user password=****",t,)
(1 row)
修改采样连接信息
SELECT set_server_connstr(
'server',
'host=127.0.0.1 dbname=server channel_name=localhost user=<profile数据库的高权限账号> password=<账号对应的密码>'
);
参数说明如下:
参数 | 示例值 | 说明 |
server | server | 连接名,无需修改。 |
dbname | server | 数据库名。 |
channel_name | localhost | 连接信息,固定为localhost。 |
user | test_user | server数据库所在集群的高权限账号。 |
password | T123456! | 账号对应的密码。 |
初次数据采集
SELECT take_sample();
示例结果如下:
take_sample
-------------------------
(server,OK,00:00:02.81)
(1 row)
压测被采样库后再次采集
通过pgbench对被采样的server数据库进行压测:
pgbench -s 100 -i server -U test_user -h pc-****.pg.rds.aliyuncs.com -p 1921
参数说明如下:
参数 | 示例值 | 说明 |
-s | 100 | 100表示在pgbench_accounts表中创建10,000,000行数据。 |
-i dbname | server | 待进行测试的数据库。 |
-U | test_user | server数据库所在集群的高权限账号。 |
-h | pc-****.pg.rds.aliyuncs.com | server数据库所在集群的连接地址。 |
-p | 1921 | 集群端口,可根据控制台值具体填写。 |
连接到profile数据库再次进行数据采集:
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 | | |
将采集结果生成报告
可以通过以下两种方式将采集结果导出到本地。
方式一:通过客户端工具
psql
的交互式命令行,执行如下SQL,得到输出文件。\o report_1_2.html SELECT get_report('server',1,2);
方式二:通过命令行使
psql
直接将结果输出到文件中。psql -Aqtc "SELECT get_report('server',1,2)" \ -o report_server_1_2.html -d profile \ -h <profile数据库所在集群的连接地址> \ -p <数据库集群所在端口> \ -U <profile数据库所在集群的高权限账号>