public inbox for [email protected]  
help / color / mirror / Atom feed
From: vignesh C <[email protected]>
To: Peter Smith <[email protected]>
Cc: PostgreSQL Hackers <[email protected]>
Subject: Re: Include sequences in publications created by pg_createsubscriber
Date: Wed, 24 Jun 2026 13:00:25 +0530
Message-ID: <CALDaNm05u0UvteGQf_9wKbUFujO0JvJk=GnTeZyxsdB0bmPtcg@mail.gmail.com> (raw)
In-Reply-To: <CAHut+PtGOeXr69qQRgq_DW=BEEix_6bDsgmR8Vk4_qbNy5BvAA@mail.gmail.com>
References: <CALDaNm2RYQRLjexRJOpiZOFkspp8PRgoh6S7d2y003TJ_TSSZA@mail.gmail.com>
	<CAHut+PtGOeXr69qQRgq_DW=BEEix_6bDsgmR8Vk4_qbNy5BvAA@mail.gmail.com>

On Tue, 23 Jun 2026 at 06:33, Peter Smith <[email protected]> wrote:
>
> On Sat, Jun 20, 2026 at 1:59 AM vignesh C <[email protected]> wrote:
> ...
> > The attached patch modifies pg_createsubscriber to include sequences
> > in the publication it creates, enabling this workflow.
> > Thoughts?
> >
>
> Hi Vignesh,
>
> +1 to make this change.
>
> Some review comments for patch 0001.
>
> ======
> Commit Message
>
> 1.
> This change modifies pg_createsubscriber to include all sequences in the
> publication it creates. Administrators can then run ALTER SUBSCRIPTION
> ... REFRESH SEQUENCES after the upgrade to synchronize sequence state,
> ensuring a more complete and reliable upgrade workflow.
>
> ~
>
> /include all sequences/include ALL SEQUENCES/

Modified

> ======
> doc/src/sgml/ref/pg_createsubscriber.sgml
>
> 2.
> -   does not copy the initial table data. It does only the
> synchronization phase,
> -   which ensures each table is brought up to a synchronized state.
> +   does not copy the initial table or sequence data. It does only the
> +   synchronization phase, which ensures each table and sequence is brought up
> +   to a synchronized state.
>    </para>
>
> I felt "does not copy the initial [...] sequence data" should not be
> said for sequences. AFAIK each sequence has only 1 value anyway, so
> bringing it "to a synchronized state" is effectively the same thing as
> copying the initial data for sequences, so saying in the first
> sentence that copy does not happen seems a contradiction.
>
> IIUC what above means is really just the same as chapter 29.7, which
> says "use CREATE SUBSCRIPTION to initially synchronize the published
> sequences.".

pg_createsubscriber does the following:
1) We get the consistent_lsn from create_logical_replication_slot.
2) Then we set recovery_target_lsn = consistent_lsn from above
3) Then advance replication origin of each subscription to this lsn
4) Then enable subscription
5) stop standby server

Here setting recovery_target_lsn to consistent_lsn and recovering it
till there. I mean sequences are brought to sync state.
Create subscription will not do any data copy in case of pg_createsubscriber.

I meant the above here, let me know if you have better wording for this.

> ~~~
>
> 3.
>        linkend="sql-createpublication-params-for-all-tables"><literal>FOR ALL
> -      TABLES</literal></link>.  If the <option>--publication</option> option
> +      TABLES</literal></link> and <link
> +      linkend="sql-createpublication-params-for-all-sequences"><literal>FOR ALL
> +      SEQUENCES</literal></link>.  If the <option>--publication</option> option
>        is not specified, the publication has the following name pattern:
>
> Maybe just say "ALL SEQUENCES" here instead of "FOR ALL SEQUENCES"?

Modified

> ~~~
>
> 4.
>       <para>
>        Enable the subscription for each specified database on the target server.
>        The subscription starts applying transactions from the replication start
> -      point.
> +      point. The subscription is configured to include sequences. Sequence
> +      values can be synchronized at any time by running
> +      <link linkend="sql-altersubscription-params-refresh-sequences">
> +      <command>ALTER SUBSCRIPTION ... REFRESH SEQUENCES</command></link>, which
> +      fetches the current sequence state from the publisher and advances the
> +      corresponding subscriber sequences.
>       </para>
>
> IIUC, all this "How it works" section is describing the internal logic
> of what pg_subscriber is internally. OTOH, this "REFRESH SEQUENCES" is
> just a note about what the Administrator can do manually later...
>
> So, maybe you can still write this note somewhere, but just don't
> include it buried in the internal "How it works" steps.

Moved it along with description

> ======
> src/bin/pg_basebackup/pg_createsubscriber.c
>
> 5.
> Patch needs also to update the function comment for
> create_publication() because currently it still says "includes all
> tables".

Modified

The attached v2 version patch has the changes for the same.

Regards,
Vignesh


Attachments:

  [application/octet-stream] v2-0001-Include-sequences-in-publications-created-by-pg_c.patch (8.0K, ../CALDaNm05u0UvteGQf_9wKbUFujO0JvJk=GnTeZyxsdB0bmPtcg@mail.gmail.com/2-v2-0001-Include-sequences-in-publications-created-by-pg_c.patch)
  download | inline diff:
From 463272e0c2ae53ff3b39e3e1e1e508697732c9df Mon Sep 17 00:00:00 2001
From: Vignesh C <[email protected]>
Date: Fri, 19 Jun 2026 19:14:27 +0530
Subject: [PATCH v2] Include sequences in publications created by
 pg_createsubscriber

pg_createsubscriber creates a publication on the publisher to establish
logical replication between the original primary and the converted
subscriber. Currently, the publication is created with FOR ALL TABLES,
which ensures that table data changes are replicated during the upgrade
process.

However, sequence state is not replicated as part of this workflow.

Recent additions to logical replication introduced support for publishing
all sequences and synchronizing sequence state through subscription
refresh. By creating publications with FOR ALL TABLES, ALL SEQUENCES,
pg_createsubscriber can take advantage of these capabilities and allow
sequence state to be synchronized before the upgraded node is promoted.

This change modifies pg_createsubscriber to include ALL SEQUENCES in the
publication it creates. Administrators can then run ALTER SUBSCRIPTION
... REFRESH SEQUENCES after the upgrade to synchronize sequence state,
ensuring a more complete and reliable upgrade workflow.
---
 doc/src/sgml/ref/pg_createsubscriber.sgml     | 41 ++++++++++++-------
 src/bin/pg_basebackup/pg_createsubscriber.c   |  4 +-
 .../t/040_pg_createsubscriber.pl              |  8 ++++
 3 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/doc/src/sgml/ref/pg_createsubscriber.sgml b/doc/src/sgml/ref/pg_createsubscriber.sgml
index 3b3038d1891..4c7f5fee574 100644
--- a/doc/src/sgml/ref/pg_createsubscriber.sgml
+++ b/doc/src/sgml/ref/pg_createsubscriber.sgml
@@ -48,11 +48,11 @@ PostgreSQL documentation
 
   <para>
    <application>pg_createsubscriber</application> creates a new logical
-   replica from a physical standby server.  All tables in the specified
-   database are included in the <link linkend="logical-replication">logical
-   replication</link> setup.  A pair of
-   publication and subscription objects are created for each database.  It
-   must be run at the target server.
+   replica from a physical standby server.  All tables and sequences in the
+   specified database are included in the
+   <link linkend="logical-replication">logical replication</link> setup.  A
+   pair of publication and subscription objects are created for each database.
+   It must be run at the target server.
   </para>
 
   <para>
@@ -60,8 +60,9 @@ PostgreSQL documentation
    fresh logical replication setup.  The main difference between the logical
    replication setup and <application>pg_createsubscriber</application> is how
    the data synchronization is done. <application>pg_createsubscriber</application>
-   does not copy the initial table data. It does only the synchronization phase,
-   which ensures each table is brought up to a synchronized state.
+   does not copy the initial table or sequence data. It does only the
+   synchronization phase, which ensures each table and sequence is brought up
+   to a synchronized state.
   </para>
 
   <para>
@@ -75,7 +76,16 @@ PostgreSQL documentation
    synchronization.  For details, see the <command>CREATE SUBSCRIPTION</command>
    <link linkend="sql-createsubscription-params-with-copy-data">
    <literal>copy_data</literal></link> option.
+  </para>
 
+  <para>
+   Note that although the publication includes sequences, sequence value
+   changes made on the publisher after reaching consistent point are not
+   synchronized incrementally. To synchronize sequence values, run
+   <link linkend="sql-altersubscription-params-refresh-sequences">
+   <command>ALTER SUBSCRIPTION ... REFRESH SEQUENCES</command></link>, which
+   fetches the current sequence state from the publisher and advances the
+   corresponding subscriber sequences.
   </para>
  </refsect1>
 
@@ -275,10 +285,10 @@ PostgreSQL documentation
         <listitem>
          <para>
           <literal>publications</literal>:
-          The <literal>FOR ALL TABLES</literal> publications established for this
-          subscriber are always dropped; specifying this object type causes all
-          other publications replicated from the source server to be dropped as
-          well.
+          The <literal>FOR ALL TABLES, ALL SEQUENCES</literal> publications
+          established for this subscriber are always dropped; specifying this
+          object type causes all other publications replicated from the source
+          server to be dropped as well.
          </para>
         </listitem>
        </itemizedlist>
@@ -323,7 +333,8 @@ PostgreSQL documentation
        If a specified publication already exists on the publisher, it is reused.
        It is useful to partially replicate the database if the specified
        publication includes a list of tables. If the publication does not exist,
-       it is automatically created with <literal>FOR ALL TABLES</literal>. Use
+       it is automatically created with
+       <literal>FOR ALL TABLES, ALL SEQUENCES</literal>. Use
        <option>--dry-run</option> option to preview which publications will be
        reused and which will be created.
       </para>
@@ -534,7 +545,9 @@ PostgreSQL documentation
       Create a publication and replication slot for each specified database on
       the source server.  Each publication is created using <link
       linkend="sql-createpublication-params-for-all-tables"><literal>FOR ALL
-      TABLES</literal></link>.  If the <option>--publication</option> option
+      TABLES</literal></link> and <link
+      linkend="sql-createpublication-params-for-all-sequences"><literal>ALL
+      SEQUENCES</literal></link>.  If the <option>--publication</option> option
       is not specified, the publication has the following name pattern:
       <quote><literal>pg_createsubscriber_%u_%x</literal></quote> (parameter:
       database <parameter>oid</parameter>, random <parameter>int</parameter>).
@@ -617,7 +630,7 @@ PostgreSQL documentation
      <para>
       Enable the subscription for each specified database on the target server.
       The subscription starts applying transactions from the replication start
-      point.
+      point. The subscription is configured to include sequences.
      </para>
     </step>
 
diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c
index 4d705778454..ec18faf50eb 100644
--- a/src/bin/pg_basebackup/pg_createsubscriber.c
+++ b/src/bin/pg_basebackup/pg_createsubscriber.c
@@ -1788,7 +1788,7 @@ wait_for_end_recovery(const char *conninfo, const struct CreateSubscriberOptions
 }
 
 /*
- * Create a publication that includes all tables in the database.
+ * Create a publication that includes all tables and sequences in the database.
  */
 static void
 create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo)
@@ -1840,7 +1840,7 @@ create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo)
 		pg_log_info("creating publication \"%s\" in database \"%s\"",
 					dbinfo->pubname, dbinfo->dbname);
 
-	appendPQExpBuffer(str, "CREATE PUBLICATION %s FOR ALL TABLES",
+	appendPQExpBuffer(str, "CREATE PUBLICATION %s FOR ALL TABLES, ALL SEQUENCES",
 					  ipubname_esc);
 
 	pg_log_debug("command is: %s", str->data);
diff --git a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
index 9252d1c3c5c..044f202cb35 100644
--- a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
+++ b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
@@ -503,6 +503,14 @@ is($result, qq(0),
 	'the physical replication slot used as primary_slot_name has been removed'
 );
 
+# Verify that the publication is configured to publish all tables and
+# all sequences.
+$result = $node_p->safe_psql($db2,
+	"SELECT puballtables, puballsequences FROM pg_publication");
+is( $result, qq(t|t),
+	"publication is created with both all-tables and all-sequences enabled"
+);
+
 # Insert rows on P
 $node_p->safe_psql($db1, "INSERT INTO tbl1 VALUES('third row')");
 $node_p->safe_psql($db2, "INSERT INTO tbl2 VALUES('row 1')");
-- 
2.53.0



view thread (23+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected]
  Subject: Re: Include sequences in publications created by pg_createsubscriber
  In-Reply-To: <CALDaNm05u0UvteGQf_9wKbUFujO0JvJk=GnTeZyxsdB0bmPtcg@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox