簡體   English   中英

使用 psycopg2 和發布者進行邏輯復制

[英]Logical replication with psycopg2 and publishers

有用 python 和 psycopg2 編寫的邏輯復制腳本: https://www.psycopg.org/docs/advanced.html#logical-replication-quick-start

有用。 但我不想接收數據庫中的所有操作,而只接收發布者中指定的操作。

為了這:

  1. 我在源數據庫(版本 13.3)中創建了名為“PUB”和一個表的發布者。 我還部署了第二個數據庫(14.1 版)並在其中創建了對該出版物的訂閱,以檢查該出版物的功能。 它有效。

  2. In psycopg2 documentation ( https://www.psycopg.org/docs/extras.html#replication-support-objects ) and postgresql documentation ( https://postgrespro.ru/docs/postgresql/13/protocol-logical-replication? lang=en ) 我找到了一種在 start_replication 中設置 publication_names 的方法

cur.start_replication(slot_name='pytest', decode=True, options={'publication_names': 'PUB'})

但它沒有用。 我收到錯誤:

psycopg2.errors.InvalidParameterValue: option "publication_names" = "PUB," is unknown

其實問題。 psycorpg2 中的邏輯復制可以與訂閱相關聯嗎? 如果是這樣,怎么辦?

Ps 有替代方案(觸發器/通知 -> 偵聽/psycopg2),但如果可能的話,我想解決這個問題。

test_decoding 插件不支持publication_names 選項。

內置 PUBLICATION 使用的插件稱為“pgoutput”,而不是“test_decoding”。 但據我所知,psycopg2 不支持使用該插件。

所以不支持你想要的。 我不知道是否有人正在努力增加對它的支持。

您的問題的答案可能是“是和否”。

正如jjanes在他們的回答中所說,您必須使用pgoutput output 插件來使用出版物。 您可以將psycopg2配置為像這樣使用它:

conn = psycopg2.connect(
    'dbname=test',
    connection_factory=psycopg2.extras.LogicalReplicationConnection,
)

options = {'publication_names': 'pub', 'proto_version': '1'}
cur = conn.cursor()
try:
    cur.start_replication(slot_name='pytest', decode=False, options=options)
except psycopg2.ProgrammingError:
    cur.create_replication_slot(
        'pytest',
        output_plugin='pgoutput',
    )
    cur.start_replication(slot_name='pytest', decode=False, options=options)

但是pgoutput使用二進制協議,因此這些語句的 output

insert into table1 (col) values ('hello hello');
update table1 set col = 'hello goodbye' where id = 6;

b'B\x00\x00\x00\x00r!<x\x00\x02t\xc65\xbb\xb5\xd3\x00\x00jd'
b'R\x00\x00F:public\x00table1\x00d\x00\x02\x01id\x00\x00\x00\x00\x17\xff\xff\xff\xff\x00col\x00\x00\x00\x04\x13\x00\x00\x00\x14'
b'I\x00\x00F:N\x00\x02t\x00\x00\x00\x016t\x00\x00\x00\x0bhello hello'
b'C\x00\x00\x00\x00\x00r!<x\x00\x00\x00\x00r!<\xa8\x00\x02t\xc65\xbb\xb5\xd3'
b'B\x00\x00\x00\x00r!=8\x00\x02t\xc67`\xb5\xae\x00\x00je'
b'U\x00\x00F:N\x00\x02t\x00\x00\x00\x016t\x00\x00\x00\rhello goodbye'
b'C\x00\x00\x00\x00\x00r!=8\x00\x00\x00\x00r!=h\x00\x02t\xc67`\xb5\xae'

因為psycopg2不知道如何解碼消息。 你可以自己解碼它們,使用 Python 標准庫中的struct模塊和發布的消息格式,或者你可以考慮使用wal2json而不是pgoutput wal2json目前不支持發布,但它確實提供了模擬它們的方法。

是的,你可以這樣做,但你必須使用 pgoutput output 插件來使用出版物作為測試解碼 output 插件不支持它。 還記得在創建出版物時使用 ONLY 關鍵字。

CREATE PUBLICATION name [ FOR TABLE [ ONLY ] table_name [ * ] [, ...] | FOR ALL TABLES ] [ WITH ( publication_parameter [= value] [, ... ] ) ]

參考 - 僅為 Postgres 數據庫中的某些表創建發布

就像提到的snakecharmerb一樣,pgoutput提供編碼格式的消息,您必須使用此處指定的算法對其進行解碼 - https://www.postgresql.org/docs/12/protocol-logicalrep-message-formats.ZFC35FDC70D22E

我制作了一個 python 代碼,它同時支持 test_decoding 和 pgoutput 以及對我來說完全沒問題的解碼器。 我還對 pgoutput 的解碼 output 進行了一些格式化,以獲取 JSON 格式的消息,以獲得更好的可用性。

這是相同的鏈接-https://github.com/PhantomHunt/cdc_postgres_logical_replication

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM