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');

南大通用GBase 8c邏輯複製槽實踐解析_數據庫

查看邏輯複製槽信息。

select * from pg_replication_slots;

南大通用GBase 8c邏輯複製槽實踐解析_數據庫_02

往測試表裏插入數據。

create table t1 (id int, c1 varchar(100));
insert into t1 select generate_series(1,100), md5(random()::text);

南大通用GBase 8c邏輯複製槽實踐解析_數據_03

選擇解碼不推進複製槽,查詢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');

南大通用GBase 8c邏輯複製槽實踐解析_數據_04

此時查看邏輯複製槽信息。會發現confirmed_flush和restart_lsn並沒有改變。這是因為執行的pg_logical_slot_peek_changes只是解碼了複製槽,而沒有推進複製槽。

南大通用GBase 8c邏輯複製槽實踐解析_數據_05

接下來選擇解碼並推進複製槽。

  • 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');

南大通用GBase 8c邏輯複製槽實踐解析_數據庫_06

再次查看複製槽信息。會發現confirmed_flush和restart_lsn都放生了變化。confirmed_flush表示的是訂閲端已經成功消費到該LSN的所有日誌,restart_lsn表示的是邏輯複製槽從哪裏重新開始讀取 WAL 數據。

南大通用GBase 8c邏輯複製槽實踐解析_數據庫_07

如果想要直接推進流複製槽到指定LSN,不輸出解碼結果,可以執行pg_replication_slot_advance。

  • pg_replication_slot_advance ('slot_name', 'LSN')

備註:返回值分別對應slot_name和實際推進至的LSN。調用該函數的用户需要具有SYSADMIN權限或具有REPLICATION權限或繼承了內置角色gs_role_replication的權限。此函數目前只支持在主機調用。

再次插入數據,並查詢當前的LSN。

南大通用GBase 8c邏輯複製槽實踐解析_數據_08

選擇跳過LSN 0/3447AB0,之後再執行解碼並推進複製槽,會發現並沒有輸出解碼結果,這是因為已經推進複製槽到LSN 0/3447AB0了。

南大通用GBase 8c邏輯複製槽實踐解析_數據庫_09