decoder_raw是一個邏輯複製的輸出外掛程式(output plugin),能夠根據對錶的修改產生可以被遠端資料庫消費的原始修改SQL:UPDATE和DELETE語句通過能夠確保元組選擇性的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 IDENTITY為FULL。如果需要修改,請使用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。