本文說明在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體中使用特定延伸模組或模組時,您必須注意的一些特殊考慮。
延伸模組的一般考量
若要在 Azure Database for PostgreSQL 的彈性伺服器執行個體中使用延伸模組,您必須:
-
允許延伸。 如果不允許延伸模組,則任何執行
CREATE EXTENSION、ALTER EXTENSION、DROP EXTENSION或COMMENT ON EXTENSION的嘗試都會失敗並出現錯誤,指出不允許參考的延伸模組。 - 如果延伸模組部署一些需要配置和存取共用記憶體的共用二進位程式庫,且需要在伺服器啟動時載入,您也應該遵循 載入程式庫中提供的指示。
- 在您希望部署該延伸模組附帶的 SQL 物件的資料庫中建立擴展。
- 刪除擴充套件。 當您想要從資料庫中移除時,您要在其中對該延伸模組所散發的所有 SQL 物件執行此命令。
- 更新延伸模組,以將已安裝延伸模組所部署的所有 SQL 構件更新至其最新版本。
- 檢視已安裝的延伸模組及其對應的版本。
如果您在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體上執行 CREATE EXTENSION、 ALTER EXTENSION或 DROP EXTENSIONCOMMENT ON EXTENSION 命令時收到任何錯誤,請參閱 可能的錯誤清單,以及每個錯誤的原因。
模組的一般考量
若要在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體中使用模組,您只需根據 shared_preload_libraries 中的說明,將它新增至 伺服器參數。
模組不需要 加入允許清單。 這是延伸模組的獨家需求。
具有特定考量的延伸模組
以下清單列舉所有支援的延伸模組,其在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體中使用時需要某些特定考量:
AGEdblinkpg_buffercachepg_cronpg_hint_planpg_prewarmpg_repackpg_stat_statementspostgres_fdwpgstattuple
AGE
Apache AGE 延伸模組是適用於 PostgreSQL 的 Azure 資料庫所支援的 PostgreSQL 圖形延伸模組。 它提供圖形資料庫功能、開啟 cypher 查詢支援,以及在 PostgreSQL 中儲存的圖形數據上執行複雜查詢的能力。 「Apache AGE」 是一個根據 Apache License 2.0 發布的開源專案。
安裝 AGE
要使用 AGE,請確保您將此擴展包列入允許列表,載入其函式庫,並在您計畫使用其功能的資料庫中安裝該擴展。
dblink
dblink 延伸模組可讓您從一個適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體連線到另一個執行個體,或連線到相同伺服器中的另一個資料庫。 適用於 PostgreSQL 的 Azure 資料庫支援任何 PostgreSQL 伺服器的傳入和傳出連線。 傳送伺服器需要允許對接收伺服器的輸出連線。 同樣地,接收伺服器需要允許來自傳送伺服器的連線。
如果您打算使用此延伸模組,我們建議您使用虛擬網路整合來部署您的伺服器。 依預設,虛擬網路整合允許虛擬網路中伺服器之間的連線。 您也可以選擇使用虛擬網路網路安全性群組來自訂存取。
pg_buffercache
該 pg_buffercache 擴展可用於研究 shared_buffers的內容。 使用此 擴充功能,您可以判斷特定關係是否已快取 (在 shared_buffers中)。 此延伸模組可協助您針對效能問題進行疑難排解 (快取相關的效能問題)。
此延伸模組與 PostgreSQL 的核心安裝整合,因此安裝容易。
CREATE EXTENSION pg_buffercache;
pg_cron
pg_cron 延伸模組是適用於 PostgreSQL 而以 cron 為基礎的簡易工作排程器,可在資料庫內以延伸模組的形式執行。
pg_cron 延伸模組可在 PostgreSQL 資料庫內執行排程的維護工作。 例如,您可以執行資料表的定期清理,或移除舊的資料工作。
pg_cron 延伸模組可以平行執行多個工作,但一次最多執行一個工作的執行個體。 如果第二次執行應該在第一次執行完成之前開始,則第二次執行會排入佇列,並在第一次執行完成時立即開始。 如此,這可確保工作的執行次數與排程一樣多,且不會自行同時執行。
確定已設定 shared_preload_libraries 的值,包含 pg_cron。 此延伸模組不支援載入程式庫作為執行 CREATE EXTENSION 的效果。 如果延伸模組未新增至 shared_preload_libraries,或伺服器新增後未重新啟動,則任何執行 CREATE EXTENSION 的嘗試都會導致錯誤,其文字指出 pg_cron can only be loaded via shared_preload_libraries 且其提示為 Add pg_cron to the shared_preload_libraries configuration variable in postgresql.conf。
若要使用 pg_cron,務必在伺服器啟動時載入其共用程式庫,它已加入允許清單,而且已安裝在您想要與其功能互動的任何資料庫中,並使用它所建立的 SQL 成品。
Examples
在週六上午 3:30 (GMT) 刪除舊資料。
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);每天上午 10:00 (GMT) 在預設資料庫
postgres中執行清理。SELECT cron.schedule('0 10 * * *', 'VACUUM');若要從
pg_cron取消排程所有工作。SELECT cron.unschedule(jobid) FROM cron.job;若要查看目前使用
pg_cron排程的所有工作。SELECT * FROM cron.job;每天上午 10:00 (GMT) 在
test cron角色帳戶之下的azure_pg_admin資料庫中執行清理。SELECT cron.schedule_in_database('VACUUM',' 0 10 * * * ', 'VACUUM', 'testcron',null,TRUE);
其他範例
從 pg_cron 1.4 版開始,您可以使用 cron.schedule_in_database 和 cron.alter_job 函式來排程特定資料庫中的作業,並分別更新現有的排程。
cron_schedule_in_database 函式允許使用者名稱做為選用參數。 將使用者名稱設定為非 Null 值需要 PostgreSQL 超級使用者權限,而 Azure Database for PostgreSQL 彈性伺服器執行個體不支援此功能。 上述範例顯示執行此函式並將選用的使用者名稱參數省略或設定為 null,這會在使用者排程作業的內容中執行作業,其應該具有 azure_pg_admin 角色權限。
星期六上午 3:30 (GMT) 刪除資料庫 DBName 上的舊資料。
SELECT cron.schedule_in_database('JobName', '30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$,'DBName');更新或變更現有排程的資料庫名稱
SELECT cron.alter_job(job_id:=MyJobID,database:='NewDBName');
pg_hint_plan
pg_hint_plan 延伸模組可讓您在 SQL 註解中使用所謂的提示來調校 PostgreSQL 執行計畫,例如:
/*+ SeqScan(a) */
pg_hint_plan 延伸模組會在目標 SQL 陳述式指定的特殊格式註解中讀取提示詞語。 特定表單以字元序列 "/*+" 開頭,並以 "*/" 結尾。 提示詞語包含提示名稱,以及以括弧括住的下列參數,並以空格分隔。 基於可讀性而換行可以分隔每個提示詞語。
Example:
/*+
HashJoin(a b)
SeqScan(a)
*/
SELECT *
FROM pgbench_branches b
JOIN pgbench_accounts an ON b.bid = a.bid
ORDER BY a.aid;
上述範例會讓規劃工具對資料表 seqscan 使用 a 的結果,與資料表 b 合併為 hashjoin。
若要使用 pg_hint_plan 延伸模組,請確定您將延伸模組列 入允許清單 、 載入其程式庫,並在您計劃使用其功能的資料庫中 安裝延伸模組 。
pg_prewarm
pg_prewarm 延伸模組會將關聯式資料載入快取。 預先載入快取表示重新開機後,查詢在第一次執行時有較佳的回應時間。 PostgreSQL 的自動預熱功能目前無法在 Azure 資料庫中使用。
pg_repack
pg_repack 延伸模組的使用者第一次通常會詢問下列問題:pg_repack 是 psql 或 pg_dump 之類的延伸模組或用戶端可執行檔嗎?
pg_repack 實際上是兩者。 pg_repack/lib 具有擴充功能的程式碼,包括它建立的結構描述和 SQL 成品,以及實作其中數個函式程式碼的 C 程式庫。
另一方面, pg_repack/bin 具有用戶端應用程式的程式碼,該程式碼知道如何與擴充功能中實現的可編程性元素互動。 此用戶端應用程式旨在簡化與伺服器端延伸模組所呈現之不同介面互動的複雜性。 它為使用者提供一些更容易了解的命令列選項。 若未在所指向的資料庫上建立延伸模組,用戶端伺服器便無法使用。 伺服器端延伸模組本身會完全正常運作,但會要求使用者瞭解複雜的互動模式。 該模式會包含執行查詢,以擷取做為延伸模組所實作函式的輸入資料等等。
結構描述重新封裝的權限遭拒
目前,因為我們將權限授與此延伸模組所建立的重新封裝結構描述,所以我們只支援從 pg_repack 的內容執行 azure_pg_admin 功能。
您可能會注意到,如果資料表的擁有者 (不是 azure_pg_admin) 嘗試執行 pg_repack,他們最終會收到下列錯誤:
NOTICE: Setting up workers.conns
ERROR: pg_repack failed with error: ERROR: permission denied for schema repack
LINE 1: select repack.version(), repack.version_sql()
若要避免錯誤,請從 azure_pg_admin 的內容執行 pg_repack。
pg_stat_statements
pg_stat_statements 擴充功能可讓您檢視在資料庫上執行的所有查詢。 這項資訊有助於了解實際執行系統上的查詢工作負載效能。
pg_stat_statements 延伸模組會預先載入shared_preload_libraries每個適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體上,以提供追蹤 SQL 陳述式執行統計資料的方法。
基於安全性考量,您必須將 pg_stat_statements 延伸模組加入允許清單,並使用 CREATE EXTENSION 命令予以安裝。
設定 pg_stat_statements.track (可控制延伸模組哪些陳述式) 預設為 top,這表示會追蹤用戶端直接發出的所有陳述式。 其他兩個會追蹤層級 none 和 all。 這項設定可設定為伺服器參數。
擴充功能在記錄每個 SQL 語句時,在伺服器效能上提供的查詢執行資訊 pg_stat_statements 之間會有取捨。 如果您不會經常使用 pg_stat_statements 延伸模組,建議您將 pg_stat_statements.track 設定為 none。 某些第三方監視服務可能會需要 pg_stat_statements 傳遞查詢效能深入解析,因此請確認您的情況是否如此。
postgres_fdw
postgres_fdw 延伸模組可讓您從一個適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體連線到另一個執行個體,或連線到相同伺服器中的另一個資料庫。 適用於 PostgreSQL 的 Azure 資料庫支援任何 PostgreSQL 伺服器的傳入和傳出連線。 傳送伺服器需要允許對接收伺服器的輸出連線。 同樣地,接收伺服器需要允許來自傳送伺服器的連線。
如果您打算使用此延伸模組,我們建議您使用虛擬網路整合來部署您的伺服器。 依預設,虛擬網路整合允許虛擬網路中伺服器之間的連線。 您也可以選擇使用虛擬網路網路安全性群組來自訂存取。
pgstattuple
使用 pgstattuple 延伸模組嘗試從 Postgres 11 到 13 版本中保留在 pg_toast 結構描述的物件取得 Tuple 統計資料時,您會收到「結構描述 pg_toast 的權限遭拒」錯誤。
結構描述 pg_toast 的權限遭拒
在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體上使用 PostgreSQL 第 11 版到 13 版的客戶,無法對 pgstattuple 結構描述內的物件使用 pg_toast 延伸模組。
在 PostgreSQL 16 和 17 中,pg_read_all_data 角色會自動授與給 azure_pg_admin,允許 pgstattuple 正確運作。 在 PostgreSQL 14 和 15 中,客戶可手動將 pg_read_all_data 角色授與給 azure_pg_admin,以達到相同的結果。 不過,在 PostgreSQL 11 到 13 中,pg_read_all_data 角色不存在。
客戶無法直接授與所需的權限。 如果您需要能夠執行 pgstattuple 以存取 pg_toast 結構描述之下的物件,請繼續建立 Azure 支援要求。
timescaleDB
timescaleDB 延伸模組是封裝為 PostgreSQL 延伸模組的時間序列資料庫。 它會提供時間導向的分析函式,而且最佳化及調整 Postgres 來處理時間序列工作負載。
深入了解 TimescaleDB,這是 Timescale, Inc. 的註冊商標。適用於 PostgreSQL 的 Azure 資料庫提供 TimescaleDB Apache-2 版本。
安裝 TimescaleDB
若要使用 timescaleDB,請確定您將擴充功能列入允許清單、載入其程式庫,並在您計劃使用其功能的資料庫中安裝擴充功能。
您現在可以 從頭開始建立 TimescaleDB 超資料表,或在 PostgreSQL 中移轉現有的時間序列資料。
如需使用 pg_dump 和 pg_restore 還原 Timescale 資料庫的詳細資訊,請參閱 Timescale 文件。
使用 timescaledb-backup 還原 Timescale 資料庫
執行 SELECT timescaledb_post_restore() 程序時,可能在更新 timescaledb.restoring 旗標時發生權限遭拒。 您之所以收到此錯誤,是因為雲端 PaaS 資料庫服務中的 ALTER DATABASE 權限有限。 在此情況下,您可以採取另一種作法,使用 timescaledb-backup 工具來備份和還原 Timescale 資料庫。 Timescaledb-backup 這個程式可讓您在傾印和還原 TimescaleDB 資料庫時,更輕鬆、更不易出錯也更有效率。
若要這樣做,請依照下列步驟執行:
安裝工具,詳見 此處。
建立目標適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體和資料庫。
啟用 Timescale 延伸模組。
將
azure_pg_admin角色授與給 ts-restore 所使用的使用者。執行 ts-restore 來還原資料庫。
有關這些實用程序的更多詳細信息,請參 見此處。
延伸模組和主要版本升級
適用於 PostgreSQL 的 Azure 資料庫提供 就地主要版本升級功能 ,可執行適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體的就地升級,使用者只需進行簡單的互動即可。 就地主要版本升級可簡化適用於 PostgreSQL 的 Azure 資料庫升級程式,將存取伺服器的使用者和應用程式中斷降到最低。 就地主要版本升級不支援特定延伸模組,而且升級某些延伸模組有一些限制。
使用就地主要版本更新功能時,Azure Database for PostgreSQL 彈性伺服器執行個體的所有版本都不支援以下延伸模組:anon、Apache AGE、dblink、orafce、postgres_fdw 和 timescaledb。
具有特定考量的模組
以下清單列出了在 Azure Database for PostgreSQL 彈性伺服器實例中使用時需要特定考量的所有支援的模組:
pg_failover_slots
pg_failover_slots
使用邏輯複寫和已啟用高可用性的伺服器運作時,pg_failover_slots 模組可強化適用於 PostgreSQL 的 Azure 資料庫。 它可有效解決容錯移轉之後不會保留邏輯複寫位置的標準 PostgreSQL 引擎問題。 維護這些位置對於防止在主要伺服器角色變更期間複寫暫停或資料不符非常重要,確保作業持續性和資料完整性。
延伸模組可藉由管理複寫位置的必要傳輸、清除和同步處理,簡化容錯移轉程序,藉此在伺服器角色變更期間提供順暢的轉換。
您可以在其 pg_failover_slots上找到有關使用該模組的更多資訊和說明。
若要使用 pg_failover_slots 模組,請確定伺服器啟動時 已載入其函式庫 。