邏輯解碼

適用於: 適用於 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 檢視中的 'active' 資料行指出是否有取用者連線到某個位置。

SELECT * FROM pg_replication_slots;

在 [使用的儲存體] 和 [複本之間的延隔時間上限] 計量上設定警示,當值增加超過一般閾值時通知您。

重要

您必須卸除未使用的複寫位置。 若無法這麼做,可能導致伺服器無法使用。

如何卸除位置

如果您未主動取用複寫位置,則應將其卸除。

使用 SQL 卸除名為 test_slot 的複寫位置:

SELECT pg_drop_replication_slot('test_slot');

重要

如果您停止使用邏輯解碼,請將 azure.replication_support 變更回 replicaofflogical 所保留的 WAL 詳細資料更詳細,且應該在邏輯解碼未使用時停用。

下一步