全部產品
Search
文件中心

PolarDB:decoder_raw(解碼為SQL)

更新時間:Oct 23, 2024

decoder_raw是一個邏輯複製的輸出外掛程式(output plugin),能夠根據對錶的修改產生可以被遠端資料庫消費的原始修改SQL:UPDATEDELETE語句通過能夠確保元組選擇性的REPLICA IDENTITY等級產生,INSERT語句通過WAL日誌中解析出的元組產生。

前提條件

支援的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 14(核心小版本14.10.16.0及以上)

  • PostgreSQL 11(核心小版本1.1.36及以上)

說明

您可通過如下語句查看PolarDB PostgreSQL版的核心小版本號碼:

  • PostgreSQL 14

    SELECT version();
  • PostgreSQL 11

    SHOW polar_version;

注意事項

PolarDB PostgreSQL版預設開啟GUC參數polar_create_table_with_full_replica_identity,該參數設定表級REPLICA IDENTITYFULL。如果需要修改,請使用ALTER TABLE語句修改表的REPLICA IDENTITY屬性。更多選項說明請參考外掛程式的README

使用方法

建立邏輯複製槽

使用decoder_raw作為輸出外掛程式建立複製槽。

SELECT pg_create_logical_replication_slot('custom_slot', 'decoder_raw');

建立表並執行增刪改

CREATE TABLE aa (a INT PRIMARY KEY, b TEXT NOT NULL);
INSERT INTO aa VALUES (1, 'aa'), (2, 'bb');

-- 更新非選擇性列
UPDATE aa SET b = 'cc' WHERE a = 1;

-- 指定更新特定列
UPDATE aa SET a = 3 WHERE a = 1;

-- 同時更新指定表中的兩列
UPDATE aa SET a = 4, b = 'dd' WHERE a = 2;

-- 刪除指定列
DELETE FROM aa WHERE a = 4;

查看對錶的修改

通過include_transaction參數可以控制輸出中是否包含事務資訊。

  • 不輸出事務資訊。

    SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');

    返回結果如下:

                           data
    ---------------------------------------------------
     INSERT INTO public.aa (a, b) VALUES (1, 'aa');
     INSERT INTO public.aa (a, b) VALUES (2, 'bb');
     UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1;
     UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1;
     UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2;
     DELETE FROM public.aa WHERE a = 4;
    (6 rows)
  • 輸出事務資訊。

    SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');

    返回結果如下:

                                  data
    ----------------------------------------------------------------
     BEGIN;
     COMMIT;
     BEGIN;
     INSERT INTO public.aa (a, b) VALUES (1, 'aa');
     INSERT INTO public.aa (a, b) VALUES (2, 'bb');
     COMMIT;
     BEGIN;
     UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1 AND b = 'aa';
     COMMIT;
     BEGIN;
     UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1 AND b = 'cc';
     COMMIT;
     BEGIN;
     UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2 AND b = 'bb';
     COMMIT;
     BEGIN;
     DELETE FROM public.aa WHERE a = 4 AND b = 'dd';
     COMMIT;
    (18 rows)

擷取對錶的修改

SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL);

返回結果如下:

                              data
----------------------------------------------------------------
 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1 AND b = 'aa';
 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1 AND b = 'cc';
 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2 AND b = 'bb';
 DELETE FROM public.aa WHERE a = 4 AND b = 'dd';
(6 rows)

相關參考

更多解碼格式的邏輯複製輸出外掛程式請參考Logical Decoding Plugins