Logical Replication

PUBLICATION and SUBSCRIPTION declarations.

PUBLICATION — specific tables

PUBLICATION user_data
    FOR TABLE users, profiles
    WITH (publish = 'insert, update, delete') {
    COMMENT 'Primary replication stream for user data';
}
-- emits
CREATE PUBLICATION "user_data"
    FOR TABLE "public"."users", "public"."profiles"
    WITH (publish = 'insert, update, delete');

COMMENT ON PUBLICATION "user_data" IS 'Primary replication stream for user data';

PUBLICATION — all tables

PUBLICATION all_tables FOR ALL TABLES;
-- emits
CREATE PUBLICATION "all_tables" FOR ALL TABLES;

PUBLICATION — filtered (column list + row filter)

PUBLICATION filtered_orders
    FOR TABLE orders (id, customer_id, status, total)
    WHERE (status != 'draft');
-- emits
CREATE PUBLICATION "filtered_orders"
    FOR TABLE "public"."orders" ("id", "customer_id", "status", "total")
    WHERE (status != 'draft');

SUBSCRIPTION

SUBSCRIPTION replica_users
    CONNECTION 'host=primary.db.internal dbname=myapp user=replicator'
    PUBLICATION user_data
    WITH (enabled = true, copy_data = true);
-- emits
CREATE SUBSCRIPTION "replica_users"
    CONNECTION 'host=primary.db.internal dbname=myapp user=replicator'
    PUBLICATION "user_data"
    WITH (enabled = true, copy_data = true);

Diffing behaviour

ChangeSQLSafety
Add table to publicationALTER PUBLICATION ADD TABLESAFE
Remove table from publicationALTER PUBLICATION DROP TABLESAFE
Change WITH optionsALTER PUBLICATION SETSAFE
Publication owner changedALTER PUBLICATION OWNER TOSAFE
Publication renamed (RENAMED FROM)ALTER PUBLICATION RENAME TOCAUTION
Remove publicationDROP PUBLICATIONDESTRUCTIVE
Change subscription connection/publicationDROP SUBSCRIPTION + CREATE SUBSCRIPTIONDESTRUCTIVE
Subscription owner changedALTER SUBSCRIPTION OWNER TOSAFE
Subscription renamed (RENAMED FROM)ALTER SUBSCRIPTION RENAME TOCAUTION
Remove subscriptionDROP SUBSCRIPTIONDESTRUCTIVE