diff --git a/doc/src/sgml/ref/pg_createsubscriber.sgml b/doc/src/sgml/ref/pg_createsubscriber.sgml index 2ee6eee9e3..87a9d3db28 100644 --- a/doc/src/sgml/ref/pg_createsubscriber.sgml +++ b/doc/src/sgml/ref/pg_createsubscriber.sgml @@ -353,6 +353,17 @@ PostgreSQL documentation pg_createsubscriber. + + pg_createsubscriber sets up logical + replication with two-phase commit disabled. This means that any + prepared transactions will be replicated at the time + of COMMIT PREPARED, without advance preparation. + Once setup is complete, you can manually drop and re-create the + subscription(s) with + the two_phase + option enabled. + + pg_createsubscriber changes the system identifier using pg_resetwal. It would avoid diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c index 7c94331786..fecf5db365 100644 --- a/src/bin/pg_basebackup/pg_createsubscriber.c +++ b/src/bin/pg_basebackup/pg_createsubscriber.c @@ -823,6 +823,7 @@ check_publisher(const struct LogicalRepInfo *dbinfo) int cur_repslots; int max_walsenders; int cur_walsenders; + int max_prepared_transactions; pg_log_info("checking settings on publisher"); @@ -849,23 +850,12 @@ check_publisher(const struct LogicalRepInfo *dbinfo) * ----------------------------------------------------------------------- */ res = PQexec(conn, - "WITH wl AS " - "(SELECT setting AS wallevel FROM pg_catalog.pg_settings " - "WHERE name = 'wal_level'), " - "total_mrs AS " - "(SELECT setting AS tmrs FROM pg_catalog.pg_settings " - "WHERE name = 'max_replication_slots'), " - "cur_mrs AS " - "(SELECT count(*) AS cmrs " - "FROM pg_catalog.pg_replication_slots), " - "total_mws AS " - "(SELECT setting AS tmws FROM pg_catalog.pg_settings " - "WHERE name = 'max_wal_senders'), " - "cur_mws AS " - "(SELECT count(*) AS cmws FROM pg_catalog.pg_stat_activity " - "WHERE backend_type = 'walsender') " - "SELECT wallevel, tmrs, cmrs, tmws, cmws " - "FROM wl, total_mrs, cur_mrs, total_mws, cur_mws"); + "SELECT pg_catalog.current_setting('wal_level')," + " pg_catalog.current_setting('max_replication_slots')," + " (SELECT count(*) FROM pg_catalog.pg_replication_slots)," + " pg_catalog.current_setting('max_wal_senders')," + " (SELECT count(*) FROM pg_catalog.pg_stat_activity WHERE backend_type = 'walsender')," + " pg_catalog.current_setting('max_prepared_transactions')"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { @@ -879,6 +869,7 @@ check_publisher(const struct LogicalRepInfo *dbinfo) cur_repslots = atoi(PQgetvalue(res, 0, 2)); max_walsenders = atoi(PQgetvalue(res, 0, 3)); cur_walsenders = atoi(PQgetvalue(res, 0, 4)); + max_prepared_transactions = atoi(PQgetvalue(res, 0, 5)); PQclear(res); @@ -887,6 +878,8 @@ check_publisher(const struct LogicalRepInfo *dbinfo) pg_log_debug("publisher: current replication slots: %d", cur_repslots); pg_log_debug("publisher: max_wal_senders: %d", max_walsenders); pg_log_debug("publisher: current wal senders: %d", cur_walsenders); + pg_log_debug("publisher: max_prepared_transactions: %d", + max_prepared_transactions); disconnect_database(conn, false); @@ -914,6 +907,13 @@ check_publisher(const struct LogicalRepInfo *dbinfo) failed = true; } + if (max_prepared_transactions != 0) + { + pg_log_warning("two_phase option will not be enabled for slots"); + pg_log_warning_detail("Subscriptions will be created with the two_phase option disabled. " + "Prepared transactions will be replicated at COMMIT PREPARED."); + } + pg_free(wal_level); if (failed)