RDS PostgreSQL支持使用pg_profile插件來統計數據庫中資源密集型活動,用于分析優化數據庫。
您可以加入RDS PostgreSQL插件交流釘釘群(103525002795),進行咨詢、交流和反饋,獲取更多關于插件的信息。
插件簡介
此擴展基于PostgreSQL的統計視圖(pg_stat_statements)和社區插件(pg_stat_kcache), 完全使用PL/pgSQL編寫,無需任何外部庫或軟件,配合pg_cron插件即可實現資源密集活動的統計。
前提條件
RDS PostgreSQL實例需滿足以下要求:
實例大版本為RDS PostgreSQL 10或以上版本。
說明暫不支持RDS PostgreSQL 17。
實例內核小版本為20230830或以上。
重要20230830內核小版本之前已支持此插件,但為了規范插件管理,提升RDS PostgreSQL在插件側的安全防護,RDS計劃在內核版本迭代中陸續對部分存在安全風險的插件進行優化,部分插件在低內核小版本無法創建,更多信息,請參見【產品/功能變更】RDS PostgreSQL限制創建插件說明。
如果您的實例內核小版本低于20230830,且已經使用了此插件,則不影響使用。
如果您首次創建或重新創建此插件,請升級內核小版本到最新。
已創建高權限賬號。
注意事項
該插件必須先啟用pg_stat_statements插件,同時可以啟用pg_stat_kcache插件來提供更多信息收集功能。
存儲采樣信息將會占用磁盤空間,該插件有自動清理機制,請注意數據保存。
一次采樣較為耗時,無需頻繁采樣,推薦頻率為每小時1~2次。
創建和刪除插件
推薦使用高權限賬號可以執行如下命令。
創建插件
CREATE EXTENSION pg_profile;
刪除插件
DROP EXTENSION pg_profile;
使用示例
本示例需要分別創建server數據庫和profile數據庫。
在采樣時,profile數據庫會向server數據庫發出一個請求,server數據庫收到請求后采樣自己的信息,再將采樣結果返回給profile,profile將收到的結果存儲在表中。這樣就可以從profile數據獲取其他數據庫的統計信息。
profile數據庫和server數據庫可以創建在不同RDS PostgreSQL實例中,也可創建在同一實例中。
server數據庫
創建server數據庫。
CREATE DATABASE server;
連接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參數中。修改shared_preload_libraries參數方法請參見設置實例參數。執行
\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數據庫
創建profile數據庫。
CREATE DATABASE profile;
連接profile數據庫并創建插件。
\c profile CREATE EXTENSION plpgsql; CREATE EXTENSION dblink; CREATE EXTENSION pg_profile;
執行
\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 ...
創建server連接。
SELECT create_server('server', 'host=<server數據庫所在實例的連接地址> dbname=server port=<端口號> user=<server數據庫的高權限賬號> password=<賬號對應的密碼>');
參數
示例值
參數說明
server
server
連接名,自定義。
host
127.0.0.1
server數據庫所在實例的連接地址。
如果profile數據庫與server數據庫在同一實例中,則此參數固定配置為
127.0.0.1
。如果profile數據庫與server數據庫在相同VPC下的不同實例中,則此參數配置為server數據庫所在實例的內網地址。
如果profile數據庫與server數據庫在不同VPC下的不同實例中:
profile數據庫所在實例需要配置NAT網關并綁定公網IP。
server數據庫所在實例需要開通外網地址,此參數配置為server數據庫所在實例的外網地址。
說明如何獲取實例的內外網地址,請參見查看或修改連接地址和端口。
dbname
server
數據庫名。
port
3002
server數據庫所在實例的端口。
如果profile數據庫與server數據庫在同一實例,此參數通過SQL命令
SHOW PORT;
查詢獲取。如果profile數據庫與server數據庫在相同VPC下的不同實例中,則此參數配置為server數據庫所在實例的內網端口。
如果profile數據庫與server數據庫在不同VPC下的不同實例中,則此參數配置server數據庫所在實例的公網端口。
user
test_user
server數據庫所在實例的高權限賬號。
password
T123456!
賬號對應的密碼。
結果示例:
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)
說明創建server連接后,會自動創建一個profile數據庫的連接,即上述結果示例中的名為
local
的連接。修改profile數據庫連接信息,配置密碼。
SELECT set_server_connstr('local','host=127.0.0.1 dbname=profile port=3002 user=<profile數據庫的高權限賬號> password=<賬號對應的密碼>');
參數
示例值
參數說明
server
local
連接名,無需修改。
host
127.0.0.1
固定為127.0.0.1。
dbname
profile
數據庫名。
port
3002
此參數通過SQL命令
SHOW PORT;
查詢獲取。user
test_user
profile數據庫所在實例的高權限賬號。
password
T123456!
賬號對應的密碼。
初次進行數據采集。
SELECT take_sample();
結果示例:
take_sample ------------------------- (server,OK,00:00:00.52) (local,OK,00:00:00.51) (2 rows)
對server數據庫進行壓測后,再次進行采集。
在命令行窗口執行如下命令,對server數據庫進行壓測。
說明如下命令需要在命令行窗口執行,請確保已安裝PostgreSQL客戶端,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
server
待進行測試的數據庫。
-U
test_user
server數據庫所在實例的高權限賬號。
-h
pgm-****.pg.rds.aliyuncs.com
server數據庫所在實例的連接地址。
-p
5432
實例端口。
連接profile數據庫所在實例,再次進行數據采集。
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在profile數據庫中執行如下命令:
\o report_2_3.html SELECT get_report('server',2,3);
在本地命令行中執行如下命令:
psql -Aqtc "SELECT profile.get_report('server',2,3)" -o report_server_2_3.html -d profile -h <profile數據庫所在實例的連接地址> -p 5432 -U <profile數據庫所在實例的高權限賬號>