Hi, with the default configuration improvements so far for 10, it seems to be very easy to setup streaming replication (at least locally):
$ initdb --pgdata=data1 $ pg_ctl --pgdata=data1 start $ pg_basebackup --pgdata=data2 --write-recovery-conf $ sed -i -e 's/^#port.=.5432/port = 5433/' \ > -e 's/^#hot_standby.=.off/hot_standby = on/' \ > data2/postgresql.conf $ pg_ctl --pgdata=data2 start (there might be a case for having hot_standby=on by default, but I think that got discussed elsewhere and is anyway a different thread). However, the above does not use replication slots, and if you want to do so, you get: $ pg_basebackup --pgdata=data2 --write-recovery-conf --slot=pg2 2017-03-19 11:04:37.978 CET [25362] ERROR: replication slot "pg2" does not exist pg_basebackup: could not send replication command "START_REPLICATION": ERROR: replication slot "pg2" does not exist pg_basebackup: child process exited with error 1 pg_basebackup: removing data directory "data2" The error message is clear enough, but I wonder whether people will start writing streaming replication tutorials just glossing over this because it's one more step to run CREATE_REPLICATION_SLOT manually. So I propose the attached tiny patch to just create the slot (if it does not exist already) in pg_basebackup, somewhat similar to what pg_receivewal does, albeit unconditionally, if the user explicitly requested a slot: $ pg_basebackup --pgdata=data2 --write-recovery-conf --slot=pg2 $ echo $? 0 $ psql -c "DROP_REPLICATION_SLOT pg2" "host=127.0.0.1 port=5432 replication=database user=mba dbname=postgres" SELECT $ This would get us somewhat closer to near zero-config replication, in my opinion. Pardon me if that was discussed already and shot down Comments? Michael -- Michael Banck Projektleiter / Senior Berater Tel.: +49 2166 9901-171 Fax: +49 2166 9901-100 Email: michael.ba...@credativ.de credativ GmbH, HRB Mönchengladbach 12080 USt-ID-Nummer: DE204566209 Trompeterallee 108, 41189 Mönchengladbach Geschäftsführung: Dr. Michael Meskes, Jörg Folz, Sascha Heuer
From 8a52b7d8cc6f956fba47465d280581e200ec5239 Mon Sep 17 00:00:00 2001 From: Michael Banck <michael.ba...@credativ.de> Date: Sun, 19 Mar 2017 10:58:13 +0100 Subject: [PATCH] Create replication slot in pg_basebackup if requested and not yet present. If a replication slot is explicitly requested, try to create it before starting to replicate from it. --- src/bin/pg_basebackup/receivelog.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index f415135..0ddb7a6 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -527,6 +527,17 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream) } /* + * Try to create a permanent replication slot if one is specified. Do + * not error out if the slot already exists, other errors are already + * reported by CreateReplicationSlot(). + */ + if (!stream->temp_slot && stream->replication_slot) + { + if (!CreateReplicationSlot(conn, stream->replication_slot, NULL, true, true)) + return false; + } + + /* * initialize flush position to starting point, it's the caller's * responsibility that that's sane. */ -- 2.1.4
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers