Re: Logical Replication of sequences
Masahiko Sawada <sawada.mshk@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Doc: Add documentation for sequence synchronization.
- 55cefadde874 19 (unreleased) landed
-
Remove unused assignment in CREATE PUBLICATION grammar.
- bfb7419b0bbe 19 (unreleased) landed
-
Add seq_sync_error_count to subscription statistics.
- f6a4c498dcf6 19 (unreleased) landed
-
Fix few issues in commit 5509055d69.
- 5a4eba558aa7 19 (unreleased) landed
-
Add sequence synchronization for logical replication.
- 5509055d6956 19 (unreleased) landed
-
Add worker type argument to logical replication worker functions.
- 3e8e05596a02 19 (unreleased) landed
-
Introduce "REFRESH SEQUENCES" for subscriptions.
- f0b3573c3aac 19 (unreleased) landed
-
Refactor logical worker synchronization code into a separate file.
- 41c674d2e31e 19 (unreleased) landed
-
Standardize use of REFRESH PUBLICATION in code and messages.
- 2436b8c047ff 19 (unreleased) landed
-
Add "ALL SEQUENCES" support to publications.
- 96b378497346 19 (unreleased) landed
-
Expose sequence page LSN via pg_get_sequence_data.
- b93172ca59f4 19 (unreleased) landed
-
Resume conflict-relevant data retention automatically.
- 0d48d393d465 19 (unreleased) cited
-
Post-commit review fixes for 228c370868.
- 1f7e9ba3ac4e 19 (unreleased) cited
-
Generate GUC tables from .dat file
- 63599896545c 19 (unreleased) cited
On Mon, Aug 18, 2025 at 2:13 AM vignesh C <vignesh21@gmail.com> wrote:
>
> On Sat, 16 Aug 2025 at 14:15, Masahiko Sawada <sawada.mshk@gmail.com> wrote:
> >
> > As I understand it, the logical replication of sequences implemented
> > by these patches shares the same user interface as table replication
> > (utilizing CREATE PUBLICATION and CREATE SUBSCRIPTION commands for
> > configuration). However, the underlying replication mechanism totally
> > differs from table replication. While table replication sends
> > changesets extracted from WAL records (i.e., changes are applied in
> > commit LSN order), sequence replication
> > synchronizes the subscriber's sequences with the publisher's current
> > state. This raises an interesting theoretical question: In a scenario
> > where we implement DDL replication (extracting and replicating DDL
> > statements from WAL records to subscribers, as previously proposed),
> > how would sequence-related DDL replication interact with the sequence
> > synchronization mechanism implemented in this patch?
>
> The handling of sequence DDL should mirror how we manage table DDL:
> 1. During CREATE SUBSCRIPTION - Create sequences along with
> tables—there’s no issue when initializing them during the initial
> sync.
> 2. During Incremental Synchronization - Treat sequence changes like
> table changes:
> 2.a Creating new sequences: Apply the creation on the subscriber side
> when the corresponding WAL record appears.
> 2.b Dropping sequences: Handle drops in the same way they should
> propagate and execute on the subscriber.
> 2.c. Handling Modifications to Existing Sequences
> Sequence DDL changes can lead to two different outcomes:
> i) No Conflict - If the change applies cleanly, accept and apply it immediately.
> ii) Conflict
> An example:
> CREATE SEQUENCE s1 MINVALUE 10 MAXVALUE 20;
> SELECT nextval('s1') — called several times, advancing the sequence
> ALTER SEQUENCE s1 MAXVALUE 12;
> -- Error:
> ERROR: RESTART value (14) cannot be greater than MAXVALUE (12)
>
> In such conflict cases, we should consider using setval() with
> is_called = false to adjust the sequence safely and avoid errors.
>
> Thoughts?
Thank you for the explanation.
IIUC even with DDL replication support for sequences, users would
still need to manage the order of DDL operations for sequences and
their synchronization (specifically when executing the REFRESH
PUBLICATION [SEQUENCE] command). For example, if a sequence is dropped
on the publisher, the subscriber would encounter synchronization
failures unless the DROP SEQUENCE is properly applied. This potential
issue concerns me.
I recall that Amit initially proposed an approach involving a special
NOOP record to enable the walsender to read and transmit sequence data
to the subscriber[1]. Have you considered incorporating this concept
into the current implementation? Under this approach, REFRESH
PUBLICATION [SEQUENCE] would simply trigger the subscriber to write a
special WAL record for sequence synchronization. Subsequently, when
decoding the WAL record, the walsender would collect sequence data
associated with its publications and transmit it to the subscriber.
The apply worker would then process sequence changes in the same
manner as table changes.
We could potentially optimize this process by including the LSN of the
last sequence synchronization in the WAL record, allowing the
walsender to transmit only those sequences whose page LSN exceeds this
value.
This thread is quite long so I may have missed some previous
discussion of these points, so I apologize if these matters have
already been addressed.
Regards,
[1] https://www.postgresql.org/message-id/CAA4eK1LC%2BKJiAkSrpE_NwvNdidw9F2os7GERUeSxSKv71gXysQ%40mail.gmail.com
--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com