如何从 PostgreSQL 中的 FOR ALL TABLES 逻辑复制 PUBLICATION 中删除表

mli*_*ner 5 postgresql replication

我创建了一个逻辑复制 PUBLICATION 使用FOR ALL TABLES. 现在我意识到我不想复制所有的表。我尝试从出版物中删除其中一个表格,但是:

mydb=# alter publication replicapublication drop table only migrations;
ERROR:  publication "replicapublication" is defined as FOR ALL TABLES
DETAIL:  Tables cannot be added to or dropped from FOR ALL TABLES publications.
Run Code Online (Sandbox Code Playgroud)

我已经完成了数百 GB 的巨大同步,而且我不想从新出版物开始。

问题: 1、本刊有赎回的希望吗?2. 如果没有,有没有办法创建一个完全同步的新发布,​​而不用完全同步重新开始?

谢谢。

jja*_*nes 2

对于1,不,我不认为。2,可能,但似乎令人担忧。

我天真地认为,创建一个列出您的表的新发布,​​然后在订阅端禁用旧订阅并使用同一插槽创建新订阅,所有这些都在一个事务中进行。但做了一个实验,如果发布者负载不足,这不起作用。它最终会丢失一些更改。然而,如果发布者处于静止状态并且订阅者在交换时陷入困境,那么它似乎确实有效。

-- warning: does not work transactionally!
begin; 
alter subscription sub disable;
alter subscription sub set (SLOT_NAME = NONE); -- used to be 'sub'
create subscription sub2 CONNECTION '' PUBLICATION pub2 with (
    copy_data = false, 
    slot_name='sub', 
    create_slot=false) ;
commit;
Run Code Online (Sandbox Code Playgroud)

我无法确定这是否是一个错误。我在文档中没有看到任何可以为这种非事务行为辩解的内容,但我没有仔细阅读整个内容。