On Mon, May 26, 2025 at 12:02 PM shveta malik <shveta.ma...@gmail.com> wrote:
>
> Agree that log messages need improvement. Please find the patch
> attached for the same. I also intend to update the docs in this area
> for users to understand this feature better, and will work on that
> soon.
>

PFA the patch with doc changes as well. The doc explains the need of
pg_logical_slot_get_changes() for a particular scenario.

Also attached the script to show how this setup works. When the
replication slot is being actively consumed on primary, we do not
observe that particular LOG (could not synchronize replication) on
standby and synchronization proceeds without any manual intervention.

Thanks Nisha for the script.

thanks
Shveta

Attachment: v2-0001-Improve-log-messages-and-docs-for-slotsync.patch
Description: Binary data

#!/bin/bash

port_primary=6633
port_standby=6634
port_subscriber=6635

echo '=========='
echo '=Clean up='
echo '=========='

./pg_ctl stop -D ../../pubdb/
./pg_ctl stop -D ../../standbydb/
./pg_ctl stop -D ../../subdb/

rm -rf ../../pubdb
rm -rf ../../subdb
rm -rf ../../standbydb
rm  ../../pub.log
rm  ../../sub.log
rm  ../../standby.log

echo '======================='
echo '=Set up primary server='
echo '======================='

./initdb -D ../../pubdb

cat << EOF >> ../../pubdb/postgresql.conf
wal_level = logical
port = $port_primary
synchronized_standby_slots = 'standby_1'
max_wal_senders=500
max_worker_processes=1000
max_replication_slots=500
log_replication_commands = 'on'
EOF

cat << EOF >> ../../pubdb/pg_hba.conf
host all,replication all 0.0.0.0/0 trust
EOF

./pg_ctl -D ../../pubdb/ -w -l ../../pub.log start
./psql -p $port_primary -d postgres -c "SELECT pg_create_physical_replication_slot('standby_1');"
./psql -p $port_primary -d postgres -c "CREATE ROLE replication WITH REPLICATION PASSWORD 'password' LOGIN;"
./pg_ctl -D ../../pubdb/ -w -l ../../pub.log stop
./pg_ctl -D ../../pubdb/ -w -l ../../pub.log start



echo '========================='
echo '=Set up standby server='
echo '========================='

./pg_basebackup -h 127.0.0.1 -D ../../standbydb  -R -P -U replication -X s  -p $port_primary

cat << EOF >> ../../standbydb/postgresql.conf
port = $port_standby
primary_slot_name = 'standby_1'
hot_standby_feedback = on
synchronized_standby_slots = ''
wal_receiver_status_interval=1s
log_min_messages='DEBUG1'
EOF
cat << EOF >> ../../standbydb/postgresql.auto.conf
primary_conninfo = 'user=replication host=127.0.0.1 port=6633 dbname=postgres'
EOF

./pg_ctl -D ../../standbydb/ -w -l ../../standby.log start

echo '========================='
echo '=primary: create logical slot and perform DDLs'
echo '========================='

./psql -p $port_primary -d postgres -c "SELECT pg_create_logical_replication_slot('sub1','pgoutput', false, false, true);"

./psql -p $port_primary -d postgres -c "create table tab1 (id int primary key, a int);"
./psql -p $port_primary -d postgres -c "create table tab2 (id int primary key, a int);"

# let the standby catch up
sleep 2;

./psql -p $port_primary -d postgres -c "select slot_name,xmin, catalog_xmin from pg_replication_slots";
./psql -p $port_primary -d postgres -c "select xmin from pg_class where relname='tab1';"


echo '==================='
echo '=Set up subscriber='
echo '==================='

./initdb -D ../../subdb

cat << EOF >> ../../subdb/postgresql.conf
port = $port_subscriber
max_wal_senders=500
max_worker_processes=1000
max_replication_slots=500
max_logical_replication_workers=500
EOF

./pg_ctl start -D ../../subdb -w -l ../../sub.log


echo '==================='
echo '=Create publication and subscription using already created logical slot.'
echo '==================='
./psql -p $port_primary -d postgres -c "create publication pub1 for all tables;"

./psql -p $port_subscriber -d postgres -c "create table tab1 (id int primary key, a int);"
./psql -p $port_subscriber -d postgres -c "create table tab2 (id int primary key, a int);"
./psql -p $port_subscriber -d postgres -c "create subscription sub1 connection 'dbname=postgres host=localhost port=6633' publication pub1 with (create_slot = false, failover=true);"

# let the subscriber start and catch up.
sleep 2

./psql -p $port_primary -d postgres -c "select slot_name,xmin, catalog_xmin from pg_replication_slots";


echo '==================='
echo '=Sync replication slots on standby'
echo '==================='
./psql -p $port_standby -d postgres -c "SELECT pg_sync_replication_slots();"

sleep 1

echo '==================='
echo '=Check both primary and synced slot after sync'
echo '==================='

echo '=PRIMARY='
./psql -p $port_primary -d postgres -c "select slot_name, synced, catalog_xmin, restart_lsn, confirmed_flush_lsn from pg_replication_slots where slot_type='logical'";
echo '=STANDBY='
./psql -p $port_standby -d postgres -c "select slot_name, synced, catalog_xmin, restart_lsn, confirmed_flush_lsn from pg_replication_slots where slot_type='logical'";


echo '==================='
echo '=New DDLs on pub and sub'
echo '==================='
# Some more new tables on pub
./psql -p $port_primary -d postgres -c "create table tab3 (id int primary key, a int);"
./psql -p $port_primary -d postgres -c "create table tab4 (id int primary key, a int);"

# new tables on sub
./psql -p $port_subscriber -d postgres -c "create table tab3 (id int primary key, a int);"
./psql -p $port_subscriber -d postgres -c "create table tab4 (id int primary key, a int);"

# Refresh publication
./psql -p $port_subscriber -d postgres -c "alter subscription sub1 refresh publication;"

# Give enough time to the subscriber to catch up
sleep 2

./psql -p $port_primary -d postgres -c "select slot_name,xmin, catalog_xmin from pg_replication_slots";

echo '==================='
echo '=Sync replication slots multiple times on standby'
echo '==================='
./psql -p $port_standby -d postgres -c "SELECT pg_sync_replication_slots();"

./psql -p $port_primary -d postgres -c "insert into tab3 values (10,10);"
./psql -p $port_primary -d postgres -c "insert into tab4 values (10,10);"
sleep 2

./psql -p $port_standby -d postgres -c "SELECT pg_sync_replication_slots();"

sleep 2

echo '==================='
echo '=Check both primary and synced slot after sync'
echo '==================='

echo '=PRIMARY='
./psql -p $port_primary -d postgres -c "select slot_name, synced, catalog_xmin, restart_lsn, confirmed_flush_lsn from pg_replication_slots where slot_type='logical'";
echo '=STANDBY='
./psql -p $port_standby -d postgres -c "select slot_name, synced, catalog_xmin, restart_lsn, confirmed_flush_lsn from pg_replication_slots where slot_type='logical'";

Reply via email to