適用於 PostgreSQL 的 Azure 資料庫 特有的擴充功能考慮 - 彈性伺服器
本文說明在 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例中使用特定擴充功能時必須注意的一些特殊考慮。
必要條件
閱讀文章如何使用 PostgreSQL 擴充功能進行 適用於 PostgreSQL 的 Azure 資料庫,以瞭解如何:
- 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中的 Allowlist 擴充功能
- 載入部署二進位連結庫的延伸模組連結庫,這些連結庫需要配置和存取共用記憶體,而且必須在伺服器啟動時載入。
- 在某些資料庫中安裝擴充功能,讓封裝在該延伸模組中的SQL物件部署在該資料庫中,而且可以在其內容中存取。
- 從某些資料庫卸除擴充功能,讓封裝在該延伸模組中的SQL物件從該資料庫移除。
- 更新已安裝延伸模組所部署的 SQL 成品。
- 檢視已安裝哪些延伸模組及其對應的版本。
- 瞭解在 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中管理擴充功能時,您可能會收到哪些可能的錯誤,以及其中每個擴充功能的原因為何。
擴充
下列清單列舉在 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器服務中使用時,需要特定考慮的所有支援擴充功能:
dblink
pg_buffercache
pg_cron
pg_failover_slots
pg_hint_plan
pg_prewarm
pg_repack
pg_stat_statements
postgres_fdw
pgstattuple
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 成品。
範例
若要刪除週六上午 3:30 (GMT) 的舊數據。
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
若要在預設資料庫中
postgres
每天上午 10:00(GMT)執行真空。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 超級用戶權力,而且 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器不支援。 上述範例顯示以省略或設定為 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_failover_slots
當使用邏輯復寫和已啟用高可用性的伺服器運作時,擴充pg_failover_slots
功能可增強 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器。 它可有效解決容錯移轉之後不會保留邏輯複寫位置的標準 PostgreSQL 引擎問題。 維護這些位置對於防止在主要伺服器角色變更期間複寫暫停或資料不符非常重要,確保作業持續性和資料完整性。
延伸模組可藉由管理複寫位置的必要傳輸、清除和同步處理,簡化容錯移轉程序,藉此在伺服器角色變更期間提供順暢的轉換。
您可以在其 GitHub 頁面上找到使用pg_failover_slots
擴充功能的詳細資訊和指示。
若要使用pg_failover_slots
擴充功能,請確定伺服器啟動時已載入其連結庫。
pg_hint_plan
延伸 pg_hint_plan
模組可讓您在 SQL 批注中使用所謂的「提示」來調整 PostgreSQL 執行計劃,例如:
/*+ SeqScan(a) */
此 pg_hint_plan
延伸模組會在以目標 SQL 語句指定之特殊表單的批註中讀取提示片語。 特定表單以字元序列 「/*+」 開頭,並以 「*/」 結尾。 提示片語包含提示名稱和下列以括弧括住的參數,並以空格分隔。 基於可讀性而換行可以分隔每個提示詞語。
範例:
/*+
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 具有用戶端應用程式的程序代碼,其知道如何與延伸模組中實作的程式設計項目互動。 此用戶端應用程式旨在簡化與伺服器端延伸模組所呈現之不同介面互動的複雜性。 它為使用者提供了一些更容易瞭解的命令行選項。 用戶端應用程式沒有在所指向的資料庫上建立的擴充功能,就無用處。 伺服器端擴充功能本身會完全正常運作,但會要求使用者瞭解複雜的互動模式。 該模式會包含執行查詢,以擷取做為延伸模組所實作函式輸入的數據等等。
結構描述重新封裝的權限遭拒
目前,因為我們將許可權授與此延伸模組所建立的重新封裝架構,所以我們只支援從的內容azure_pg_admin
執行pg_repack
功能。
您可能會注意到,如果資料表的擁有者不是 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擴充功能會在每個 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例上預先載入shared_preload_libraries
,以提供追蹤 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的許可權遭拒
在適用於彈性伺服器的 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 hypertable,或遷移 PostgreSQL 中現有的時間序列資料。
使用 pg_dump 和 pg_restore 還原 Timescale 資料庫
若要使用 pg_dump
和 pg_restore
還原時幅資料庫,您必須在目的地資料庫中執行兩個協助程式程式: timescaledb_pre_restore()
和 timescaledb_post restore()
。
首先,準備目的地資料庫:
--create the new database where you want to perform the restore
CREATE DATABASE tutorial;
\c tutorial --connect to the database
CREATE EXTENSION timescaledb;
SELECT timescaledb_pre_restore();
現在,您可以在原始資料庫上執行 pg_dump
,然後執行 pg_restore
。 還原之後,請務必在還原的資料庫中執行下列命令:
SELECT timescaledb_post_restore();
如需還原方法與已啟用時幅資料庫的詳細資訊,請參閱 時幅檔。
使用 timescaledb-backup 還原 Timescale 資料庫
執行 SELECT timescaledb_post_restore()
程式時,您可能會在更新 timescaledb.restoring 旗標時收到拒絕的許可權。 這是因為在 Cloud PaaS 資料庫服務中,ALTER DATABASE 權限受限。 在此情況下,您可以使用 工具來備份和還原時幅資料庫,執行替代方法 timescaledb-backup
。 Timescaledb-backup 是一個程式,可讓傾印和還原 TimescaleDB 資料庫更簡單、容易出錯且效能更高。
若要如此做,請執行下列步驟:
如這裡所述安裝工具。
建立目標 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例和資料庫。
啟用時幅擴充功能。
將
azure_pg_admin
角色授與 ts-restore 所使用的使用者。執行 ts-restore 以還原 資料庫。
如需這些公用程式的詳細資訊,請參閱此處。
擴充功能和主要版本升級
適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器提供就地主要版本升級功能,其會執行 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例的就地升級,只需與使用者進行簡單的互動。 就地主要版本升級可簡化適用於 PostgreSQL 的 Azure 資料庫彈性伺服器升級程序,將存取伺服器的使用者和應用程式中斷降至最低。 就地主要版本升級不支援特定的擴充功能,而且升級某些擴充功能有一些限制。
anon
使用就地主要版本更新功能時,所有 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器版本都不支援延伸模組 、dblink
Apache AGE
、orafce
、、pgaudit
postgres_fdw
、 和 timescaledb
。