GBase 8c的邏輯複製槽功能是實現實時數據複製的核心組件,它通過解析事務日誌(xlog)生成邏輯變更流,為異構數據庫同步提供基礎支持。邏輯複製槽代表一個數據更改流,確保事務按原始順序在目標端重放。它主要作用是防止所需的事務日誌被系統回收,為邏輯解碼提供穩定的日誌源。
核心特性
事務級解碼:以事務為單位輸出邏輯日誌,僅在事務提交後解碼
異構數據庫支持:降低對目標數據庫形態限制,支持同構/異構數據庫同步
實時低延遲:支持目標庫同步期間可讀寫,同步時延較低
使用前提
設置GUC參數:
wal_level = logical
max_replication_slots > (物理流複製槽數 + 邏輯複製槽數)
ssl = on (建議啓用SSL保障安全)
操作權限:僅限初始用户和擁有REPLICATION權限的用户操作
操作方法
- pg_create_logical_replication_slot('slot_name', 'plugin_name')
備註:第一個返回值表示slot_name,第二個返回值表示該邏輯複製槽解碼的起始LSN位置。調用該函數的用户需要具有SYSADMIN權限或具有REPLICATION權限或繼承了內置角色gs_role_replication的權限。此函數目前只支持在主機調用。
select pg_create_logical_replication_slot('test_slot', 'wal2json');
查看邏輯複製槽信息。
select * from pg_replication_slots;
往測試表裏插入數據。
create table t1 (id int, c1 varchar(100));
insert into t1 select generate_series(1,100), md5(random()::text);
選擇解碼不推進複製槽,查詢CDC數據。從結果來看可以清楚的知道數據變動,執行的是insert,插入的值也有展示。
- pg_logical_slot_peek_changes('slot_name', 'LSN', upto_nchanges, 'options_name', 'options_value')
解碼並不推進流複製槽(下次解碼可以再次獲取本次解出的數據)。
select data from pg_logical_slot_peek_changes('test_slot', null, null, 'pretty-print', '1');
此時查看邏輯複製槽信息。會發現confirmed_flush和restart_lsn並沒有改變。這是因為執行的pg_logical_slot_peek_changes只是解碼了複製槽,而沒有推進複製槽。
接下來選擇解碼並推進複製槽。
- pg_logical_slot_get_changes('slot_name', 'LSN', upto_nchanges, 'options_name', 'options_value')
備註:調用該函數的用户需要具有SYSADMIN權限或具有REPLICATION權限或繼承了內置角色gs_role_replication的權限。此函數目前只支持在主機調用。
select data from pg_logical_slot_get_changes('test_slot', null, null, 'pretty-print', '1');
再次查看複製槽信息。會發現confirmed_flush和restart_lsn都放生了變化。confirmed_flush表示的是訂閲端已經成功消費到該LSN的所有日誌,restart_lsn表示的是邏輯複製槽從哪裏重新開始讀取 WAL 數據。
如果想要直接推進流複製槽到指定LSN,不輸出解碼結果,可以執行pg_replication_slot_advance。
- pg_replication_slot_advance ('slot_name', 'LSN')
備註:返回值分別對應slot_name和實際推進至的LSN。調用該函數的用户需要具有SYSADMIN權限或具有REPLICATION權限或繼承了內置角色gs_role_replication的權限。此函數目前只支持在主機調用。
再次插入數據,並查詢當前的LSN。
選擇跳過LSN 0/3447AB0,之後再執行解碼並推進複製槽,會發現並沒有輸出解碼結果,這是因為已經推進複製槽到LSN 0/3447AB0了。