1. 程式人生 > >PostgreSQL增量訂閱方案:利用Logical Decoding訂閱增量

PostgreSQL增量訂閱方案:利用Logical Decoding訂閱增量

Logical Decoding是PostgreSQL9.4中的一個重要功能,它的功能是從PG的WAL日誌中,讀取資料庫更新資訊,然後“翻譯”(Decode)成邏輯的形式,可傳送到遠端從庫做資料同步。
該方案實現思路如下:
1.要利用該功能,首先需要修改PostgreSQL的配置檔案:

 wal_level = logical
 max_replication_slots = 1 # 該引數要大於等於1

2.建立Logical Replication Slot

SELECT * FROM pg_create_logical_replication_slot('regression_slot'
, 'test_decoding'); -- 使用'test_decoding'外掛建立一個名為'regression_slot'的Logical Replication Slot

3.對PostgreSQL進行dml操作後,可以使用以下兩個語句檢視記錄

SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);

兩者的區別在於pg_logical_slot_peek_changes

可以多次查詢記錄;pg_logical_slot_get_changes在查詢過記錄後,便會刪除記錄。
顯示結果如下:
在這裡插入圖片描述
由查詢結果可知,test_decoding外掛將DML的WAL日誌解析成
table schema.table_name:操作型別: 列名[該列資料型別]:值...的形式,如果是對主鍵進行UPDATE操作,那麼查詢結果中還會包含舊的主鍵值。
對此,我們可以通過以下兩種方式獲取增量的SQL的格式:
(1) 通過修改test_decoding外掛的轉譯格式,使得其查詢結果顯示為可用的SQL語句;
(2) 通過Java程式碼讀取查詢結果,拼湊成增量的SQL語句,然後在目標資料庫執行。
4. 在完成增量訂閱任務後,刪除

SELECT pg_drop_replication_slot('regression_slot');