邏輯解碼
適用於:適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器
重要
適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器位於淘汰路徑上。 強烈建議您升級至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。 如需移轉至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器的詳細資訊,請參閱單一伺服器 適用於 PostgreSQL 的 Azure 資料庫 發生什麼事?。
PostgreSQL 中的邏輯譯碼可讓您將數據變更串流至外部取用者。 邏輯譯碼通常用於事件串流和異動數據擷取案例。
邏輯解碼會使用輸出外掛程式將 Postgres 的預寫記錄檔 (WAL) 轉換為可讀取的格式。 適用於 PostgreSQL 的 Azure 資料庫 提供 wal2json、test_decoding 和 pgoutput 的輸出外掛程式。 PostgreSQL 從 PostgreSQL 第 10 版和更新版本提供 pgoutput。
如需Postgres邏輯譯碼運作方式的概觀, 請瀏覽我們的部落格。
注意
適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器不支援使用 PostgreSQL 發行集/訂閱的邏輯復寫。
設定您的伺服器
邏輯譯碼和 讀取複 本都相依於 Postgres 預先寫入記錄檔 (WAL) 以取得資訊。 這兩個功能需要來自Postgres的不同記錄層級。 邏輯譯碼需要比讀取複本更高的記錄層級。
若要設定正確的記錄層級,請使用 Azure 複寫支持參數。 Azure 複寫支援有三種設定選項:
- 關閉 - 將最不重要的資訊放在 WAL 中。 大部分 適用於 PostgreSQL 的 Azure 資料庫 伺服器上都無法使用此設定。
- 復本 - 比 關閉更詳細。 這是讀取複本運作所需的最低記錄層級。 此設定是大部分伺服器上的預設值。
- 邏輯 - 比 復本更詳細。 這是邏輯譯碼運作的最低記錄層級。 讀取複本也適用於此設定。
使用 Azure CLI
將 azure.replication_support 設定為
logical
。az postgres server configuration set --resource-group mygroup --server-name myserver --name azure.replication_support --value logical
重新啟動伺服器以套用變更。
az postgres server restart --resource-group mygroup --name myserver
如果您執行 Postgres 9.5 或 9.6,並使用公用網路存取,請新增防火牆規則以包含用戶端的公用 IP 位址,以便從中執行邏輯復寫。 防火牆規則名稱必須包含 _replrule。 例如, test_replrule。 若要在伺服器上建立新的防火牆規則,請執行 az postgres server firewall-rule create 命令。
使用 Azure 入口網站
將 Azure 複寫支援設定為 邏輯。 選取 [儲存]。
選取 [ 是],重新啟動伺服器以套用變更。
如果您執行 Postgres 9.5 或 9.6,並使用公用網路存取,請新增防火牆規則以包含用戶端的公用 IP 位址,以便從中執行邏輯復寫。 防火牆規則名稱必須包含 _replrule。 例如, test_replrule。 然後選取儲存。
啟動邏輯譯碼
邏輯譯碼可透過串流通訊協定或 SQL 介面取用。 這兩種方法都會使用 複寫位置。 位置代表來自單一資料庫的變更數據流。
使用複寫位置需要 Postgres 的複寫許可權。 目前,複寫許可權僅適用於伺服器的系統管理員使用者。
串流通訊協定
最好使用串流通訊協議來取用變更。 您可以建立自己的取用者/連接器,或使用Debezium之類的工具。
如需使用串流通訊協定搭配pg_recvlogical的範例,請流覽 wal2json 檔。
SQL 介面
在下列範例中,我們會使用 SQL 介面搭配 wal2json 外掛程式。
建立位置。
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
發出 SQL 命令。 例如:
CREATE TABLE a_table ( id varchar(40) NOT NULL, item varchar(40), PRIMARY KEY (id) ); INSERT INTO a_table (id, item) VALUES ('id1', 'item1'); DELETE FROM a_table WHERE id='id1';
取用變更。
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
輸出看起來會像這樣:
{ "change": [ ] } { "change": [ { "kind": "insert", "schema": "public", "table": "a_table", "columnnames": ["id", "item"], "columntypes": ["character varying(40)", "character varying(40)"], "columnvalues": ["id1", "item1"] } ] } { "change": [ { "kind": "delete", "schema": "public", "table": "a_table", "oldkeys": { "keynames": ["id"], "keytypes": ["character varying(40)"], "keyvalues": ["id1"] } } ] }
一旦您完成使用它,請卸除位置。
SELECT pg_drop_replication_slot('test_slot');
監視位置
您必須監視邏輯譯碼。 任何未使用的復寫位置都必須卸除。 位置會保留 Postgres WAL 記錄和相關系統目錄,直到取用者讀取變更為止。 如果您的取用者失敗或尚未正確設定,則未用的記錄會堆積並填滿您的記憶體。 此外,未耗用的記錄會增加交易標識符包裝的風險。 這兩種情況都可能導致伺服器無法使用。 因此,邏輯復寫位置必須持續取用。 如果不再使用邏輯復寫位置,請立即卸除它。
pg_replication_slots檢視中的 [使用中] 數據行會指出是否有取用者連線到位置。
SELECT * FROM pg_replication_slots;
設定 儲存體 使用的警示,以及復本計量之間的最大延隔時間,以在值超過一般閾值時通知您。
重要
您必須卸除未使用的複寫位置。 若無法這麼做,可能會導致伺服器無法使用。
如何卸除位置
如果您未主動取用複寫位置,您應該將其卸除。
若要使用 SQL 卸除名為 的 test_slot
復寫位置:
SELECT pg_drop_replication_slot('test_slot');
重要
如果您停止使用邏輯譯碼,請將azure.replication_support變更回 replica
或 off
。 所 logical
保留的 WAL 詳細數據較為詳細,而且在邏輯譯碼未使用時應該停用。