Thread: BUG #18683: A publication must be created *before* a logical rep slot in order to be used with that slot?
BUG #18683: A publication must be created *before* a logical rep slot in order to be used with that slot?
From
PG Bug reporting form
Date:
The following bug has been logged on the website: Bug reference: 18683 Logged by: Anthony Accomazzo Email address: accomazz@gmail.com PostgreSQL version: 17.0 Operating system: MacOS 15.0.1 (Sequoia) Description: It seems that if you (1) create a logical replication slot (2) and activity happens in your database then (3) you create a publication, the combination of that slot + publication is not usable (you can't connect). i.e. if there is any activity "in" a slot that predates the create statement for a pub, the slot+pub combo will not work. Is this known behavior? It's surprising just insofar as I'd hope either: - the docs cover this - the error message that one gets could be made clearer Reproduction steps: ``` create table public.mytable ( id serial primary key, inserted_at timestamp default now(), updated_at timestamp default now() ); create table public.mytable2 ( id serial primary key, inserted_at timestamp default now(), updated_at timestamp default now() ); -- ensure clean start drop publication test_pub; select pg_drop_replication_slot('test_slot'); -- create the slot select pg_create_logical_replication_slot('test_slot', 'pgoutput'); -- insert into any table insert into mytable2 (id) values (default); -- create a pub create publication test_pub for table mytable; -- cannot connect to slot -- in shell: $ pg_recvlogical -d postgresql://postgres:postgres@localhost:5432/sequin_dev_rep --slot test_slot --start -o proto_version=1 -o publication_names='test_pub' -f - pg_recvlogical: error: unexpected termination of replication stream: ERROR: publication "test_pub" does not exist CONTEXT: slot "test_slot", output plugin "pgoutput", in the change callback, associated LSN A/7D3CD9F0 pg_recvlogical: disconnected; waiting 5 seconds to try again pg_recvlogical: error: unexpected termination of replication stream: ERROR: publication "test_pub" does not exist ```
Re: BUG #18683: A publication must be created *before* a logical rep slot in order to be used with that slot?
From
Peter Eisentraut
Date:
On 01.11.24 19:09, PG Bug reporting form wrote: > It seems that if you (1) create a logical replication slot (2) and activity > happens in your database then (3) you create a publication, the combination > of that slot + publication is not usable (you can't connect). > > i.e. if there is any activity "in" a slot that predates the create statement > for a pub, the slot+pub combo will not work. > > Is this known behavior? It's surprising just insofar as I'd hope either: > > - the docs cover this > - the error message that one gets could be made clearer Do the docs anywhere suggest you can do this? The normal way to set up logical replication is to run CREATE SUBSCRIPTION, which makes the slot for you. And CREATE SUBSCRIPTION requires specifying a publication, so it already has to exist beforehand.
Re: BUG #18683: A publication must be created *before* a logical rep slot in order to be used with that slot?
From
Amit Kapila
Date:
On Sat, Nov 2, 2024 at 12:26 AM PG Bug reporting form <noreply@postgresql.org> wrote: > > The following bug has been logged on the website: > > Bug reference: 18683 > Logged by: Anthony Accomazzo > Email address: accomazz@gmail.com > PostgreSQL version: 17.0 > Operating system: MacOS 15.0.1 (Sequoia) > Description: > > It seems that if you (1) create a logical replication slot (2) and activity > happens in your database then (3) you create a publication, the combination > of that slot + publication is not usable (you can't connect). > > i.e. if there is any activity "in" a slot that predates the create statement > for a pub, the slot+pub combo will not work. > > Is this known behavior? It's surprising just insofar as I'd hope either: > > - the docs cover this > - the error message that one gets could be made clearer > > Reproduction steps: > > ``` > create table public.mytable ( > id serial primary key, > inserted_at timestamp default now(), > updated_at timestamp default now() > ); > > create table public.mytable2 ( > id serial primary key, > inserted_at timestamp default now(), > updated_at timestamp default now() > ); > > -- ensure clean start > drop publication test_pub; > select pg_drop_replication_slot('test_slot'); > > -- create the slot > select pg_create_logical_replication_slot('test_slot', 'pgoutput'); > -- insert into any table > insert into mytable2 (id) values (default); > -- create a pub > create publication test_pub for table mytable; > -- cannot connect to slot > > -- in shell: > $ pg_recvlogical -d > postgresql://postgres:postgres@localhost:5432/sequin_dev_rep --slot > test_slot --start -o proto_version=1 -o publication_names='test_pub' -f - > > pg_recvlogical: error: unexpected termination of replication stream: ERROR: > publication "test_pub" does not exist > CONTEXT: slot "test_slot", output plugin "pgoutput", in the change > callback, associated LSN A/7D3CD9F0 > pg_recvlogical: disconnected; waiting 5 seconds to try again > pg_recvlogical: error: unexpected termination of replication stream: ERROR: > publication "test_pub" does not exist > ``` This is a known behavior and I have seen such reports earlier. There is a discussion of a related issue in the email [1] with a proposed patch to solve it. I don't think the proposed solution can help with getting the data generated before the creation of publication but one can avoid getting repeated ERRORs. You can give it a try and share your feedback on that thread [1], if possible. [1] - https://www.postgresql.org/message-id/CALDaNm0-n8FGAorM%2BbTxkzn%2BAOUyx5%3DL_XmnvOP6T24%2B-NcBKg%40mail.gmail.com -- With Regards, Amit Kapila.