邏輯解碼

適用於:適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器

重要

適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器位於淘汰路徑上。 強烈建議您升級至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器。 如需移轉至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器的詳細資訊,請參閱單一伺服器 適用於 PostgreSQL 的 Azure 資料庫 發生什麼事?

PostgreSQL 中的邏輯譯碼可讓您將數據變更串流至外部取用者。 邏輯譯碼通常用於事件串流和異動數據擷取案例。

邏輯解碼會使用輸出外掛程式將 Postgres 的預寫記錄檔 (WAL) 轉換為可讀取的格式。 適用於 PostgreSQL 的 Azure 資料庫 提供 wal2jsontest_decoding 和 pgoutput 的輸出外掛程式。 PostgreSQL 從 PostgreSQL 第 10 版和更新版本提供 pgoutput。

如需Postgres邏輯譯碼運作方式的概觀, 請瀏覽我們的部落格

注意

適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器不支援使用 PostgreSQL 發行集/訂閱的邏輯復寫。

設定您的伺服器

邏輯譯碼和 讀取複 本都相依於 Postgres 預先寫入記錄檔 (WAL) 以取得資訊。 這兩個功能需要來自Postgres的不同記錄層級。 邏輯譯碼需要比讀取複本更高的記錄層級。

若要設定正確的記錄層級,請使用 Azure 複寫支持參數。 Azure 複寫支援有三種設定選項:

  • 關閉 - 將最不重要的資訊放在 WAL 中。 大部分 適用於 PostgreSQL 的 Azure 資料庫 伺服器上都無法使用此設定。
  • 復本 - 比 關閉更詳細。 這是讀取複本運作所需的最低記錄層級。 此設定是大部分伺服器上的預設值。
  • 邏輯 - 比 復本更詳細。 這是邏輯譯碼運作的最低記錄層級。 讀取複本也適用於此設定。

使用 Azure CLI

  1. 將 azure.replication_support 設定為 logical

    az postgres server configuration set --resource-group mygroup --server-name myserver --name azure.replication_support --value logical
    
  2. 重新啟動伺服器以套用變更。

    az postgres server restart --resource-group mygroup --name myserver
    
  3. 如果您執行 Postgres 9.5 或 9.6,並使用公用網路存取,請新增防火牆規則以包含用戶端的公用 IP 位址,以便從中執行邏輯復寫。 防火牆規則名稱必須包含 _replrule。 例如, test_replrule。 若要在伺服器上建立新的防火牆規則,請執行 az postgres server firewall-rule create 命令。

使用 Azure 入口網站

  1. 將 Azure 複寫支援設定為 邏輯。 選取 [儲存]。

    適用於 PostgreSQL 的 Azure 資料庫 - 複寫 - Azure 複寫支援

  2. 選取 [ ],重新啟動伺服器以套用變更。

    適用於 PostgreSQL 的 Azure 資料庫 - 複寫 - 確認重新啟動

  3. 如果您執行 Postgres 9.5 或 9.6,並使用公用網路存取,請新增防火牆規則以包含用戶端的公用 IP 位址,以便從中執行邏輯復寫。 防火牆規則名稱必須包含 _replrule。 例如, test_replrule。 然後選取儲存

    適用於 PostgreSQL 的 Azure 資料庫 - 複寫 - 新增防火牆規則

啟動邏輯譯碼

邏輯譯碼可透過串流通訊協定或 SQL 介面取用。 這兩種方法都會使用 複寫位置。 位置代表來自單一資料庫的變更數據流。

使用複寫位置需要 Postgres 的複寫許可權。 目前,複寫許可權僅適用於伺服器的系統管理員使用者。

串流通訊協定

最好使用串流通訊協議來取用變更。 您可以建立自己的取用者/連接器,或使用Debezium之類的工具。

如需使用串流通訊協定搭配pg_recvlogical的範例,請流覽 wal2json 檔

SQL 介面

在下列範例中,我們會使用 SQL 介面搭配 wal2json 外掛程式。

  1. 建立位置。

    SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
    
  2. 發出 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';
    
  3. 取用變更。

    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"]
                            }
                   }
          ]
    }
    
  4. 一旦您完成使用它,請卸除位置。

    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變更回 replicaoff。 所 logical 保留的 WAL 詳細數據較為詳細,而且在邏輯譯碼未使用時應該停用。

下一步