Logical Replication - behavior of ALTER PUBLICATION .. DROP TABLE and ALTER SUBSCRIPTION .. REFRESH PUBLICATION - Mailing list pgsql-hackers
From | Bharath Rupireddy |
---|---|
Subject | Logical Replication - behavior of ALTER PUBLICATION .. DROP TABLE and ALTER SUBSCRIPTION .. REFRESH PUBLICATION |
Date | |
Msg-id | CALj2ACV+0UFpcZs5czYgBpujM9p0Hg1qdOZai_43OU7bqHU_xw@mail.gmail.com Whole thread Raw |
Responses |
Re: Logical Replication - behavior of ALTER PUBLICATION .. DROP TABLE and ALTER SUBSCRIPTION .. REFRESH PUBLICATION
|
List | pgsql-hackers |
Hi, While providing thoughts on the design in [1], I found a strange behaviour with the $subject. The use case is shown below as a sequence of steps that need to be run on publisher and subscriber to arrive at the strange behaviour. In step 5, the table is dropped from the publication and in step 6, the refresh publication is run on the subscriber, from here onwards, the expectation is that no further inserts into the publisher table have to be replicated on to the subscriber, but the opposite happens i.e. the inserts are still replicated to the subscriber. ISTM as a bug. Let me know if I'm missing anything. Thoughts? step 1) on the publisher: DROP TABLE t1; DROP PUBLICATION mypub1; CREATE TABLE t1 (a int); INSERT INTO t1 VALUES (1); CREATE PUBLICATION mypub1 FOR TABLE t1; postgres=# SELECT r1.*, r2.relname, r3.* FROM pg_publication_rel r1, pg_class r2, pg_publication r3 WHERE r1.prrelid = r2.oid AND r1.prpubid = r3.oid; oid | prpubid | prrelid | relname | oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot -------+---------+---------+---------+-------+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ 16462 | 16461 | 16458 | t1 | 16461 | mypub1 | 10 | f | t | t | t | t | f (1 row) step 2) on the subscriber: DROP TABLE t1; DROP SUBSCRIPTION mysub1; CREATE TABLE t1 (a int); CREATE SUBSCRIPTION mysub1 CONNECTION 'host=localhost dbname=postgres user=bharath port=5432' PUBLICATION mypub1; postgres=# SELECT r1.*, r2.relname, r3.* FROM pg_subscription_rel r1, pg_class r2, pg_subscription r3 WHERE r1.srrelid = r2.oid AND r1.srsubid = r3.oid; srsubid | srrelid | srsubstate | srsublsn | relname | oid | subdbid | subname | subowner | subenabled | subbinary | substream | subconninfo | subslotname | subsynccommit | subpublications ---------+---------+------------+----------+---------+-------+---------+---------+----------+------------+-----------+-----------+--------------------- ----------------------------------+-------------+---------------+----------------- 16446 | 16443 | i | | t1 | 16446 | 12872 | mysub1 | 10 | t | f | f | host=localhost dbnam e=postgres user=bharath port=5432 | mysub1 | off | {mypub1} (1 row) postgres=# SELECT * FROM t1; a --- 1 (1 row) step 3) on the publisher: INSERT INTO t1 VALUES (2); step 4) on the subscriber: postgres=# SELECT * FROM t1; a --- 1 2 (2 rows) step 5) on the publisher: ALTER PUBLICATION mypub1 DROP TABLE t1; postgres=# SELECT r1.*, r2.relname, r3.* FROM pg_publication_rel r1, pg_class r2, pg_publication r3 WHERE r1.prrelid = r2.oid AND r1.prpubid = r3.oid; oid | prpubid | prrelid | relname | oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot -----+---------+---------+---------+-----+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ (0 rows) INSERT INTO t1 VALUES (3); step 6) on the subscriber: postgres=# SELECT * FROM t1; a --- 1 2 3 (3 rows) ALTER SUBSCRIPTION mysub1 REFRESH PUBLICATION; postgres=# SELECT r1.*, r2.relname, r3.* FROM pg_subscription_rel r1, pg_class r2, pg_subscription r3 WHERE r1.srrelid = r2.oid AND r1.srsubid = r3.oid; srsubid | srrelid | srsubstate | srsublsn | relname | oid | subdbid | subname | subowner | subenabled | subbinary | substream | subconninfo | subslotn ame | subsynccommit | subpublications ---------+---------+------------+----------+---------+-----+---------+---------+----------+------------+-----------+-----------+-------------+--------- ----+---------------+----------------- (0 rows) step 7) on the publisher: INSERT INTO t1 VALUES (4); step 8) on the subscriber: postgres=# SELECT * FROM t1; a --- 1 2 3 4 (4 rows) step 9) on the publisher: INSERT INTO t1 SELECT * FROM generate_series(5,100); step 10) on the subscriber: postgres=# SELECT count(*) FROM t1; count ------- 100 (1 row) [1] - https://www.postgresql.org/message-id/CAA4eK1L5TejNHNctyPB3GVuEriRQw6xxU32iMyv%3Dh4tCJKkLew%40mail.gmail.com With Regards, Bharath Rupireddy. EnterpriseDB: http://www.enterprisedb.com
pgsql-hackers by date: