Re: Starting logical replication at arbitrary point that's available in WAL

From: Alexander Uvizhev <uvizhe(at)posteo(dot)net>
To: "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com>
Cc: "pgsql-general(at)lists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: Starting logical replication at arbitrary point that's available in WAL
Date: 2024-12-27 13:18:27
Message-ID: ed8c4de2-2202-46ef-966f-b6a3d450034a@posteo.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 12/27/24 13:20, Zhijie Hou (Fujitsu) wrote:

> On Friday, December 27, 2024 7:39 PM Alexander Uvizhev<uvizhe(at)posteo(dot)net> wrote:
>
> Hi,
>
>> I'm doing a logical replication using streaming replication protocol and
>> I'm trying to start a stream from a certain arbitrary point that's
>> available in WAL. However, both CREATE_REPLICATION_SLOT and
>> pg_create_logical_replication_slot() create slot with nearly last LSN/XID.
>>
>> Is it possible to create a replication slot with arbitrary LSN/XID values?
> I think it's not supported to specify arbitrary LSN/XID values for a newly
> created slot in core. However, if you have an existing slot with an older LSN/XID, you
> can copy it using pg_copy_logical_replication_slot, and then advance the copied
> slot to your desired position with pg_replication_slot_advance.
Thanks for the idea, I've already discovered it and it requires me to
implement some script to advance that dedicated slot, which I was hoping
to avoid.
>> Also pg_create_logical_replication_slot() for some reason gives
>> different result than CREATE_REPLICATION_SLOT: new slot's `catalog_xmin`
>> is set to the smallest `catalog_xmin` among already existing slots.
>> Looks like a bug.
> Could you provide a script to reproduce this issue ?
> That would be helpful in diagnosing the reason.

Unfortunately, I have no such script. But it looks like this:

test=> select slot_name, catalog_xmin, restart_lsn, confirmed_flush_lsn
from pg_replication_slots;
  slot_name    | catalog_xmin | restart_lsn | confirmed_flush_lsn
---------------+--------------+-------------+---------------------
 inactive_slot |        10073 | 0/1101DB88  | 0/1101DB88
 active_slot |        42607 | 0/17A87410  | 0/17A87410
 physical      |              | 0/17A875A0  |

test=> select pg_create_logical_replication_slot('test_slot',
'decoderbufs');
  slot_name    | catalog_xmin | restart_lsn | confirmed_flush_lsn
---------------+--------------+-------------+---------------------
inactive_slot|        10073 | 0/1101DB88  | 0/1101DB88
active_slot |        42607 | 0/17A87410  | 0/17A87410
 physical      |              | 0/17A875D8  |
 test_slot |        10073 | 0/17A875A0  | 0/17A875D8

While using CREATE_REPLICATION_SLOT would give me the same slot with
`catalog_xmin` = 42607.

Hope this helps.

> Best Regards,
> Hou zj
--
AU

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Jan Behrens 2024-12-27 19:50:25 search_path for PL/pgSQL functions partially cached?
Previous Message Zhijie Hou (Fujitsu) 2024-12-27 12:20:05 RE: Starting logical replication at arbitrary point that's available in WAL