pg_profile是PolarDB PostgreSQL版支援的一款第三方外掛程式,能夠統計目標資料庫中資源密集型活動,來分析和最佳化資料庫。此擴充基於PostgreSQL的統計視圖和部分社區外掛程式,完全由PL/pgSQL編寫,無需任何外部庫或軟體。配合pg_cron外掛程式可以實現資源密集活動的定期採集和監控。
適用範圍
支援的PolarDB 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及以上)
注意事項
採集資料需要使用到
pg_stat_statements和pg_stat_kcache外掛程式,請確保它們已被添加到被採樣資料庫的shared_preload_libraries參數中(預設載入)。說明修改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',
'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 5432參數說明如下:
參數 | 樣本值 | 說明 |
-s | 100 | 100表示在pgbench_accounts表中建立10,000,000行資料。 |
-i | server | 待進行測試的資料庫。 |
-U | test_user | server資料庫所在叢集的高許可權帳號。 |
-h | pc-****.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 | 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資料庫所在叢集的高許可權帳號>