Compare commits

..

27 Commits

Author SHA1 Message Date
Ian Barwick
78cc278639 docs: finalize release notes 2022-02-15 13:38:24 +09:00
Ian Barwick
ceb65027c6 Bump version number 2022-02-04 09:08:04 +09:00
Ian Barwick
e6caa14ea2 Bump version number
5.3.1
2022-02-03 14:48:47 +09:00
Ian Barwick
88a11f36ca Add include for pwd.h
This was previously included via the PostgreSQL source, but that
seems to have gone away in recent HEAD builds.
2022-02-03 14:32:18 +09:00
Ian Barwick
7f371b11a5 doc: update version matrix
5.2.1 is the latest release in the 5.2.x series.
2022-02-03 13:30:29 +09:00
Ian Barwick
349eacd4b7 doc: update release notes 2022-02-03 13:29:32 +09:00
Ian Barwick
9f2afe9643 Fix upgrade paths from 4.1 ~ 4.3 to 5.2 and later
A number of C functions were added in releases 4.2 to 4.4; however
these were renamed in 5.3 to prevent naming clashes with other
extensions.

This does however mean that when upgrading from one of the above
versions, the intermediate upgrade steps will attempt to create
SQL functions referencing C functions which no longer exist in
repmgr.so, and hence cause the upgrade to fail.

We can work around this by providing empty upgrade scripts
from these versions to 4.4, which skip the problematic CREATE
FUNCTION commands. The functions will be correctly created in
the 5.2--5.3 upgrade script.
2022-02-03 13:29:25 +09:00
Ian Barwick
356f65531f repmgrd: move connection pointer declaration inside relevant block
As it's used only there and nowhere else.
2022-01-04 12:46:50 +09:00
Ian Barwick
2a7579c770 doc: update release notes 2022-01-04 12:33:30 +09:00
zhouhj43183
820d972d41 repmgrd: ensure potentially open connections are closed
When recovering from degraded state in local node monitoring, in some
cases a new connection was opened to the local node without closing
the old one, which will result in memory leakage.
2022-01-04 12:24:42 +09:00
Ian Barwick
d0add49c84 doc: update repmgr.conf.sample
Minor formatting fix.
2021-12-08 09:52:27 +09:00
Ian Barwick
9a84fa84f9 doc: update repmgr.conf.sample
Remove bogus -W option in "repmgr standby follow" example invocation
for the "follow_command" parameter.

The option (which corresponds to "--no-wait") is not used by
"repmgr standby follow".

Per report from Jimmy Angelakos.
2021-12-08 09:52:22 +09:00
Ian Barwick
ff2c56f5cb doc: fix typo 2021-11-05 09:14:19 +09:00
Ian Barwick
3b860bad80 Removed temporary include file workaround 2021-10-29 15:44:16 +09:00
Ian Barwick
70c79aeaec Add dummy include file
This is a workaround required to facilitate Debian package builds
against PostgreSQL Extended.
2021-10-12 16:50:33 +09:00
Ian Barwick
afd876377c doc: repmgr 5.2 is no longer supported. 2021-10-12 14:05:41 +09:00
Ian Barwick
277910cb31 Fix version number 2021-10-12 13:50:22 +09:00
Ian Barwick
9554154677 doc: update version matrix 2021-10-12 13:49:28 +09:00
Ian Barwick
2bbfb5daa0 doc: update release notes 2021-10-12 10:13:26 +09:00
Ian Barwick
82b0e85a66 Bump version number 2021-10-12 10:11:27 +09:00
Ian Barwick
3320eb0983 repmgrd: improve node activation at startup
Commit 79d1f00 modified repmgrd to automatically set an inactive node
to "active" at startup.

However we need to avoid doing that for cases where the node role has
changed (e.g. a former primary was recloned as a standby) but the node
record was not updated.
2021-10-11 14:39:14 +09:00
Ian Barwick
7862941300 repmgrd: add %p event notification parameter for "repmgrd_failover_promote"
This enables an event notification script to identify the former primary
node.
2021-09-28 10:25:45 +09:00
Ian Barwick
f152fc3016 Add --repmgrd option to "repmgr node check"
This provides a simple way for checking whether the node's repmgrd is
running.

GitHub #719.
2021-09-28 09:46:54 +09:00
Ian Barwick
9c260e605d Update Makefile 2021-09-16 17:17:20 +09:00
Ian Barwick
7ad06530e4 doc: update 5.3.0 release notes 2021-09-16 17:15:58 +09:00
Ian Barwick
c787273f91 Add extension script for unpackaged upgrades to 5.3 2021-09-16 13:55:56 +09:00
Ian Barwick
d40055c8dd doc: update 5.3.0 release notes 2021-09-16 13:42:34 +09:00
40 changed files with 836 additions and 1596 deletions

View File

@@ -1,37 +0,0 @@
name: SonarQube Scan
on:
pull_request:
push:
branches: [ master ]
workflow_dispatch:
jobs:
sonarQube:
name: SonarQube-Job
runs-on: ubuntu-latest
steps:
- name: Checkout source repo
uses: actions/checkout@v1
with:
ref: '${{ github.head_ref }}'
- name: Checkout GitHub Action Repo
uses: actions/checkout@master
with:
repository: EnterpriseDB/edb-github-actions.git
ref: master
token: ${{ secrets.GH_SLONIK }}
path: .github/actions/edb-github-actions
- name: SonarQube Scan
uses: ./.github/actions/edb-github-actions/sonarqube
with:
REPO_NAME: '${{github.event.repository.name}}'
SONAR_PROJECT_KEY: EnterpriseDB_repmgr
SONAR_URL: '${{secrets.SONARQUBE_URL}}'
SONAR_LOGIN: '${{secrets.SONARQUBE_LOGIN}}'
PULL_REQUEST_KEY: '${{github.event.number}}'
PULL_REQUEST_BRANCH: '${{github.head_ref}}'
PULL_REQUEST_BASE_BRANCH: '${{github.base_ref}}'
REPO_DEFAULT_BRANCH: '${{github.event.repository.default_branch}}'
REPO_EXCLUDE_FILES: '*properties*,**/src/test/**/*,**/*.sql,**/docs/**/*,**/*/*.java'

View File

@@ -1,18 +0,0 @@
#!/bin/bash
DEBIAN_FRONTEND=noninteractive sudo apt-get -y install debhelper curl autoconf zlib1g-dev \
libedit-dev libxml2-dev libxslt1-dev libkrb5-dev libssl-dev libpam0g-dev systemtap-sdt-dev \
libselinux1-dev build-essential bison apt-utils lsb-release devscripts \
software-properties-common git shellcheck flex
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install libpq-dev postgresql-13 postgresql-server-dev-13
./configure
export PG_CONFIG=/usr/bin/pg_config
/home/buildfarm/sonar/depends/build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir build_wrapper_output_directory make

18
HISTORY
View File

@@ -1,19 +1,5 @@
5.3.3 2022-10-17 5.3.1 2022-??-??
Support for PostgreSQL added
repmgrd: ensure event notification script is called for event
"repmgrd_upstream_disconnect"; GitHub #760 (Ian)
5.3.2 2022-05-25
standby clone: don't error out if unable to determine cluster size (Ian)
node check: fix --downstream --nagios output; GitHub #749 (Ian)
repmgrd: ensure witness node marked active (hslightdb)
repmgrd: improve walsender disable check (Ian)
general: ensure replication slots can be dropped by a
replication-only user (Ian)
5.3.1 2022-02-15
repmgrd: fixes for potential connection leaks (hslightdb) repmgrd: fixes for potential connection leaks (hslightdb)
repmgr: fix upgrade path from repmgr 4.2 and 4.3 to repmgr 5.3 (Ian)
5.3.0 2021-10-12 5.3.0 2021-10-12
standby switchover: improve handling of node rejoin failure (Ian) standby switchover: improve handling of node rejoin failure (Ian)
@@ -74,7 +60,7 @@
"standby clone" (Ian) "standby clone" (Ian)
repmgr: add --upstream option to "node check" repmgr: add --upstream option to "node check"
repmgr: report error code on follow/rejoin failure due to non-available repmgr: report error code on follow/rejoin failure due to non-available
replication slot (Ian) 0 replication slot (Ian)
repmgr: ensure "node rejoin" checks for available replication slots (Ian) repmgr: ensure "node rejoin" checks for available replication slots (Ian)
repmgr: improve "standby switchover" completion checks (Ian) repmgr: improve "standby switchover" completion checks (Ian)
repmgr: add replication configuration file ownership check to repmgr: add replication configuration file ownership check to

View File

@@ -30,9 +30,7 @@ DATA = \
repmgr--5.1--5.2.sql \ repmgr--5.1--5.2.sql \
repmgr--5.2.sql \ repmgr--5.2.sql \
repmgr--5.2--5.3.sql \ repmgr--5.2--5.3.sql \
repmgr--5.3.sql \ repmgr--5.3.sql
repmgr--5.3--5.4.sql \
repmgr--5.4.sql
REGRESS = repmgr_extension REGRESS = repmgr_extension
@@ -81,10 +79,10 @@ configfile-scan.c: configfile-scan.l
$(REPMGR_CLIENT_OBJS): repmgr-client.h repmgr_version.h $(REPMGR_CLIENT_OBJS): repmgr-client.h repmgr_version.h
repmgr: $(REPMGR_CLIENT_OBJS) repmgr: $(REPMGR_CLIENT_OBJS)
$(CC) $(CFLAGS) $(REPMGR_CLIENT_OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $(REPMGR_CLIENT_OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) -o $@$(X)
repmgrd: $(REPMGRD_OBJS) repmgrd: $(REPMGRD_OBJS)
$(CC) $(CFLAGS) $(REPMGRD_OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $(REPMGRD_OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) -o $@$(X)
$(REPMGR_CLIENT_OBJS): $(HEADERS) $(REPMGR_CLIENT_OBJS): $(HEADERS)
$(REPMGRD_OBJS): $(HEADERS) $(REPMGRD_OBJS): $(HEADERS)

View File

@@ -7,8 +7,8 @@ replication capabilities with utilities to set up standby servers, monitor
replication, and perform administrative tasks such as failover or switchover replication, and perform administrative tasks such as failover or switchover
operations. operations.
The most recent `repmgr` version (5.3.2) supports all PostgreSQL versions from The most recent `repmgr` version (5.2.1) supports all PostgreSQL versions from
9.5 to 14. PostgreSQL 9.4 is also supported, with some restrictions. 9.5 to 13. PostgreSQL 9.4 is also supported, with some restrictions.
`repmgr` is distributed under the GNU GPL 3 and maintained by EnterpriseDB. `repmgr` is distributed under the GNU GPL 3 and maintained by EnterpriseDB.
@@ -19,6 +19,14 @@ The full `repmgr` documentation is available here:
> [repmgr documentation](https://repmgr.org/docs/current/index.html) > [repmgr documentation](https://repmgr.org/docs/current/index.html)
The old `README` file for `repmgr` 3.x is available here:
> https://github.com/EnterpriseDB/repmgr/blob/REL3_3_STABLE/README.md
Note that the `repmgr` 3.x series is no longer supported and contains known bugs;
please upgrade to the [current repmgr version](https://repmgr.org/docs/current/appendix-release-notes.html)
as soon as possible.
Versions Versions
-------- --------

18
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for repmgr 5.4.0. # Generated by GNU Autoconf 2.69 for repmgr 5.3.0.
# #
# Report bugs to <repmgr@googlegroups.com>. # Report bugs to <repmgr@googlegroups.com>.
# #
@@ -582,8 +582,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='repmgr' PACKAGE_NAME='repmgr'
PACKAGE_TARNAME='repmgr' PACKAGE_TARNAME='repmgr'
PACKAGE_VERSION='5.4.0' PACKAGE_VERSION='5.3.0'
PACKAGE_STRING='repmgr 5.4.0' PACKAGE_STRING='repmgr 5.3.0'
PACKAGE_BUGREPORT='repmgr@googlegroups.com' PACKAGE_BUGREPORT='repmgr@googlegroups.com'
PACKAGE_URL='https://repmgr.org/' PACKAGE_URL='https://repmgr.org/'
@@ -1181,7 +1181,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures repmgr 5.4.0 to adapt to many kinds of systems. \`configure' configures repmgr 5.3.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1242,7 +1242,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of repmgr 5.4.0:";; short | recursive ) echo "Configuration of repmgr 5.3.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1316,7 +1316,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
repmgr configure 5.4.0 repmgr configure 5.3.0
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1335,7 +1335,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by repmgr $as_me 5.4.0, which was It was created by repmgr $as_me 5.3.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@@ -2487,7 +2487,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by repmgr $as_me 5.4.0, which was This file was extended by repmgr $as_me 5.3.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -2550,7 +2550,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
repmgr config.status 5.4.0 repmgr config.status 5.3.0
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,4 +1,4 @@
AC_INIT([repmgr], [5.4.0], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/]) AC_INIT([repmgr], [5.3.1], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/])
AC_COPYRIGHT([Copyright (c) 2010-2021, EnterpriseDB Corporation]) AC_COPYRIGHT([Copyright (c) 2010-2021, EnterpriseDB Corporation])

140
dbutils.c
View File

@@ -61,8 +61,6 @@ static ReplSlotStatus _verify_replication_slot(PGconn *conn, char *slot_name, PQ
static bool _create_event(PGconn *conn, t_configuration_options *options, int node_id, char *event, bool successful, char *details, t_event_info *event_info, bool send_notification); static bool _create_event(PGconn *conn, t_configuration_options *options, int node_id, char *event, bool successful, char *details, t_event_info *event_info, bool send_notification);
static NodeAttached _is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state, bool quiet);
/* /*
* This provides a standardized way of logging database errors. Note * This provides a standardized way of logging database errors. Note
* that the provided PGconn can be a normal or a replication connection; * that the provided PGconn can be a normal or a replication connection;
@@ -1291,16 +1289,21 @@ get_cluster_size(PGconn *conn, char *size)
initPQExpBuffer(&query); initPQExpBuffer(&query);
appendPQExpBufferStr(&query, appendPQExpBufferStr(&query,
"SELECT pg_catalog.pg_size_pretty(pg_catalog.sum(pg_catalog.pg_database_size(oid))::bigint) " "SELECT pg_catalog.pg_size_pretty(pg_catalog.sum(pg_catalog.pg_database_size(oid))::bigint) "
" FROM pg_catalog.pg_database "); " FROM pg_catalog.pg_database ");
log_verbose(LOG_DEBUG, "get_cluster_size():\n%s", query.data); log_verbose(LOG_DEBUG, "get_cluster_size():\n%s", query.data);
res = PQexec(conn, query.data); res = PQexec(conn, query.data);
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
log_db_error(conn, query.data, _("get_cluster_size(): unable to execute query"));
success = false; success = false;
}
else else
{
snprintf(size, MAXLEN, "%s", PQgetvalue(res, 0, 0)); snprintf(size, MAXLEN, "%s", PQgetvalue(res, 0, 0));
}
termPQExpBuffer(&query); termPQExpBuffer(&query);
PQclear(res); PQclear(res);
@@ -1823,30 +1826,6 @@ get_timeline_history(PGconn *repl_conn, TimeLineID tli)
} }
pid_t
get_wal_receiver_pid(PGconn *conn)
{
PGresult *res = NULL;
pid_t wal_receiver_pid = UNKNOWN_PID;
res = PQexec(conn, "SELECT repmgr.get_wal_receiver_pid()");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
log_error(_("unable to execute \"SELECT repmgr.get_wal_receiver_pid()\""));
log_detail("%s", PQerrorMessage(conn));
}
else if (!PQgetisnull(res, 0, 0))
{
wal_receiver_pid = atoi(PQgetvalue(res, 0, 0));
}
PQclear(res);
return wal_receiver_pid;
}
/* =============================== */ /* =============================== */
/* user/role information functions */ /* user/role information functions */
/* =============================== */ /* =============================== */
@@ -1888,42 +1867,6 @@ can_execute_pg_promote(PGconn *conn)
} }
/*
* Determine if the user associated with the current connection
* has sufficient permissions to disable the walsender
*/
bool
can_disable_walsender(PGconn *conn)
{
/*
* Requires PostgreSQL 9.5 or later, because ALTER SYSTEM
*/
if (PQserverVersion(conn) < 90500)
{
log_warning(_("\"standby_disconnect_on_failover\" specified, but not available for this PostgreSQL version"));
/* TODO: format server version */
log_detail(_("available from PostgreSQL 9.5; this PostgreSQL version is %i"), PQserverVersion(conn));
return false;
}
/*
* Superusers can do anything
*/
if (is_superuser_connection(conn, NULL) == true)
return true;
/*
* As of PostgreSQL 14, it is not possible for a non-superuser
* to execute ALTER SYSTEM, so further checks are superfluous.
* This will need modifying for PostgreSQL 15.
*/
log_warning(_("\"standby_disconnect_on_failover\" specified, but repmgr user is not a superuser"));
log_detail(_("superuser permission required to disable standbys on failover"));
return false;
}
/* /*
* Determine if the user associated with the current connection is * Determine if the user associated with the current connection is
* a member of the "pg_monitor" default role, or optionally one * a member of the "pg_monitor" default role, or optionally one
@@ -2139,13 +2082,7 @@ server_in_exclusive_backup_mode(PGconn *conn)
{ {
BackupState backup_state = BACKUP_STATE_UNKNOWN; BackupState backup_state = BACKUP_STATE_UNKNOWN;
const char *sqlquery = "SELECT pg_catalog.pg_is_in_backup()"; const char *sqlquery = "SELECT pg_catalog.pg_is_in_backup()";
PGresult *res = NULL; PGresult *res = PQexec(conn, sqlquery);
/* Exclusive backup removed from PostgreSQL 15 */
if (PQserverVersion(conn) >= 150000)
return BACKUP_STATE_NO_BACKUP;
res = PQexec(conn, sqlquery);
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
@@ -2309,6 +2246,29 @@ repmgrd_pause(PGconn *conn, bool pause)
return success; return success;
} }
pid_t
get_wal_receiver_pid(PGconn *conn)
{
PGresult *res = NULL;
pid_t wal_receiver_pid = UNKNOWN_PID;
res = PQexec(conn, "SELECT repmgr.get_wal_receiver_pid()");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
log_error(_("unable to execute \"SELECT repmgr.get_wal_receiver_pid()\""));
log_detail("%s", PQerrorMessage(conn));
}
else if (!PQgetisnull(res, 0, 0))
{
wal_receiver_pid = atoi(PQgetvalue(res, 0, 0));
}
PQclear(res);
return wal_receiver_pid;
}
int int
repmgrd_get_upstream_node_id(PGconn *conn) repmgrd_get_upstream_node_id(PGconn *conn)
@@ -4616,17 +4576,17 @@ drop_replication_slot_replprot(PGconn *repl_conn, char *slot_name)
initPQExpBuffer(&query); initPQExpBuffer(&query);
appendPQExpBuffer(&query, appendPQExpBuffer(&query,
"DROP_REPLICATION_SLOT %s;", "DROP_REPLICATION_SLOT %s",
slot_name); slot_name);
log_verbose(LOG_DEBUG, "drop_replication_slot_replprot():\n %s", query.data); log_verbose(LOG_DEBUG, "drop_replication_slot_replprot():\n %s", query.data);
res = PQexec(repl_conn, query.data); res = PQexec(repl_conn, query.data);
if (PQresultStatus(res) != PGRES_TUPLES_OK || !PQntuples(res)) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
log_db_error(repl_conn, query.data, log_db_error(repl_conn, query.data,
_("drop_replication_slot_replprot(): unable to drop replication slot \"%s\""), _("drop_replication_slot_sql(): unable to drop replication slot \"%s\""),
slot_name); slot_name);
success = false; success = false;
@@ -5744,7 +5704,7 @@ get_node_timeline(PGconn *conn, char *timeline_id_str)
TimeLineID timeline_id = UNKNOWN_TIMELINE_ID; TimeLineID timeline_id = UNKNOWN_TIMELINE_ID;
/* /*
* pg_control_checkpoint() was introduced in PostgreSQL 9.6 * PG_control_checkpoint() was introduced in PostgreSQL 9.6
*/ */
if (PQserverVersion(conn) >= 90600) if (PQserverVersion(conn) >= 90600)
{ {
@@ -5832,19 +5792,6 @@ get_node_replication_stats(PGconn *conn, t_node_info *node_info)
NodeAttached NodeAttached
is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state) is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state)
{ {
return _is_downstream_node_attached(conn, node_name, node_state, false);
}
NodeAttached
is_downstream_node_attached_quiet(PGconn *conn, char *node_name, char **node_state)
{
return _is_downstream_node_attached(conn, node_name, node_state, true);
}
NodeAttached
_is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state, bool quiet)
{
PQExpBufferData query; PQExpBufferData query;
PGresult *res = NULL; PGresult *res = NULL;
@@ -5879,12 +5826,9 @@ _is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state, b
*/ */
if (PQntuples(res) > 1) if (PQntuples(res) > 1)
{ {
if (quiet == false) log_error(_("multiple entries with \"application_name\" set to \"%s\" found in \"pg_stat_replication\""),
{ node_name);
log_error(_("multiple entries with \"application_name\" set to \"%s\" found in \"pg_stat_replication\""), log_hint(_("verify that a unique node name is configured for each node"));
node_name);
log_hint(_("verify that a unique node name is configured for each node"));
}
PQclear(res); PQclear(res);
@@ -5893,8 +5837,7 @@ _is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state, b
if (PQntuples(res) == 0) if (PQntuples(res) == 0)
{ {
if (quiet == false) log_warning(_("node \"%s\" not found in \"pg_stat_replication\""), node_name);
log_warning(_("node \"%s\" not found in \"pg_stat_replication\""), node_name);
PQclear(res); PQclear(res);
@@ -5920,10 +5863,9 @@ _is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state, b
if (strcmp(state, "streaming") != 0) if (strcmp(state, "streaming") != 0)
{ {
if (quiet == false) log_warning(_("node \"%s\" attached in state \"%s\""),
log_warning(_("node \"%s\" attached in state \"%s\""), node_name,
node_name, state);
state);
PQclear(res); PQclear(res);

View File

@@ -450,11 +450,9 @@ int get_ready_archive_files(PGconn *conn, const char *data_directory);
bool identify_system(PGconn *repl_conn, t_system_identification *identification); bool identify_system(PGconn *repl_conn, t_system_identification *identification);
uint64 system_identifier(PGconn *conn); uint64 system_identifier(PGconn *conn);
TimeLineHistoryEntry *get_timeline_history(PGconn *repl_conn, TimeLineID tli); TimeLineHistoryEntry *get_timeline_history(PGconn *repl_conn, TimeLineID tli);
pid_t get_wal_receiver_pid(PGconn *conn);
/* user/role information functions */ /* user/role information functions */
bool can_execute_pg_promote(PGconn *conn); bool can_execute_pg_promote(PGconn *conn);
bool can_disable_walsender(PGconn *conn);
bool connection_has_pg_monitor_role(PGconn *conn, const char *subrole); bool connection_has_pg_monitor_role(PGconn *conn, const char *subrole);
bool is_replication_role(PGconn *conn, char *rolname); bool is_replication_role(PGconn *conn, char *rolname);
bool is_superuser_connection(PGconn *conn, t_connection_user *userinfo); bool is_superuser_connection(PGconn *conn, t_connection_user *userinfo);
@@ -469,6 +467,7 @@ pid_t repmgrd_get_pid(PGconn *conn);
bool repmgrd_is_running(PGconn *conn); bool repmgrd_is_running(PGconn *conn);
bool repmgrd_is_paused(PGconn *conn); bool repmgrd_is_paused(PGconn *conn);
bool repmgrd_pause(PGconn *conn, bool pause); bool repmgrd_pause(PGconn *conn, bool pause);
pid_t get_wal_receiver_pid(PGconn *conn);
int repmgrd_get_upstream_node_id(PGconn *conn); int repmgrd_get_upstream_node_id(PGconn *conn);
bool repmgrd_set_upstream_node_id(PGconn *conn, int node_id); bool repmgrd_set_upstream_node_id(PGconn *conn, int node_id);
@@ -598,7 +597,6 @@ int get_replication_lag_seconds(PGconn *conn);
TimeLineID get_node_timeline(PGconn *conn, char *timeline_id_str); TimeLineID get_node_timeline(PGconn *conn, char *timeline_id_str);
void get_node_replication_stats(PGconn *conn, t_node_info *node_info); void get_node_replication_stats(PGconn *conn, t_node_info *node_info);
NodeAttached is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state); NodeAttached is_downstream_node_attached(PGconn *conn, char *node_name, char **node_state);
NodeAttached is_downstream_node_attached_quiet(PGconn *conn, char *node_name, char **node_state);
void set_upstream_last_seen(PGconn *conn, int upstream_node_id); void set_upstream_last_seen(PGconn *conn, int upstream_node_id);
int get_upstream_last_seen(PGconn *conn, t_server_type node_type); int get_upstream_last_seen(PGconn *conn, t_server_type node_type);

View File

@@ -249,16 +249,16 @@
For a standby which has been manually cloned or recovered from an external For a standby which has been manually cloned or recovered from an external
backup manager such as Barman, the command backup manager such as Barman, the command
<command><link linkend="repmgr-standby-clone">repmgr standby clone --replication-conf-only</link></command> <command><link linkend="repmgr-standby-clone">repmgr standby clone --replication-conf-only</link></command>
can be used to create the correct replication configuration file for can be used to create the correct <filename>recovery.conf</filename> file for
use with &repmgr; (and will create a replication slot if required). Once this has been done, use with &repmgr; (and will create a replication slot if required). Once this has been done,
<link linkend="repmgr-standby-register">register the node</link> as usual. <link linkend="repmgr-standby-register">register the node</link> as usual.
</para> </para>
</sect2> </sect2>
<sect2 id="faq-repmgr-recovery-conf" > <sect2 id="faq-repmgr-recovery-conf" >
<title>What does &repmgr; write in the replication configuration, and what options can be set there?</title> <title>What does &repmgr; write in <filename>recovery.conf</filename>, and what options can be set there?</title>
<para> <para>
See section <link linkend="repmgr-standby-clone-recovery-conf">Customising replication configuration</link>. See section <link linkend="repmgr-standby-clone-recovery-conf">Customising recovery.conf</link>.
</para> </para>
</sect2> </sect2>
@@ -366,11 +366,11 @@
</para> </para>
</sect2> </sect2>
<sect2 id="faq-repmgr-recovery-conf-quoted-values" xreflabel="Quoted values in replication.conf"> <sect2 id="faq-repmgr-recovery-conf-quoted-values" xreflabel="Quoted values in recovery.conf">
<title>Why are some values in <filename>recovery.conf</filename> (PostgreSQL 11 and earlier) surrounded by pairs of single quotes?</title> <title>Why are some values in <filename>recovery.conf</filename> surrounded by pairs of single quotes?</title>
<para> <para>
This is to ensure that user-supplied values which are written as parameter values in <filename>recovery.conf</filename> This is to ensure that user-supplied values which are written as parameter values in <filename>recovery.conf</filename>
are escaped correctly and do not cause errors when the file is parsed. are escaped correctly and do not cause errors when <filename>recovery.conf</filename> is parsed.
</para> </para>
<para> <para>
The escaping is performed by an internal PostgreSQL routine, which leaves strings consisting The escaping is performed by an internal PostgreSQL routine, which leaves strings consisting
@@ -419,9 +419,9 @@
<para> <para>
&repmgrd; can monitor delayed standbys - those set up with &repmgrd; can monitor delayed standbys - those set up with
<varname>recovery_min_apply_delay</varname> set to a non-zero value <varname>recovery_min_apply_delay</varname> set to a non-zero value
in the replication configuration. However &repmgrd; does not currently in <filename>recovery.conf</filename> - but as it's not currently possible
consider this setting, and therefore may not be able to properly evaluate to directly examine the value applied to the standby, &repmgrd;
the node as a promotion candidate. may not be able to properly evaluate the node as a promotion candidate.
</para> </para>
<para> <para>
We recommend that delayed standbys are explicitly excluded from promotion We recommend that delayed standbys are explicitly excluded from promotion

View File

@@ -50,18 +50,18 @@
<title>CentOS repositories</title> <title>CentOS repositories</title>
<para> <para>
&repmgr; packages are available from the public EDB repository, and also the &repmgr; packages are available from the public 2ndQuadrant repository, and also the
PostgreSQL community repository. The EDB repository is updated immediately PostgreSQL community repository. The 2ndQuadrant repository is updated immediately
after each &repmgr; release. after each &repmgr; release.
</para> </para>
<table id="centos-2ndquadrant-repository"> <table id="centos-2ndquadrant-repository">
<title>EDB public repository</title> <title>2ndQuadrant public repository</title>
<tgroup cols="2"> <tgroup cols="2">
<tbody> <tbody>
<row> <row>
<entry>Repository URL:</entry> <entry>Repository URL:</entry>
<entry><ulink url="https://dl.enterprisedb.com/">https://dl.enterprisedb.com/</ulink></entry> <entry><ulink url="https://dl.2ndquadrant.com/">https://dl.2ndquadrant.com/</ulink></entry>
</row> </row>
<row> <row>
<entry>Repository documentation:</entry> <entry>Repository documentation:</entry>
@@ -252,7 +252,7 @@
</indexterm> </indexterm>
<para> <para>
&repmgr; <literal>.deb</literal> packages are provided by EDB as well as the &repmgr; <literal>.deb</literal> packages are provided by 2ndQuadrant as well as the
PostgreSQL Community APT repository, and are available for each community-supported PostgreSQL Community APT repository, and are available for each community-supported
PostgreSQL version, currently supported Debian releases, and currently supported PostgreSQL version, currently supported Debian releases, and currently supported
Ubuntu LTS releases. Ubuntu LTS releases.
@@ -262,12 +262,12 @@
<title>APT repositories</title> <title>APT repositories</title>
<table id="apt-2ndquadrant-repository"> <table id="apt-2ndquadrant-repository">
<title>EDB public repository</title> <title>2ndQuadrant public repository</title>
<tgroup cols="2"> <tgroup cols="2">
<tbody> <tbody>
<row> <row>
<entry>Repository URL:</entry> <entry>Repository URL:</entry>
<entry><ulink url="https://dl.enterprisedb.com/">https://dl.enterprisedb.com/</ulink></entry> <entry><ulink url="https://dl.2ndquadrant.com/">https://dl.2ndquadrant.com/</ulink></entry>
</row> </row>
<row> <row>
<entry>Repository documentation:</entry> <entry>Repository documentation:</entry>
@@ -401,7 +401,7 @@
</indexterm> </indexterm>
<para> <para>
For testing new features and bug fixes, from time to time EDB provides For testing new features and bug fixes, from time to time 2ndQuadrant provides
so-called &quot;snapshot packages&quot; via its public repository. These packages so-called &quot;snapshot packages&quot; via its public repository. These packages
are built from the &repmgr; source at a particular point in time, and are not formal are built from the &repmgr; source at a particular point in time, and are not formal
releases. releases.
@@ -413,22 +413,22 @@
</para> </para>
</note> </note>
<para> <para>
To install a snapshot package, it's necessary to install the EDB public snapshot repository, To install a snapshot package, it's necessary to install the 2ndQuadrant public snapshot repository,
following the instructions here: <ulink url="https://dl.enterprisedb.com/default/release/site/">https://dl.enterprisedb.com/default/release/site/</ulink> but replace <literal>release</literal> with <literal>snapshot</literal> following the instructions here: <ulink url="https://dl.2ndquadrant.com/default/release/site/">https://dl.2ndquadrant.com/default/release/site/</ulink> but replace <literal>release</literal> with <literal>snapshot</literal>
in the appropriate URL. in the appropriate URL.
</para> </para>
<para> <para>
For example, to install the snapshot RPM repository for PostgreSQL 9.6, execute (as <literal>root</literal>): For example, to install the snapshot RPM repository for PostgreSQL 9.6, execute (as <literal>root</literal>):
<programlisting> <programlisting>
curl https://dl.enterprisedb.com/default/snapshot/get/9.6/rpm | bash</programlisting> curl https://dl.2ndquadrant.com/default/snapshot/get/9.6/rpm | bash</programlisting>
or as a normal user with root sudo access: or as a normal user with root sudo access:
<programlisting> <programlisting>
curl https://dl.enterprisedb.com/default/snapshot/get/9.6/rpm | sudo bash</programlisting> curl https://dl.2ndquadrant.com/default/snapshot/get/9.6/rpm | sudo bash</programlisting>
</para> </para>
<para> <para>
Alternatively you can browse the repository here: Alternatively you can browse the repository here:
<ulink url="https://dl.enterprisedb.com/default/snapshot/browse/">https://dl.enterprisedb.com/default/snapshot/browse/</ulink>. <ulink url="https://dl.2ndquadrant.com/default/snapshot/browse/">https://dl.2ndquadrant.com/default/snapshot/browse/</ulink>.
</para> </para>
<para> <para>
Once the repository is installed, installing or updating &repmgr; will result in the latest snapshot Once the repository is installed, installing or updating &repmgr; will result in the latest snapshot
@@ -493,6 +493,32 @@ repmgr96-4.1.1-0.0git320.g5113ab0.1.el7.x86_64.rpm</programlisting>
yum install repmgr96-4.0.6-1.rhel6</programlisting> yum install repmgr96-4.0.6-1.rhel6</programlisting>
</para> </para>
<sect3 id="packages-old-versions-rhel-centos-repmgr3">
<title>repmgr 3 packages</title>
<para>
Old &repmgr; 3 RPM packages (<literal>3.2</literal> and later) can be retrieved from the
(deprecated) 2ndQuadrant repository at
<ulink url="http://packages.2ndquadrant.com/repmgr/yum/">http://packages.2ndquadrant.com/repmgr/yum/</ulink>
by installing the appropriate repository RPM:
</para>
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<simpara>
<ulink url="http://packages.2ndquadrant.com/repmgr/yum-repo-rpms/repmgr-fedora-1.0-1.noarch.rpm">http://packages.2ndquadrant.com/repmgr/yum-repo-rpms/repmgr-fedora-1.0-1.noarch.rpm</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
<ulink url="http://packages.2ndquadrant.com/repmgr/yum-repo-rpms/repmgr-rhel-1.0-1.noarch.rpm">http://packages.2ndquadrant.com/repmgr/yum-repo-rpms/repmgr-rhel-1.0-1.noarch.rpm</ulink>
</simpara>
</listitem>
</itemizedlist>
</sect3>
</sect2> </sect2>
</sect1> </sect1>

View File

@@ -15,109 +15,13 @@
See also: <xref linkend="upgrading-repmgr"/> See also: <xref linkend="upgrading-repmgr"/>
</para> </para>
<!-- remember to update the release date in ../repmgr_version.h.in --> <!-- remember to update the release date in ../repmgr_version.h.in -->
<sect1 id="release-5.3.3">
<title id="release-current">Release 5.3.3</title>
<para><emphasis>Mon 17 October, 2022</emphasis></para>
<para>
&repmgr; 5.3.3 is a minor release providing support for
<ulink url="https://www.postgresql.org/docs/15/release-15.html">PostgreSQL 15</ulink>
and a &repmgrd; bug fix.
</para>
<para>
If upgrading from an earlier &repmgr; version, any running &repmgrd; instances should be restarted.
</para>
<para>
If upgrading from &repmgr; 5.2.1 or earlier, a PostgreSQL restart <emphasis>is</emphasis> required.
</para>
<sect2>
<title>Bug fixes</title>
<para>
<itemizedlist>
<listitem>
<para>
&repmgrd;: ensure <link linkend="event-notifications">event notification</link> script is called for event
<literal>repmgrd_upstream_disconnect</literal>. GitHub #760.
</para>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
<sect1 id="release-5.3.2">
<title>Release 5.3.2</title>
<para><emphasis>Wed 25 May, 2022</emphasis></para>
<para>
&repmgr; 5.3.2 is a minor release.
</para>
<para>
Any running &repmgrd; instances should be restarted following this upgrade.
</para>
<para>
If upgrading from &repmgr; 5.2.1 or earlier, a PostgreSQL restart <emphasis>is</emphasis> required.
</para>
<sect2>
<title>Bug fixes</title>
<para>
<itemizedlist>
<listitem>
<para>
<command><link linkend="repmgr-node-status">repmgr node status</link></command>:
fix output with <option>--downstream</option> <option>--nagios</option> option combination.
GitHub #749.
</para>
</listitem>
<listitem>
<para>
<command><link linkend="repmgr-standby-clone">repmgr standby clone</link></command>:
don't treat inability to determine the cluster size as a fatal error.
</para>
<para>
The cluster size is displayed for informational purposes and is not essential
for execution of the clone operation. As the &repmgr; user may not have permissions
for all databases in the cluster, ignore the cluster size query if it fails.
</para>
</listitem>
<listitem>
<para>
&repmgrd;: ensure the witness node record on the primary is always marked
as <literal>active</literal> if previously marked <literal>inactive</literal>.
GitHub #754.
</para>
</listitem>
<listitem>
<para>
&repmgrd;: if <varname>standby_disconnect_on_failover</varname> is set, verify
&repmgr; is a superuser before attempting to disable the WAL receiver.
</para>
</listitem>
<listitem>
<para>
If the &repmgr; user is a non-superuser, and a replication-only user exists,
ensure redundant replication slots are dropped correctly even
if the <option>-S/--superuser</option> option is not provided.
</para>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
<sect1 id="release-5.3.1"> <sect1 id="release-5.3.1">
<title>Release 5.3.1</title> <title id="release-current">Release 5.3.1</title>
<para><emphasis>Tue 15 February, 2022</emphasis></para> <para><emphasis>Tue 15 February, 2022</emphasis></para>
<para> <para>
&repmgr; 5.3.1 is a minor release. &repmgr; 5.3.1 is a minor release.
</para> </para>
<para>
If &repmgrd; is in use, it should be restarted on all nodes where it is running.
</para>
<para>
If upgrading from &repmgr; 5.2.1 or earlier, a PostgreSQL restart <emphasis>is</emphasis> required.
</para>
<sect2> <sect2>
<title>Bug fixes</title> <title>Bug fixes</title>
<para> <para>
@@ -152,11 +56,6 @@
This release provides support for <ulink url="https://www.postgresql.org/docs/14/release-14.html">PostgreSQL 14</ulink>, This release provides support for <ulink url="https://www.postgresql.org/docs/14/release-14.html">PostgreSQL 14</ulink>,
released in September 2021. released in September 2021.
</para> </para>
<para>
Note that this release includes changes to the &repmgr; shared library module, meaning a
PostgreSQL restart <emphasis>is</emphasis> required on all nodes where &repmgr; is installed.
</para>
<sect2> <sect2>
<title>Improvements</title> <title>Improvements</title>
<para> <para>
@@ -243,7 +142,8 @@
risk of clashes with other shared libraries. risk of clashes with other shared libraries.
</para> </para>
<para> <para>
This does not affect user-facing SQL functions. Howe This does not affect user-facing SQL functions. However an upgrade
of the installed extension version is required.
</para> </para>
</listitem> </listitem>

View File

@@ -7,13 +7,13 @@
</indexterm> </indexterm>
<para> <para>
<ulink url="https://www.enterprisedb.com/">EDB</ulink> provides 24x7 <ulink url="https://2ndquadrant.com/">2ndQuadrant</ulink> provides 24x7
production support for &repmgr; and other PostgreSQL production support for &repmgr; and other PostgreSQL
products, including configuration assistance, installation products, including configuration assistance, installation
verification and training for running a robust replication cluster. verification and training for running a robust replication cluster.
</para> </para>
<para> <para>
For further details see: <ulink url="https://www.enterprisedb.com/support/postgresql-support-overview-get-the-most-out-of-postgresql">Support Center</ulink> For further details see: <ulink url="https://2ndquadrant.com/en/support/">https://2ndquadrant.com/en/support/</ulink>
</para> </para>
<para> <para>

View File

@@ -15,7 +15,7 @@
<para> <para>
<xref linkend="repmgr-standby-clone"/> can use <xref linkend="repmgr-standby-clone"/> can use
<ulink url="https://www.enterprisedb.com/">EDB</ulink>'s <ulink url="https://www.2ndquadrant.com/">2ndQuadrant</ulink>'s
<ulink url="https://www.pgbarman.org/">Barman</ulink> application <ulink url="https://www.pgbarman.org/">Barman</ulink> application
to clone a standby (and also as a fallback source for WAL files). to clone a standby (and also as a fallback source for WAL files).
</para> </para>
@@ -197,7 +197,7 @@ description = "Main cluster"
<para> <para>
As a fallback in case streaming replication is interrupted, PostgreSQL can optionally As a fallback in case streaming replication is interrupted, PostgreSQL can optionally
retrieve WAL files from an archive, such as that provided by Barman. This is done by retrieve WAL files from an archive, such as that provided by Barman. This is done by
setting <varname>restore_command</varname> in the replication configuration to setting <varname>restore_command</varname> in <filename>recovery.conf</filename> to
a valid shell command which can retrieve a specified WAL file from the archive. a valid shell command which can retrieve a specified WAL file from the archive.
</para> </para>
<para> <para>
@@ -299,7 +299,7 @@ description = "Main cluster"
build up indefinitely, possibly leading to server failure. build up indefinitely, possibly leading to server failure.
</simpara> </simpara>
<simpara> <simpara>
As an alternative we recommend using EDB's <ulink url="https://www.pgbarman.org/">Barman</ulink>, As an alternative we recommend using 2ndQuadrant's <ulink url="https://www.pgbarman.org/">Barman</ulink>,
which offloads WAL management to a separate server, removing the requirement to use a replication which offloads WAL management to a separate server, removing the requirement to use a replication
slot for each individual standby to reserve WAL. See section <xref linkend="cloning-from-barman"/> slot for each individual standby to reserve WAL. See section <xref linkend="cloning-from-barman"/>
for more details on using &repmgr; together with Barman. for more details on using &repmgr; together with Barman.
@@ -328,9 +328,9 @@ description = "Main cluster"
&repmgr; supports cascading replication. When cloning a standby, &repmgr; supports cascading replication. When cloning a standby,
set the command-line parameter <literal>--upstream-node-id</literal> to the set the command-line parameter <literal>--upstream-node-id</literal> to the
<varname>node_id</varname> of the server the standby should connect to, and <varname>node_id</varname> of the server the standby should connect to, and
&repmgr; will create a replication configuration file to point to it. Note &repmgr; will create <filename>recovery.conf</filename> to point to it. Note
that if <literal>--upstream-node-id</literal> is not explicitly provided, that if <literal>--upstream-node-id</literal> is not explicitly provided,
&repmgr; will set the standby's replication configuration to &repmgr; will set the standby's <filename>recovery.conf</filename> to
point to the primary node. point to the primary node.
</para> </para>
<para> <para>
@@ -392,7 +392,7 @@ description = "Main cluster"
does not yet exist. In this case you can clone from the primary (or does not yet exist. In this case you can clone from the primary (or
another upstream node); provide the parameter <literal>--upstream-conninfo</literal> another upstream node); provide the parameter <literal>--upstream-conninfo</literal>
to explicitly set the upstream's <varname>primary_conninfo</varname> string to explicitly set the upstream's <varname>primary_conninfo</varname> string
in the replication configuration. in <filename>recovery.conf</filename>.
</simpara> </simpara>
</tip> </tip>
</sect1> </sect1>
@@ -491,12 +491,12 @@ description = "Main cluster"
</note> </note>
<para> <para>
If, for whatever reason, you wish to include the password in the replication configuration file, If, for whatever reason, you wish to include the password in <filename>recovery.conf</filename>,
set <varname>use_primary_conninfo_password</varname> to <literal>true</literal> in set <varname>use_primary_conninfo_password</varname> to <literal>true</literal> in
<filename>repmgr.conf</filename>. This will read a password set in <varname>PGPASSWORD</varname> <filename>repmgr.conf</filename>. This will read a password set in <varname>PGPASSWORD</varname>
(but not <filename>~/.pgpass</filename>) and place it into the <varname>primary_conninfo</varname> (but not <filename>~/.pgpass</filename>) and place it into the <varname>primary_conninfo</varname>
string in the replication configuration. Note that <varname>PGPASSWORD</varname> string in <filename>recovery.conf</filename>. Note that <varname>PGPASSWORD</varname>
will need to be set during any action which causes the replication configuration file to be will need to be set during any action which causes <filename>recovery.conf</filename> to be
rewritten, e.g. <xref linkend="repmgr-standby-follow"/>. rewritten, e.g. <xref linkend="repmgr-standby-follow"/>.
</para> </para>
</sect2> </sect2>
@@ -508,7 +508,7 @@ description = "Main cluster"
user (in addition to the user who manages the &repmgr; metadata). In this case, user (in addition to the user who manages the &repmgr; metadata). In this case,
the replication user should be set in <filename>repmgr.conf</filename> via the parameter the replication user should be set in <filename>repmgr.conf</filename> via the parameter
<varname>replication_user</varname>; &repmgr; will use this value when making <varname>replication_user</varname>; &repmgr; will use this value when making
replication connections and generating the replication configuration. This replication connections and generating <filename>recovery.conf</filename>. This
value will also be stored in the parameter <literal>repmgr.nodes</literal> value will also be stored in the parameter <literal>repmgr.nodes</literal>
table for each node; it no longer needs to be explicitly specified when table for each node; it no longer needs to be explicitly specified when
cloning a node or executing <xref linkend="repmgr-standby-follow"/>. cloning a node or executing <xref linkend="repmgr-standby-follow"/>.

View File

@@ -164,7 +164,7 @@ conninfo='host=node1 user=repmgr dbname=repmgr connect_timeout=2'</programlistin
</para> </para>
<para> <para>
For a full list of annotated configuration items, see the file For a full list of annotated configuration items, see the file
<ulink url="https://raw.githubusercontent.com/EnterpriseDB/repmgr/master/repmgr.conf.sample">repmgr.conf.sample</ulink>. <ulink url="https://raw.githubusercontent.com/2ndQuadrant/repmgr/master/repmgr.conf.sample">repmgr.conf.sample</ulink>.
</para> </para>
<para> <para>
For &repmgrd;-specific settings, see <xref linkend="repmgrd-configuration"/>. For &repmgrd;-specific settings, see <xref linkend="repmgrd-configuration"/>.

View File

@@ -7,186 +7,19 @@
</indexterm> </indexterm>
<para> <para>
If the &repmgr; database user (the PostgreSQL user defined in the &repmgr; requires that the database defined in the <varname>conninfo</varname>
<varname>conninfo</varname> setting is a superuser, no further user permissions need setting contains the <literal>repmgr</literal> extension. The database user defined in the
to be granted. <varname>conninfo</varname> setting must be able to access this database and
the database objects contained within the extension.
</para>
<para>
The <literal>repmgr</literal> extension can only be installed by a superuser.
If the &repmgr; user is a superuser, &repmgr; will create the extension automatically.
</para> </para>
<sect2 id="configuration-permissions-no-superuser" xreflabel="Non-super user permissions"> <para>
<title>repmgr user as a non-superuser</title> Alternatively, the extension can be created manually by a superuser
<para> (with &quot;<command>CREATE EXTENSION repmgr</command>&quot;) before executing
In principle the &repmgr; database user does not need to be a superuser. <link linkend="repmgr-primary-register">repmgr primary register</link>.
In this case the &repmgr; will need to be granted execution permissions on certain </para>
functions, and membership of certain roles. However be aware that &repmgr; does
expect to be able to execute certain commands which are restricted to superusers;
in this case either a superuser must be specified with the <option>-S</option>/<option>--superuser</option>
(where available) option, or the corresponding action should be executed manually as a superuser.
</para>
<para>
The following sections describe the actions needed to use &repmgr; with a non-superuser,
and relevant caveats.
</para>
<sect3 id="configuration-permissions-replication" xreflabel="Replication role">
<title>Replication role</title>
<para>
&repmgr; requires a database user with the <literal>REPLICATION</literal> role
to be able to create a replication connection and (if configured) to administer
replication slots.
</para>
<para>
By default this is the database user defined in the <varname>conninfo</varname>
setting. This user can be:
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<simpara>
a superuser
</simpara>
</listitem>
<listitem>
<simpara>
a non-superuser with the <literal>REPLICATION</literal> role
</simpara>
</listitem>
<listitem>
<simpara>
another user defined in the <filename>repmgr.conf</filename> parameter <varname>replication_user</varname> with the <literal>REPLICATION</literal> role
</simpara>
</listitem>
</itemizedlist>
</para>
</sect3>
<sect3 id="configuration-permissions-roles" xreflabel="Database roles for non-superusers">
<title>Database roles</title>
<para>
A non-superuser &repmgr; database user should be a member of the following
<ulink url="https://www.postgresql.org/docs/current/predefined-roles.html">predefined roles</ulink>
(PostgreSQL 10 and later):
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<simpara>
<varname>pg_read_all_stats</varname>
(to read the <varname>status</varname> column of <literal>pg_stat_replication</literal>
and execute <function>pg_database_size()</function> on all databases)
</simpara>
</listitem>
<listitem>
<simpara>
<varname>pg_read_all_settings</varname> (to access the <varname>data_directory</varname> setting)
</simpara>
</listitem>
</itemizedlist>
Alternatively the meta-role <varname>pg_monitor</varname> can be granted, which includes membership
of the above predefined roles.
</para>
<para>
Membership of these roles can be granted with e.g. <command>GRANT pg_read_all_stats TO repmgr</command>.
</para>
<para>
Users of PostgreSQL 9.6 or earlier should upgrade to a supported PostgreSQL version, or provide
the <option>-S</option>/<option>--superuser</option> where available.
</para>
</sect3>
<sect3 id="configuration-permissions-extension" xreflabel="Extension creation">
<title>Extension creation</title>
<para>
&repmgr; requires that the database defined in the <varname>conninfo</varname>
setting contains the <literal>repmgr</literal> extension. The database user defined in the
<varname>conninfo</varname> setting must be able to access this database and
the database objects contained within the extension.
</para>
<para>
The <literal>repmgr</literal> extension can only be installed by a superuser.
If the &repmgr; user is a superuser, &repmgr; will create the extension automatically.
</para>
<para>
Alternatively, the extension can be created manually by a superuser
(with &quot;<command>CREATE EXTENSION repmgr</command>&quot;) before executing
<link linkend="repmgr-primary-register">repmgr primary register</link>.
</para>
</sect3>
<sect3 id="configuration-permissions-functions" xreflabel="Function permissions for non-superusers">
<title>Function permissions</title>
<para>
If the &repmgr; database user is not a superuser, <literal>EXECUTE</literal> permission should be
granted on the following function:
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<simpara>
<function>pg_wal_replay_resume()</function> (required by &repmgrd; during failover operations;
if permission is not granted, the failoved process may not function reliably if a node
has WAL replay paused)
</simpara>
</listitem>
<listitem>
<simpara>
<function>pg_promote()</function> (PostgreSQL 12 and later; if permission is not granted,
&repmgr; will fall back to <command>pg_ctl promote</command>)
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
<literal>EXECUTE</literal> permission on functions can be granted with e.g.:
<command>GRANT EXECUTE ON FUNCTION pg_catalog.pg_wal_replay_resume() TO repmgr</command>.
</para>
</sect3>
<sect3 id="configuration-permissions-superuser-required" xreflabel="repmgr actions requiring a superuser">
<title>repmgr actions requiring a superuser</title>
<para>
In some circumstances, &repmgr; may need to perform an operation which cannot be delegated to a
non-superuser.
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<simpara>
The <command>CHECKPOINT</command> command is executed by
<link linkend="repmgr-standby-switchover">repmgr standby switchover</link>. This can only
be executed by a superuser; if the &repmgr; user is not a superuser,
the <option>-S</option>/<option>--superuser</option> should be used.
</simpara>
<simpara>
If &repmgr; is not able to execute <command>CHECKPOINT</command>,
there is a risk that the demotion candidate may not be able to shut down as smoothly as might otherwise
have been the case.
</simpara>
</listitem>
<listitem>
<simpara>
The <command>ALTER SYSTEM</command> is executed by &repmgrd; if
<varname>standby_disconnect_on_failover</varname> is set to <literal>true</literal> in
<filename>repmgr.conf</filename>. <command>ALTER SYSTEM</command> can only be executed by
a superuser; if the &repmgr; user is not a superuser, this functionality will not be available.
</simpara>
</listitem>
</itemizedlist>
</para>
</sect3>
<sect3 id="configuration-permissions-superuser-option" xreflabel="repmgr commands with --superuser option">
<title>repmgr commands with --superuser option</title>
<para>
The following repmgr commands provide the <option>-S</option>/<option>--superuser</option> option:
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<simpara><link linkend="repmgr-standby-clone">repmgr standby clone</link> (to be able to copy configuration files outside of the data directory if <option>--copy-external-config-files</option> provided)</simpara>
</listitem>
<listitem>
<simpara><link linkend="repmgr-standby-switchover">repmgr standby switchover</link> (to execute <command>CHECKPOINT</command>)</simpara>
</listitem>
<listitem>
<simpara><link linkend="repmgr-node-check">repmgr node check</link> (to execute <command>repmgr node check --data-directory-config</command>; note this is also called by <link linkend="repmgr-standby-switchover">repmgr standby switchover</link>)</simpara>
</listitem>
<listitem>
<simpara><link linkend="repmgr-node-service">repmgr node service</link> (to execute <command>CHECKPOINT</command> via the <option>--checkpoint</option>; note this is also called by <link linkend="repmgr-standby-switchover">repmgr standby switchover</link>)</simpara>
</listitem>
</itemizedlist>
</para>
</sect3>
</sect2>
</sect1> </sect1>

View File

@@ -22,15 +22,16 @@
<para> <para>
&repmgr; RPM packages for RedHat/CentOS variants and Fedora are available from the &repmgr; RPM packages for RedHat/CentOS variants and Fedora are available from the
<ulink url="https://www.enterprisedb.com">EDB</ulink> <ulink url="https://2ndquadrant.com">2ndQuadrant</ulink>
<ulink url="https://dl.enterprisedb.com/">public repository</ulink>; see following <ulink url="https://dl.2ndquadrant.com/">public repository</ulink>; see following
section for details. section for details.
</para> </para>
<note> <note>
<para> <para>
Currently the <ulink url="https://www.enterprisedb.com">EDB</ulink> Currently the <ulink url="https://2ndquadrant.com">2ndQuadrant</ulink>
<ulink url="https://dl.enterprisedb.com/">public repository</ulink> provides <ulink url="https://dl.2ndquadrant.com/">public repository</ulink> provides
support for RedHat/CentOS versions 6,7 and 8. support for RedHat/CentOS versions 5, 6 and 7. Support for version 8 is
available via the PGDG repository; see below for details.
</para> </para>
</note> </note>
<para> <para>
@@ -44,7 +45,7 @@
<note> <note>
<para> <para>
&repmgr; RPM packages are designed to be compatible with the community-provided PostgreSQL packages &repmgr; RPM packages are designed to be compatible with the community-provided PostgreSQL packages
and EDB's PostgreSQL Extended Server (formerly 2ndQPostgres). and 2ndQuadrant's <ulink url="https://www.2ndquadrant.com/en/resources/2ndqpostgres/">2ndQPostgres</ulink>.
They may not work with vendor-specific packages such as those provided by RedHat for RHEL They may not work with vendor-specific packages such as those provided by RedHat for RHEL
customers, as the PostgreSQL filesystem layout may be different to the community RPMs. customers, as the PostgreSQL filesystem layout may be different to the community RPMs.
Please contact your support vendor for assistance. Please contact your support vendor for assistance.
@@ -63,16 +64,16 @@
<sect3 id="installation-packages-redhat-2ndq"> <sect3 id="installation-packages-redhat-2ndq">
<title>EDB public RPM yum repository</title> <title>2ndQuadrant public RPM yum repository</title>
<para> <para>
<ulink url="https://www.enterprisedb.com/">EDB</ulink> provides a dedicated <literal>yum</literal> <ulink url="https://2ndquadrant.com/">2ndQuadrant</ulink> provides a dedicated <literal>yum</literal>
<ulink url="https://dl.enterprisedb.com/">public repository</ulink> for EDB software, <ulink url="https://dl.2ndquadrant.com/">public repository</ulink> for 2ndQuadrant software,
including &repmgr;. We recommend using this for all future &repmgr; releases. including &repmgr;. We recommend using this for all future &repmgr; releases.
</para> </para>
<para> <para>
General instructions for using this repository can be found on its General instructions for using this repository can be found on its
<ulink url="https://dl.enterprisedb.com/">homepage</ulink>. Specific instructions <ulink url="https://dl.2ndquadrant.com/">homepage</ulink>. Specific instructions
for installing &repmgr; follow below. for installing &repmgr; follow below.
</para> </para>
<para> <para>
@@ -82,46 +83,57 @@
<listitem> <listitem>
<para> <para>
Locate the repository RPM for your PostgreSQL version from the list at: Locate the repository RPM for your PostgreSQL version from the list at:
<ulink url="https://dl.enterprisedb.com/">https://dl.enterprisedb.com/</ulink> <ulink url="https://dl.2ndquadrant.com/">https://dl.2ndquadrant.com/</ulink>
</para>
</listitem>
<listitem>
<para>
Install the repository definition for your distribution and PostgreSQL version
(this enables the EDB repository as a source of &repmgr; packages).
</para>
<para>
For example, for PostgreSQL 14 on Rocky Linux 8, execute:
<programlisting>
curl https://dl.enterprisedb.com/default/release/get/14/rpm | sudo bash</programlisting>
</para>
<para>
Verify that the repository is installed with:
<programlisting>
sudo dnf repolist</programlisting>
The output should contain two entries like this:
<programlisting>
2ndquadrant-dl-default-release-pg14 2ndQuadrant packages (PG14) for 8 - x86_64
2ndquadrant-dl-default-release-pg14-debug 2ndQuadrant packages (PG14) for 8 - x86_64 - Debug</programlisting>
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
Install the &repmgr; version appropriate for your PostgreSQL version (e.g. <literal>repmgr14</literal>): Install the repository definition for your distribution and PostgreSQL version
(this enables the 2ndQuadrant repository as a source of &repmgr; packages).
</para>
<para>
For example, for PostgreSQL 11 on CentOS, execute:
<programlisting>
curl https://dl.2ndquadrant.com/default/release/get/11/rpm | sudo bash</programlisting>
</para>
<para>
For PostgreSQL 9.6 on CentOS, execute:
<programlisting>
curl https://dl.2ndquadrant.com/default/release/get/9.6/rpm | sudo bash</programlisting>
</para>
<para>
Verify that the repository is installed with:
<programlisting>
sudo yum repolist</programlisting>
The output should contain two entries like this:
<programlisting>
2ndquadrant-dl-default-release-pg11/7/x86_64 2ndQuadrant packages (PG11) for 7 - x86_64 18
2ndquadrant-dl-default-release-pg11-debug/7/x86_64 2ndQuadrant packages (PG11) for 7 - x86_64 - Debug 8</programlisting>
</para>
</listitem>
<listitem>
<para>
Install the &repmgr; version appropriate for your PostgreSQL version (e.g. <literal>repmgr10</literal>):
<programlisting> <programlisting>
sudo dnf install repmgr14</programlisting> sudo yum install repmgr11</programlisting>
</para> </para>
<note>
<para>
For packages for PostgreSQL 9.6 and earlier, the package name does not contain
a period between major and minor version numbers, e.g.
<literal>repmgr96</literal>.
</para>
</note>
<tip> <tip>
<para> <para>
To determine the names of available packages, execute: To determine the names of available packages, execute:
<programlisting> <programlisting>
dnf search repmgr</programlisting> yum search repmgr</programlisting>
</para>
<para>
In CentOS 7 and earlier, use <literal>yum</literal> instead of <literal>dnf</literal>.
</para> </para>
</tip> </tip>
@@ -133,7 +145,7 @@ dnf search repmgr</programlisting>
<emphasis>Compatibility with PGDG Repositories</emphasis> <emphasis>Compatibility with PGDG Repositories</emphasis>
</para> </para>
<para> <para>
The EDB &repmgr; yum repository packages use the same definitions and file system layout as the The 2ndQuadrant &repmgr; yum repository packages use the same definitions and file system layout as the
main PGDG repository. main PGDG repository.
</para> </para>
<para> <para>
@@ -142,42 +154,36 @@ dnf search repmgr</programlisting>
the packages are installed from. the packages are installed from.
</para> </para>
<para> <para>
To ensure the EDB repository is always prioritised, set the <literal>priority</literal> option To ensure the 2ndQuadrant repository is always prioritised, install <literal>yum-plugin-priorities</literal>
in the repository configuration file (e.g. <filename>/etc/yum.repos.d/2ndquadrant-dl-default-release-pg14.repo</filename> and set the repository priorities accordingly.
accordingly.
</para> </para>
<note>
<para>
With CentOS 7 and earlier, the package <literal>yum-plugin-priorities</literal> must be installed
to be able to set the repository priority.
</para>
</note>
<para> <para>
<emphasis>Installing a specific package version</emphasis> <emphasis>Installing a specific package version</emphasis>
</para> </para>
<para> <para>
To install a specific package version, execute <command>dnf --showduplicates list</command> To install a specific package version, execute <command>yum --showduplicates list</command>
for the package in question: for the package in question:
<programlisting> <programlisting>
[root@localhost ~]# dnf --showduplicates list repmgr10 [root@localhost ~]# yum --showduplicates list repmgr11
Last metadata expiration check: 0:09:15 ago on Fri 11 Mar 2022 01:09:19 AM UTC. Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* epel: nrt.edge.kernel.org
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
Installed Packages Installed Packages
repmgr10.x86_64 5.3.1-1.el8 @2ndquadrant-dl-default-release-pg10 repmgr11.x86_64 4.4.0-1.rhel7 @pgdg11
Available Packages Available Packages
repmgr10.x86_64 5.0.0-1.rhel8 pgdg10 repmgr11.x86_64 4.2-1.el7 2ndquadrant-dl-default-release-pg11
repmgr10.x86_64 5.1.0-1.el8 2ndquadrant-dl-default-release-pg10 repmgr11.x86_64 4.2-2.el7 2ndquadrant-dl-default-release-pg11
repmgr10.x86_64 5.1.0-1.rhel8 pgdg10 repmgr11.x86_64 4.3-1.el7 2ndquadrant-dl-default-release-pg11
repmgr10.x86_64 5.1.0-2.el8 2ndquadrant-dl-default-release-pg10 repmgr11.x86_64 4.4-1.el7 2ndquadrant-dl-default-release-pg11</programlisting>
repmgr10.x86_64 5.2.0-1.el8 2ndquadrant-dl-default-release-pg10
repmgr10.x86_64 5.2.0-1.rhel8 pgdg10
repmgr10.x86_64 5.2.1-1.el8 2ndquadrant-dl-default-release-pg10
repmgr10.x86_64 5.3.0-1.el8 2ndquadrant-dl-default-release-pg10
repmgr10.x86_64 5.3.1-1.el8 2ndquadrant-dl-default-release-pg10</programlisting>
then append the appropriate version number to the package name with a hyphen, e.g.: then append the appropriate version number to the package name with a hyphen, e.g.:
<programlisting> <programlisting>
[root@localhost ~]# dnf install repmgr10-5.3.0-1.el8</programlisting> [root@localhost ~]# yum install repmgr11-4.3-1.el7</programlisting>
</para> </para>
<para> <para>
<emphasis>Installing old packages</emphasis> <emphasis>Installing old packages</emphasis>
</para> </para>
@@ -185,6 +191,7 @@ repmgr10.x86_64 5.3.1-1.el8
See appendix <link linkend="packages-old-versions-rhel-centos">Installing old package versions</link> See appendix <link linkend="packages-old-versions-rhel-centos">Installing old package versions</link>
for details on how to retrieve older package versions. for details on how to retrieve older package versions.
</para> </para>
</sect3> </sect3>
</sect2> </sect2>
@@ -210,16 +217,16 @@ repmgr10.x86_64 5.3.1-1.el8
</para> </para>
<sect3 id="installation-packages-debian-ubuntu-2ndq"> <sect3 id="installation-packages-debian-ubuntu-2ndq">
<title>EDB public apt repository for Debian/Ubuntu</title> <title>2ndQuadrant public apt repository for Debian/Ubuntu</title>
<para> <para>
<ulink url="https://www.enterprisedb.com/">EDB</ulink> provides a <ulink url="https://2ndquadrant.com/">2ndQuadrant</ulink> provides a
<ulink url="https://dl.enterprisedb.com/">public apt repository</ulink> for EDB software, <ulink url="https://dl.2ndquadrant.com/">public apt repository</ulink> for 2ndQuadrant software,
including &repmgr;. including &repmgr;.
</para> </para>
<para> <para>
General instructions for using this repository can be found on its General instructions for using this repository can be found on its
<ulink url="https://dl.enterprisedb.com/">homepage</ulink>. Specific instructions <ulink url="https://dl.2ndquadrant.com/">homepage</ulink>. Specific instructions
for installing &repmgr; follow below. for installing &repmgr; follow below.
</para> </para>
@@ -232,9 +239,9 @@ repmgr10.x86_64 5.3.1-1.el8
<listitem> <listitem>
<para> <para>
Install the repository definition for your distribution and PostgreSQL version Install the repository definition for your distribution and PostgreSQL version
(this enables the EDB repository as a source of &repmgr; packages) by executing: (this enables the 2ndQuadrant repository as a source of &repmgr; packages) by executing:
<programlisting> <programlisting>
curl https://dl.enterprisedb.com/default/release/get/deb | sudo bash</programlisting> curl https://dl.2ndquadrant.com/default/release/get/deb | sudo bash</programlisting>
</para> </para>
<note> <note>
<para> <para>

View File

@@ -108,31 +108,10 @@
<entry> <entry>
Supported PostgreSQL versions Supported PostgreSQL versions
</entry> </entry>
<entry>
Notes
</entry>
</row> </row>
</thead> </thead>
<tbody> <tbody>
<row>
<entry>
&repmgr; 5.4
</entry>
<entry>
(dev)
</entry>
<entry>
<link linkend="release-current">&repmgrversion;</link> (&releasedate;)
</entry>
<entry>
9.4, 9.5, 9.6, 10, 11, 12, 13, 15
</entry>
<entry>
&nbsp;
</entry>
</row>
<row> <row>
<entry> <entry>
&repmgr; 5.3 &repmgr; 5.3
@@ -144,10 +123,7 @@
<link linkend="release-current">&repmgrversion;</link> (&releasedate;) <link linkend="release-current">&repmgrversion;</link> (&releasedate;)
</entry> </entry>
<entry> <entry>
9.4, 9.5, 9.6, 10, 11, 12, 13, 14, 15 9.4, 9.5, 9.6, 10, 11, 12, 13, 14
</entry>
<entry>
PostgreSQL 15 supported from &repmgr; 5.3.3
</entry> </entry>
</row> </row>
@@ -164,9 +140,6 @@
<entry> <entry>
9.4, 9.5, 9.6, 10, 11, 12, 13 9.4, 9.5, 9.6, 10, 11, 12, 13
</entry> </entry>
<entry>
&nbsp;
</entry>
</row> </row>
<row> <row>
@@ -182,9 +155,6 @@
<entry> <entry>
9.3, 9.4, 9.5, 9.6, 10, 11, 12 9.3, 9.4, 9.5, 9.6, 10, 11, 12
</entry> </entry>
<entry>
&nbsp;
</entry>
</row> </row>
<row> <row>
@@ -200,9 +170,6 @@
<entry> <entry>
9.3, 9.4, 9.5, 9.6, 10, 11, 12 9.3, 9.4, 9.5, 9.6, 10, 11, 12
</entry> </entry>
<entry>
&nbsp;
</entry>
</row> </row>
@@ -219,9 +186,6 @@
<entry> <entry>
9.3, 9.4, 9.5, 9.6, 10, 11 9.3, 9.4, 9.5, 9.6, 10, 11
</entry> </entry>
<entry>
&nbsp;
</entry>
</row> </row>
<row> <row>
@@ -237,9 +201,6 @@
<entry> <entry>
9.3, 9.4, 9.5, 9.6 9.3, 9.4, 9.5, 9.6
</entry> </entry>
<entry>
&nbsp;
</entry>
</row> </row>
<row> <row>
@@ -255,9 +216,6 @@
<entry> <entry>
9.0, 9.1, 9.2, 9.3, 9.4 9.0, 9.1, 9.2, 9.3, 9.4
</entry> </entry>
<entry>
&nbsp;
</entry>
</row> </row>
</tbody> </tbody>

View File

@@ -1,18 +1,18 @@
<!-- doc/legal.xml --> <!-- doc/legal.xml -->
<date>2022</date> <date>2017</date>
<copyright> <copyright>
<year>2010-2022</year> <year>2010-2021</year>
<holder>EDB</holder> <holder>EnterpriseDB Corporation</holder>
</copyright> </copyright>
<legalnotice id="legalnotice"> <legalnotice id="legalnotice">
<title>Legal Notice</title> <title>Legal Notice</title>
<para> <para>
<productname>repmgr</productname> is Copyright &copy; 2010-2022 <productname>repmgr</productname> is Copyright &copy; 2010-2021
by EDB All rights reserved. by EnterpriseDB Corporation All rights reserved.
</para> </para>
<para> <para>

View File

@@ -405,10 +405,9 @@
</programlisting> </programlisting>
<para> <para>
This has cloned the PostgreSQL data directory files from the primary <literal>node1</literal> This has cloned the PostgreSQL data directory files from the primary <literal>node1</literal>
using PostgreSQL's <command>pg_basebackup</command> utility. Replication configuration using PostgreSQL's <command>pg_basebackup</command> utility. A <filename>recovery.conf</filename>
containing the correct parameters to start streaming from this primary server will be file containing the correct parameters to start streaming from this primary server will be created
automatically appended to <filename>postgresql.auto.conf</filename>. (In PostgreSQL 11 automatically.
and earlier the file <filename>recovery.conf</filename> will be created).
</para> </para>
<note> <note>
<simpara> <simpara>
@@ -482,10 +481,9 @@
sender_port | 5432 sender_port | 5432
conninfo | user=repmgr dbname=replication host=node1 application_name=node2 conninfo | user=repmgr dbname=replication host=node1 application_name=node2
</programlisting> </programlisting>
Note that the <varname>conninfo</varname> value is that generated in <filename>postgresql.auto.conf</filename> Note that the <varname>conninfo</varname> value is that generated in <filename>recovery.conf</filename>
(PostgreSQL 11 and earlier: <filename>recovery.conf</filename>) and will differ slightly from the primary's and will differ slightly from the primary's <varname>conninfo</varname> as set in <filename>repmgr.conf</filename> -
<varname>conninfo</varname> as set in <filename>repmgr.conf</filename> - among others it will contain the among others it will contain the connecting node's name as <varname>application_name</varname>.
connecting node's name as <varname>application_name</varname>.
</para> </para>
</sect1> </sect1>

View File

@@ -73,16 +73,16 @@
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><option>--force-rewind</option></term> <term><option>--force-rewind[=/path/to/pg_rewind]</option></term>
<listitem> <listitem>
<para> <para>
Execute <application>pg_rewind</application>. Execute <application>pg_rewind</application>.
</para> </para>
<para> <para>
See <xref linkend="repmgr-node-rejoin-pg-rewind"/> for more details on using It is only necessary to provide the <application>pg_rewind</application> path
<application>pg_rewind</application>. if using PostgreSQL 9.4, and <application>pg_rewind</application>
is not installed in the PostgreSQL <filename>bin</filename> directory.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@@ -261,6 +261,8 @@
<para> <para>
<command>repmgr node rejoin</command> can optionally use <command>pg_rewind</command> to re-integrate a <command>repmgr node rejoin</command> can optionally use <command>pg_rewind</command> to re-integrate a
node which has diverged from the rest of the cluster, typically a failed primary. node which has diverged from the rest of the cluster, typically a failed primary.
<command>pg_rewind</command> is available in PostgreSQL 9.5 and later as part of the core distribution,
and can be installed from external sources for PostgreSQL 9.4.
</para> </para>
<note> <note>
<para> <para>
@@ -269,10 +271,6 @@
data checksums were enabled when the cluster was initialized. See the data checksums were enabled when the cluster was initialized. See the
<ulink url="https://www.postgresql.org/docs/current/app-pgrewind.html"><command>pg_rewind</command> documentation</ulink> for details. <ulink url="https://www.postgresql.org/docs/current/app-pgrewind.html"><command>pg_rewind</command> documentation</ulink> for details.
</para> </para>
<para>
Additionally, <varname>full_page_writes</varname> must be enabled; this is the default and
normally should never be disabled.
</para>
</note> </note>
<para> <para>
@@ -384,29 +382,6 @@
DETAIL: node 2 is now attached to node 3</programlisting> DETAIL: node 2 is now attached to node 3</programlisting>
</para> </para>
</refsect2> </refsect2>
<refsect2 id="repmgr-node-rejoin-postgresql-94" xreflabel="pg_rewind and PostgreSQL 9.4">
<title><command>pg_rewind</command> and PostgreSQL 9.4</title>
<indexterm>
<primary>pg_rewind</primary>
<secondary>PostgreSQL 9.4</secondary>
</indexterm>
<para>
<application>pg_rewind</application> is available in PostgreSQL 9.5 and later as part of the core distribution.
Users of PostgreSQL 9.4 will need to manually install it; the source code is available here:
<ulink url="https://github.com/vmware/pg_rewind">https://github.com/vmware/pg_rewind</ulink>.
If the <application>pg_rewind</application>
binary is not installed in the PostgreSQL <filename>bin</filename> directory, provide
its full path on the demotion candidate with <option>--force-rewind</option>.
</para>
<para>
Note that building the 9.4 version of <application>pg_rewind</application> requires the PostgreSQL
source code.
</para>
</refsect2>
</refsect1> </refsect1>
<refsect1 id="repmgr-node-rejoin-caveats" xreflabel="Caveats"> <refsect1 id="repmgr-node-rejoin-caveats" xreflabel="Caveats">
@@ -451,7 +426,7 @@
<warning> <warning>
<para> <para>
In all PostgreSQL released before February 2021, <application>pg_rewind</application> In all current PostgreSQL versions (as of September 2020), <application>pg_rewind</application>
contains a corner-case bug which affects standbys in a very specific situation. contains a corner-case bug which affects standbys in a very specific situation.
</para> </para>
<para> <para>
@@ -481,7 +456,8 @@
<para> <para>
Currently it is not possible to resolve this situation using <application>pg_rewind</application>. Currently it is not possible to resolve this situation using <application>pg_rewind</application>.
A <ulink url="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=2b4f3130382fe2f8705863e4d38589d4d69cd695">patch</ulink> A <ulink url="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=2b4f3130382fe2f8705863e4d38589d4d69cd695">patch</ulink>
was submitted and is included in all PostgreSQL versions released in February 2021 or later. has been successfully submitted and will be included the next PostgreSQL minor release round, scheduled for
February 2021.
</para> </para>
<para> <para>
As a workaround, start the primary server the standby was previously attached to, As a workaround, start the primary server the standby was previously attached to,
@@ -499,7 +475,7 @@
<refsect1> <refsect1>
<title>See also</title> <title>See also</title>
<para> <para>
<xref linkend="repmgr-standby-follow"/>, <xref linkend="repmgr-standby-switchover"/> <xref linkend="repmgr-standby-follow"/>
</para> </para>
</refsect1> </refsect1>
</refentry> </refentry>

View File

@@ -332,12 +332,6 @@ pg_basebackup_options='--waldir=/path/to/wal-directory'</programlisting>
node to the same path on the standby (default) or to the node to the same path on the standby (default) or to the
PostgreSQL data directory. PostgreSQL data directory.
</para> </para>
<para>
Note that to be able to use this option, the &repmgr; user must be a superuser or
member of the <literal>pg_read_all_settings</literal> predefined role.
If this is not the case, provide a valid superuser with the
<option>-S</option>/<option>--superuser</option> option.
</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@@ -405,15 +399,11 @@ pg_basebackup_options='--waldir=/path/to/wal-directory'</programlisting>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><option>-S</option>/<option>--superuser</option></term> <term><option>--superuser</option></term>
<listitem> <listitem>
<para> <para>
The name of a valid PostgreSQL superuser can be provided with this option. If the &repmgr; user is not a superuser, the name of a valid superuser must
</para> be provided with this option.
<para>
This is only required if the <option>--copy-external-config-files</option> was provided
and the &repmgr; user is not a superuser or member of the <literal>pg_read_all_settings</literal>
predefined role.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@@ -64,13 +64,6 @@
<refsect1> <refsect1>
<title>User permission requirements</title> <title>User permission requirements</title>
<para><emphasis>data_directory</emphasis></para>
<para>
&repmgr; needs to be able to determine the location of the data directory on the
demotion candidate. If the &repmgr; is not a superuser or member of the <varname>pg_read_all_settings</varname>
<ulink url="https://www.postgresql.org/docs/current/predefined-roles.html">predefined roles</ulink>,
the name of a superuser should be provided with the <option>-S</option>/<option>--superuser</option> option.
</para>
<para><emphasis>CHECKPOINT</emphasis></para> <para><emphasis>CHECKPOINT</emphasis></para>
<para> <para>
&repmgr; executes <command>CHECKPOINT</command> on the demotion candidate as part of the shutdown &repmgr; executes <command>CHECKPOINT</command> on the demotion candidate as part of the shutdown
@@ -79,7 +72,7 @@
<para> <para>
Note that <command>CHECKPOINT</command> requires database superuser permissions to execute. Note that <command>CHECKPOINT</command> requires database superuser permissions to execute.
If the <literal>repmgr</literal> user is not a superuser, the name of a superuser should be If the <literal>repmgr</literal> user is not a superuser, the name of a superuser should be
provided with the <option>-S</option>/<option>--superuser</option> option. provided with the <option>-S</option>/<option>--superuser</option>.
</para> </para>
<para> <para>
If &repmgr; is unable to execute the <command>CHECKPOINT</command> command, the switchover If &repmgr; is unable to execute the <command>CHECKPOINT</command> command, the switchover
@@ -154,12 +147,9 @@
<para> <para>
Use <application>pg_rewind</application> to reintegrate the old primary if necessary Use <application>pg_rewind</application> to reintegrate the old primary if necessary
(and the prerequisites for using <application>pg_rewind</application> are met). (and the prerequisites for using <application>pg_rewind</application> are met).
</para>
<para>
If using PostgreSQL 9.4, and the <application>pg_rewind</application> If using PostgreSQL 9.4, and the <application>pg_rewind</application>
binary is not installed in the PostgreSQL <filename>bin</filename> directory, binary is not installed in the PostgreSQL <filename>bin</filename> directory,
provide its full path. For more details see also <xref linkend="switchover-pg-rewind"/> provide its full path. For more details see also <xref linkend="switchover-pg-rewind"/>.
and <xref linkend="repmgr-node-rejoin-pg-rewind"/>.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@@ -18,7 +18,7 @@
<title>repmgr &repmgrversion; Documentation</title> <title>repmgr &repmgrversion; Documentation</title>
<bookinfo> <bookinfo>
<corpauthor>EDB</corpauthor> <corpauthor>EnterpriseDB Corporation</corpauthor>
<productname>repmgr</productname> <productname>repmgr</productname>
<productnumber>&repmgrversion;</productnumber> <productnumber>&repmgrversion;</productnumber>
&legal; &legal;
@@ -26,7 +26,7 @@
<abstract> <abstract>
<para> <para>
This is the official documentation of &repmgr; &repmgrversion; for This is the official documentation of &repmgr; &repmgrversion; for
use with PostgreSQL 9.4 - PostgreSQL 15. use with PostgreSQL 9.4 - PostgreSQL 14.
</para> </para>
<para> <para>
&repmgr; is being continually developed and we strongly recommend using the &repmgr; is being continually developed and we strongly recommend using the
@@ -38,18 +38,19 @@
<para> <para>
&repmgr; is developed by &repmgr; is developed by
<ulink url="https://www.enterprisedb.com/">EDB</ulink> <ulink url="https://2ndquadrant.com">2ndQuadrant (EDB)</ulink>
along with contributions from other individuals and organisations. along with contributions from other individuals and organisations.
Contributions from the community are appreciated and welcome - get Contributions from the community are appreciated and welcome - get
in touch via <ulink url="https://github.com/EnterpriseDB/repmgr">github</ulink> in touch via <ulink url="https://github.com/EnterpriseDB/repmgr">github</ulink>
or <ulink url="https://groups.google.com/group/repmgr">the mailing list/forum</ulink>. or <ulink url="https://groups.google.com/group/repmgr">the mailing list/forum</ulink>.
Multiple EDB customers contribute funding to make &repmgr; development possible. Multiple 2ndQuadrant (EDB) customers contribute funding
to make repmgr development possible.
</para> </para>
<para> <para>
&repmgr; is fully supported by EDB's &repmgr; is fully supported by 2ndQuadrant (EDB)'s
<ulink url="https://www.enterprisedb.com/support/postgresql-support-overview-get-the-most-out-of-postgresql">24/7 Production Support</ulink>. <ulink url="https://www.2ndquadrant.com/en/support/support-postgresql/">24/7 Production Support</ulink>.
EDB, a Major Sponsor of the PostgreSQL project, continues to maintain &repmgr;. EnterpriseDB Corporation, a Major Sponsor of the PostgreSQL project, continues to maintain &repmgr;.
We welcome participation from other organisations and individual developers. We welcome participation from other organisations and individual developers.
</para> </para>
</abstract> </abstract>

View File

@@ -81,15 +81,11 @@
</para> </para>
<note> <note>
<simpara> <simpara>
A PostgreSQL instance can only accommodate a single witness server. &repmgr; 3.3 and earlier provided a <command>repmgr create witness</command>
</simpara> command, which would automatically create a PostgreSQL instance. However
<simpara> this often resulted in an unsatisfactory, hard-to-customise instance.
If you are planning to use a single server to support more than one
witness server, a separate PostgreSQL instance is required for each
witness server in use.
</simpara> </simpara>
</note> </note>
<para> <para>
The witness server should be configured in the same way as a normal The witness server should be configured in the same way as a normal
&repmgr; node; see section <xref linkend="configuration"/>. &repmgr; node; see section <xref linkend="configuration"/>.

View File

@@ -345,18 +345,14 @@
</indexterm> </indexterm>
<para> <para>
Indicates a preferred priority (default: <literal>100</literal>) for promoting nodes. Indicates a preferred priority (default: <literal>100</literal>) for promoting nodes;
a value of zero prevents the node being promoted to primary.
</para> </para>
<para> <para>
Note that the priority setting is only applied if two or more nodes are Note that the priority setting is only applied if two or more nodes are
determined as promotion candidates; in that case the node with the determined as promotion candidates; in that case the node with the
higher priority is selected. higher priority is selected.
</para> </para>
<para>
A value of zero will always prevent the node being promoted to primary, even if there
is no other promotion candidate.
</para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@@ -242,12 +242,21 @@
</simpara> </simpara>
</note> </note>
<para> <para>
For more details on <application>pg_rewind</application>, see section <xref linkend="repmgr-node-rejoin-pg-rewind"/> For more details on <application>pg_rewind</application>, see:
in the <link linkend="repmgr-node-rejoin"><command>repmgr node rejoin</command></link> documentation and
the PostgreSQL documentation at
<ulink url="https://www.postgresql.org/docs/current/app-pgrewind.html">https://www.postgresql.org/docs/current/app-pgrewind.html</ulink>. <ulink url="https://www.postgresql.org/docs/current/app-pgrewind.html">https://www.postgresql.org/docs/current/app-pgrewind.html</ulink>.
</para> </para>
<para>
<application>pg_rewind</application> has been part of the core PostgreSQL distribution since
version 9.5. Users of PostgreSQL 9.4 will need to manually install it; the source code is available here:
<ulink url="https://github.com/vmware/pg_rewind">https://github.com/vmware/pg_rewind</ulink>.
If the <application>pg_rewind</application>
binary is not installed in the PostgreSQL <filename>bin</filename> directory, provide
its full path on the demotion candidate with <option>--force-rewind</option>.
</para>
<para>
Note that building the 9.4 version of <application>pg_rewind</application> requires the PostgreSQL
source code.
</para>
</sect2> </sect2>

View File

@@ -71,12 +71,6 @@
<secondary>minor release</secondary> <secondary>minor release</secondary>
</indexterm> </indexterm>
<para>
A minor release upgrade involves updating &repmgr; from one minor release to another
minor release within the same major release (e.g. <literal>5.3.1</literal> to <literal>5.3.2</literal>).
An upgrade between minor releases of differing major releases (e.g. <literal>5.2.1</literal> to <literal>5.3.2</literal>)
is a <link linkend="upgrading-major-version">major upgrade</link>.
</para>
<para> <para>
The process for installing minor version upgrades is quite straightforward: The process for installing minor version upgrades is quite straightforward:
@@ -111,17 +105,15 @@
</para> </para>
<para> <para>
A PostgreSQL restart is usually <emphasis>not</emphasis> required for minor version upgrades A PostgreSQL restart is <emphasis>not</emphasis> required for minor version upgrades.
within the same major version (e.g. <literal>5.3.1</literal> to <literal>5.3.2</literal>).
Be sure to check the <link linkend="appendix-release-notes">release notes</link>.
</para> </para>
<note> <note>
<para> <para>
The same &repmgr; &quot;major version&quot; (e.g. <literal>5.3</literal>) must be The same &repmgr; &quot;major version&quot; (e.g. <literal>4.2</literal>) must be
installed on all nodes in the replication cluster. While it's possible to have differing installed on all nodes in the replication cluster. While it's possible to have differing
&repmgr; &quot;minor versions&quot; (e.g. <literal>5.3.1</literal> and <literal>5.3.2</literal>) &repmgr; &quot;minor versions&quot; (e.g. <literal>4.2.1</literal>) on different nodes,
on different nodes, we strongly recommend updating all nodes to the latest minor version. we strongly recommend updating all nodes to the latest minor version.
</para> </para>
</note> </note>

View File

@@ -1,2 +0,0 @@
-- complain if script is sourced in psql, rather than via CREAT EXTENSION
\echo Use "CREATE EXTENSION repmgr" to load this file. \quit

View File

@@ -1,192 +0,0 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION repmgr" to load this file. \quit
CREATE TABLE repmgr.nodes (
node_id INTEGER PRIMARY KEY,
upstream_node_id INTEGER NULL REFERENCES nodes (node_id) DEFERRABLE,
active BOOLEAN NOT NULL DEFAULT TRUE,
node_name TEXT NOT NULL,
type TEXT NOT NULL CHECK (type IN('primary','standby','witness','bdr')),
location TEXT NOT NULL DEFAULT 'default',
priority INT NOT NULL DEFAULT 100,
conninfo TEXT NOT NULL,
repluser VARCHAR(63) NOT NULL,
slot_name TEXT NULL,
config_file TEXT NOT NULL
);
SELECT pg_catalog.pg_extension_config_dump('repmgr.nodes', '');
CREATE TABLE repmgr.events (
node_id INTEGER NOT NULL,
event TEXT NOT NULL,
successful BOOLEAN NOT NULL DEFAULT TRUE,
event_timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
details TEXT NULL
);
SELECT pg_catalog.pg_extension_config_dump('repmgr.events', '');
CREATE TABLE repmgr.monitoring_history (
primary_node_id INTEGER NOT NULL,
standby_node_id INTEGER NOT NULL,
last_monitor_time TIMESTAMP WITH TIME ZONE NOT NULL,
last_apply_time TIMESTAMP WITH TIME ZONE,
last_wal_primary_location PG_LSN NOT NULL,
last_wal_standby_location PG_LSN,
replication_lag BIGINT NOT NULL,
apply_lag BIGINT NOT NULL
);
CREATE INDEX idx_monitoring_history_time
ON repmgr.monitoring_history (last_monitor_time, standby_node_id);
SELECT pg_catalog.pg_extension_config_dump('repmgr.monitoring_history', '');
CREATE VIEW repmgr.show_nodes AS
SELECT n.node_id,
n.node_name,
n.active,
n.upstream_node_id,
un.node_name AS upstream_node_name,
n.type,
n.priority,
n.conninfo
FROM repmgr.nodes n
LEFT JOIN repmgr.nodes un
ON un.node_id = n.upstream_node_id;
CREATE TABLE repmgr.voting_term (
term INT NOT NULL
);
CREATE UNIQUE INDEX voting_term_restrict
ON repmgr.voting_term ((TRUE));
CREATE RULE voting_term_delete AS
ON DELETE TO repmgr.voting_term
DO INSTEAD NOTHING;
/* ================= */
/* repmgrd functions */
/* ================= */
/* monitoring functions */
CREATE FUNCTION set_local_node_id(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_set_local_node_id'
LANGUAGE C STRICT;
CREATE FUNCTION get_local_node_id()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_local_node_id'
LANGUAGE C STRICT;
CREATE FUNCTION standby_set_last_updated()
RETURNS TIMESTAMP WITH TIME ZONE
AS 'MODULE_PATHNAME', 'repmgr_standby_set_last_updated'
LANGUAGE C STRICT;
CREATE FUNCTION standby_get_last_updated()
RETURNS TIMESTAMP WITH TIME ZONE
AS 'MODULE_PATHNAME', 'repmgr_standby_get_last_updated'
LANGUAGE C STRICT;
CREATE FUNCTION set_upstream_last_seen(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_set_upstream_last_seen'
LANGUAGE C STRICT;
CREATE FUNCTION get_upstream_last_seen()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_upstream_last_seen'
LANGUAGE C STRICT;
CREATE FUNCTION get_upstream_node_id()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_upstream_node_id'
LANGUAGE C STRICT;
CREATE FUNCTION set_upstream_node_id(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_set_upstream_node_id'
LANGUAGE C STRICT;
/* failover functions */
CREATE FUNCTION notify_follow_primary(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_notify_follow_primary'
LANGUAGE C STRICT;
CREATE FUNCTION get_new_primary()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_new_primary'
LANGUAGE C STRICT;
CREATE FUNCTION reset_voting_status()
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_reset_voting_status'
LANGUAGE C STRICT;
CREATE FUNCTION get_repmgrd_pid()
RETURNS INT
AS 'MODULE_PATHNAME', 'get_repmgrd_pid'
LANGUAGE C STRICT;
CREATE FUNCTION get_repmgrd_pidfile()
RETURNS TEXT
AS 'MODULE_PATHNAME', 'get_repmgrd_pidfile'
LANGUAGE C STRICT;
CREATE FUNCTION set_repmgrd_pid(INT, TEXT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'set_repmgrd_pid'
LANGUAGE C CALLED ON NULL INPUT;
CREATE FUNCTION repmgrd_is_running()
RETURNS BOOL
AS 'MODULE_PATHNAME', 'repmgrd_is_running'
LANGUAGE C STRICT;
CREATE FUNCTION repmgrd_pause(BOOL)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgrd_pause'
LANGUAGE C STRICT;
CREATE FUNCTION repmgrd_is_paused()
RETURNS BOOL
AS 'MODULE_PATHNAME', 'repmgrd_is_paused'
LANGUAGE C STRICT;
CREATE FUNCTION get_wal_receiver_pid()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_wal_receiver_pid'
LANGUAGE C STRICT;
/* views */
CREATE VIEW repmgr.replication_status AS
SELECT m.primary_node_id, m.standby_node_id, n.node_name AS standby_name,
n.type AS node_type, n.active, last_monitor_time,
CASE WHEN n.type='standby' THEN m.last_wal_primary_location ELSE NULL END AS last_wal_primary_location,
m.last_wal_standby_location,
CASE WHEN n.type='standby' THEN pg_catalog.pg_size_pretty(m.replication_lag) ELSE NULL END AS replication_lag,
CASE WHEN n.type='standby' THEN
CASE WHEN replication_lag > 0 THEN age(now(), m.last_apply_time) ELSE '0'::INTERVAL END
ELSE NULL
END AS replication_time_lag,
CASE WHEN n.type='standby' THEN pg_catalog.pg_size_pretty(m.apply_lag) ELSE NULL END AS apply_lag,
AGE(NOW(), CASE WHEN pg_catalog.pg_is_in_recovery() THEN repmgr.standby_get_last_updated() ELSE m.last_monitor_time END) AS communication_time_lag
FROM repmgr.monitoring_history m
JOIN repmgr.nodes n ON m.standby_node_id = n.node_id
WHERE (m.standby_node_id, m.last_monitor_time) IN (
SELECT m1.standby_node_id, MAX(m1.last_monitor_time)
FROM repmgr.monitoring_history m1 GROUP BY 1
);

View File

@@ -1327,7 +1327,7 @@ do_node_check_downstream(PGconn *conn, OutputMode mode, t_node_info *node_info,
continue; continue;
} }
if (is_downstream_node_attached_quiet(conn, cell->node_info->node_name, NULL) != NODE_ATTACHED) if (is_downstream_node_attached(conn, cell->node_info->node_name, NULL) != NODE_ATTACHED)
{ {
missing_nodes_count++; missing_nodes_count++;
item_list_append_format(&missing_nodes, item_list_append_format(&missing_nodes,
@@ -1395,32 +1395,49 @@ do_node_check_downstream(PGconn *conn, OutputMode mode, t_node_info *node_info,
{ {
case OM_NAGIOS: case OM_NAGIOS:
{ {
printf("REPMGR_DOWNSTREAM_SERVERS %s: %s | ",
output_check_status(status),
details.data);
if (missing_nodes_count) if (missing_nodes_count)
{ {
ItemListCell *missing_cell = NULL; ItemListCell *missing_cell = NULL;
bool first = true; bool first = true;
appendPQExpBufferStr(&details, " (missing: "); printf("missing: ");
for (missing_cell = missing_nodes.head; missing_cell; missing_cell = missing_cell->next) for (missing_cell = missing_nodes.head; missing_cell; missing_cell = missing_cell->next)
{ {
if (first == false) if (first == false)
appendPQExpBufferStr(&details, ", "); printf(", ");
else else
first = false; first = false;
if (first == false) if (first == false)
appendPQExpBufferStr(&details, missing_cell->string); printf("%s", missing_cell->string);
} }
appendPQExpBufferChar(&details, ')');
} }
printf("REPMGR_DOWNSTREAM_SERVERS %s: %s | attached=%i, missing=%i\n", if (expected_nodes_count - missing_nodes_count)
output_check_status(status), {
details.data, ItemListCell *attached_cell = NULL;
expected_nodes_count - missing_nodes_count, bool first = true;
missing_nodes_count);
if (missing_nodes_count)
printf("; ");
printf("attached: ");
for (attached_cell = attached_nodes.head; attached_cell; attached_cell = attached_cell->next)
{
if (first == false)
printf(", ");
else
first = false;
if (first == false)
printf("%s", attached_cell->string);
}
}
printf("\n");
} }
break; break;
case OM_CSV: case OM_CSV:
@@ -1518,7 +1535,7 @@ do_node_check_upstream(PGconn *conn, OutputMode mode, t_node_info *node_info, Ch
{ {
case OM_NAGIOS: case OM_NAGIOS:
{ {
printf("REPMGR_UPSTREAM_SERVER %s: %s\n", printf("REPMGR_UPSTREAM_SERVER %s: %s | ",
output_check_status(status), output_check_status(status),
details.data); details.data);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -19,77 +19,6 @@
#ifndef _REPMGR_ACTION_STANDBY_H_ #ifndef _REPMGR_ACTION_STANDBY_H_
#define _REPMGR_ACTION_STANDBY_H_ #define _REPMGR_ACTION_STANDBY_H_
typedef struct
{
int reachable_sibling_node_count;
int reachable_sibling_nodes_with_slot_count;
int unreachable_sibling_node_count;
int min_required_wal_senders;
int min_required_free_slots;
} SiblingNodeStats;
#define T_SIBLING_NODES_STATS_INITIALIZER { \
0, \
0, \
0, \
0, \
0 \
}
typedef struct
{
RepmgrdInfo **repmgrd_info;
int repmgrd_running_count;
bool dry_run_success;
/* store list of configuration files on the demotion candidate */
KeyValueList remote_config_files;
/* used for handling repmgrd pause/unpause */
NodeInfoList all_nodes;
NodeInfoList sibling_nodes;
SiblingNodeStats sibling_nodes_stats;
t_event_info event_info;
int remote_node_id;
t_node_info remote_node_record;
t_node_info local_node_record;
char remote_conninfo[MAXCONNINFO];
bool switchover_success;
RecoveryType recovery_type;
PGconn *superuser_conn;
/* the remote server is the primary to be demoted */
char remote_host[MAXLEN];
int remote_repmgr_version;
PGconn *remote_conn;
PGconn *local_conn;
} t_standby_switchover_rec;
#define T_STANDBY_SWITCHOVER_INITIALIZER { \
NULL, \
true, \
{NULL, NULL}, \
T_NODE_INFO_LIST_INITIALIZER, \
T_NODE_INFO_LIST_INITIALIZER, \
T_SIBLING_NODES_STATS_INITIALIZER, \
T_EVENT_INFO_INITIALIZER, \
UNKNOWN_NODE_ID, \
T_NODE_INFO_INITIALIZER, \
T_NODE_INFO_INITIALIZER, \
"", \
true, \
RECTYPE_UNKNOWN, \
NULL, \
"", \
UNKNOWN_REPMGR_VERSION_NUM, \
NULL, \
NULL \
}
extern void do_standby_clone(void); extern void do_standby_clone(void);
extern void do_standby_register(void); extern void do_standby_register(void);
extern void do_standby_unregister(void); extern void do_standby_unregister(void);

View File

@@ -90,22 +90,17 @@ char pg_bindir[MAXPGPATH] = "";
*/ */
t_node_info target_node_info = T_NODE_INFO_INITIALIZER; t_node_info target_node_info = T_NODE_INFO_INITIALIZER;
/* set by the first call to _determine_replication_slot_user() */ /* used by create_replication_slot() */
static t_user_type ReplicationSlotUser = USER_TYPE_UNKNOWN; static t_user_type ReplicationSlotUser = USER_TYPE_UNKNOWN;
/* Collate command line errors and warnings here for friendlier reporting */ /* Collate command line errors and warnings here for friendlier reporting */
static ItemList cli_errors = {NULL, NULL}; static ItemList cli_errors = {NULL, NULL};
static ItemList cli_warnings = {NULL, NULL}; static ItemList cli_warnings = {NULL, NULL};
static void _determine_replication_slot_user(PGconn *conn, static void _determine_replication_slot_user(PGconn *conn,
t_node_info *upstream_node_record, t_node_info *upstream_node_record,
char **replication_user); char **replication_user);
static PGconn *_get_replication_slot_connection(PGconn *conn,
char *replication_user,
bool *use_replication_protocol);
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
@@ -3192,11 +3187,6 @@ copy_remote_files(char *host, char *remote_user, char *remote_path,
" --exclude=pg_xlog/* --exclude=pg_log/*"); " --exclude=pg_xlog/* --exclude=pg_log/*");
} }
/*
* From PostgreSQL 15, the core server no longer uses pg_stat_tmp,
* but some extensions (e.g. pg_stat_statements) may still do, so
* keep excluding it.
*/
appendPQExpBufferStr(&rsync_flags, appendPQExpBufferStr(&rsync_flags,
" --exclude=pg_stat_tmp/*"); " --exclude=pg_stat_tmp/*");
@@ -3634,8 +3624,8 @@ can_use_pg_rewind(PGconn *conn, const char *data_directory, PQExpBufferData *rea
/* "full_page_writes" must be on in any case */ /* "full_page_writes" must be on in any case */
if (guc_set(conn, "full_page_writes", "=", "off")) if (guc_set(conn, "full_page_writes", "=", "off"))
{ {
appendPQExpBufferStr(reason, appendPQExpBuffer(reason,
_("\"full_page_writes\" must be set to \"on\"")); _("\"full_page_writes\" must be set to \"on\""));
can_use = false; can_use = false;
} }
@@ -3653,18 +3643,18 @@ can_use_pg_rewind(PGconn *conn, const char *data_directory, PQExpBufferData *rea
if (data_checksum_version == UNKNOWN_DATA_CHECKSUM_VERSION) if (data_checksum_version == UNKNOWN_DATA_CHECKSUM_VERSION)
{ {
if (can_use == false) if (can_use == false)
appendPQExpBufferStr(reason, "; "); appendPQExpBuffer(reason, "; ");
appendPQExpBufferStr(reason, appendPQExpBuffer(reason,
_("\"wal_log_hints\" is set to \"off\" but unable to determine data checksum version")); _("\"wal_log_hints\" is set to \"off\" but unable to determine data checksum version"));
can_use = false; can_use = false;
} }
else if (data_checksum_version == 0) else if (data_checksum_version == 0)
{ {
if (can_use == false) if (can_use == false)
appendPQExpBufferStr(reason, "; "); appendPQExpBuffer(reason, "; ");
appendPQExpBufferStr(reason, appendPQExpBuffer(reason,
_("\"wal_log_hints\" is set to \"off\" and data checksums are disabled")); _("\"wal_log_hints\" is set to \"off\" and data checksums are disabled"));
can_use = false; can_use = false;
@@ -3744,7 +3734,6 @@ create_replication_slot(PGconn *conn, char *slot_name, t_node_info *upstream_nod
char *replication_user = NULL; char *replication_user = NULL;
_determine_replication_slot_user(conn, upstream_node_record, &replication_user); _determine_replication_slot_user(conn, upstream_node_record, &replication_user);
/* /*
* If called in --dry-run context, if the replication slot user is not the * If called in --dry-run context, if the replication slot user is not the
* repmgr user, attempt to validate the connection. * repmgr user, attempt to validate the connection.
@@ -3756,7 +3745,7 @@ create_replication_slot(PGconn *conn, char *slot_name, t_node_info *upstream_nod
case USER_TYPE_UNKNOWN: case USER_TYPE_UNKNOWN:
log_error("unable to determine user for replication slot creation"); log_error("unable to determine user for replication slot creation");
return false; return false;
case REPMGR_USER: case REPMGR_USER:
log_info(_("replication slots will be created by user \"%s\""), log_info(_("replication slots will be created by user \"%s\""),
PQuser(conn)); PQuser(conn));
return true; return true;
@@ -3802,12 +3791,65 @@ create_replication_slot(PGconn *conn, char *slot_name, t_node_info *upstream_nod
PQfinish(superuser_conn); PQfinish(superuser_conn);
} }
} }
} }
slot_conn = _get_replication_slot_connection(conn, replication_user, &use_replication_protocol); /*
* If we can't create a replication slot with the connection provided to
* the function, create an connection with appropriate permissions.
*/
switch (ReplicationSlotUser)
{
case USER_TYPE_UNKNOWN:
log_error("unable to determine user for replication slot creation");
return false;
case REPMGR_USER:
slot_conn = conn;
log_info(_("creating replication slot as user \"%s\""),
PQuser(conn));
break;
if (slot_conn == NULL) case REPLICATION_USER_NODE:
return false; case REPLICATION_USER_OPT:
{
slot_conn = duplicate_connection(conn,
replication_user,
true);
if (slot_conn == NULL || PQstatus(slot_conn) != CONNECTION_OK)
{
log_error(_("unable to create replication connection as user \"%s\""),
runtime_options.replication_user);
log_detail("%s", PQerrorMessage(slot_conn));
PQfinish(slot_conn);
return false;
}
use_replication_protocol = true;
log_info(_("creating replication slot as replication user \"%s\""),
replication_user);
}
break;
case SUPERUSER:
{
slot_conn = duplicate_connection(conn,
runtime_options.superuser,
false);
if (slot_conn == NULL || PQstatus(slot_conn )!= CONNECTION_OK)
{
log_error(_("unable to create super connection as user \"%s\""),
runtime_options.superuser);
log_detail("%s", PQerrorMessage(slot_conn));
PQfinish(slot_conn);
return false;
}
log_info(_("creating replication slot as superuser \"%s\""),
runtime_options.superuser);
}
break;
}
if (use_replication_protocol == true) if (use_replication_protocol == true)
{ {
@@ -3850,53 +3892,34 @@ drop_replication_slot_if_exists(PGconn *conn, int node_id, char *slot_name)
if (record_status != RECORD_FOUND) if (record_status != RECORD_FOUND)
{ {
/* no slot, no problem */ /* this is not a bad good thing */
log_verbose(LOG_INFO, log_verbose(LOG_INFO,
_("slot \"%s\" does not exist on node %i, nothing to remove"), _("slot \"%s\" does not exist on node %i, nothing to remove"),
slot_name, node_id); slot_name, node_id);
return true; return true;
} }
if (slot_info.active == true) if (slot_info.active == false)
{ {
/* if (drop_replication_slot_sql(conn, slot_name) == true)
* If an active replication slot exists, bail out as we have a problem
* we can't solve here.
*/
log_warning(_("replication slot \"%s\" is still active on node %i"), slot_name, node_id);
success = false;
}
else
{
/*
* Create the appropriate connection with which to drop the slot
*/
bool use_replication_protocol = false;
PGconn *slot_conn = _get_replication_slot_connection(conn,
replication_user,
&use_replication_protocol);
if (use_replication_protocol == true)
{
success = drop_replication_slot_replprot(slot_conn, slot_name);
}
else
{
success = drop_replication_slot_sql(slot_conn, slot_name);
}
if (success == true)
{ {
log_notice(_("replication slot \"%s\" deleted on node %i"), slot_name, node_id); log_notice(_("replication slot \"%s\" deleted on node %i"), slot_name, node_id);
} }
else else
{ {
log_error(_("unable to delete replication slot \"%s\" on node %i"), slot_name, node_id); log_error(_("unable to delete replication slot \"%s\" on node %i"), slot_name, node_id);
success = false;
} }
}
if (slot_conn != conn) /*
PQfinish(slot_conn); * If an active replication slot exists, call Houston as we have a
* problem.
*/
else
{
log_warning(_("replication slot \"%s\" is still active on node %i"), slot_name, node_id);
success = false;
} }
return success; return success;
@@ -3958,88 +3981,10 @@ _determine_replication_slot_user(PGconn *conn, t_node_info *upstream_node_record
ReplicationSlotUser = REPLICATION_USER_NODE; ReplicationSlotUser = REPLICATION_USER_NODE;
*replication_user = upstream_node_record->repluser; *replication_user = upstream_node_record->repluser;
} }
else
{
/* This should never happen */
log_error("unable to determine replication slot user");
if (upstream_node_record != NULL)
{
log_debug("%i %s %s", upstream_node_record->node_id, upstream_node_record->repluser, PQuser(conn));
}
else
{
log_debug("upstream_node_record not provided");
}
}
} }
} }
static PGconn *
_get_replication_slot_connection(PGconn *conn, char *replication_user, bool *use_replication_protocol)
{
PGconn *slot_conn = NULL;
/*
* If we can't create a replication slot with the connection provided to
* the function, create an connection with appropriate permissions.
*/
switch (ReplicationSlotUser)
{
case USER_TYPE_UNKNOWN:
log_error("unable to determine user for managing replication slots");
return NULL;
case REPMGR_USER:
slot_conn = conn;
log_verbose(LOG_INFO, _("managing replication slot as user \"%s\""),
PQuser(conn));
break;
case REPLICATION_USER_NODE:
case REPLICATION_USER_OPT:
{
slot_conn = duplicate_connection(conn,
replication_user,
true);
if (slot_conn == NULL || PQstatus(slot_conn) != CONNECTION_OK)
{
log_error(_("unable to manage replication connection as replication user \"%s\""),
runtime_options.replication_user);
log_detail("%s", PQerrorMessage(slot_conn));
PQfinish(slot_conn);
return NULL;
}
*use_replication_protocol = true;
log_verbose(LOG_INFO, _("managing replication slot as replication user \"%s\""),
replication_user);
}
break;
case SUPERUSER:
{
slot_conn = duplicate_connection(conn,
runtime_options.superuser,
false);
if (slot_conn == NULL || PQstatus(slot_conn )!= CONNECTION_OK)
{
log_error(_("unable to create superuser connection as user \"%s\""),
runtime_options.superuser);
log_detail("%s", PQerrorMessage(slot_conn));
PQfinish(slot_conn);
return NULL;
}
log_verbose(LOG_INFO, _("creating replication slot as superuser \"%s\""),
runtime_options.superuser);
}
break;
}
return slot_conn;
}
bool bool
check_replication_slots_available(int node_id, PGconn* conn) check_replication_slots_available(int node_id, PGconn* conn)
{ {

View File

@@ -80,16 +80,12 @@ typedef struct repmgrdSharedState
static repmgrdSharedState *shared_state = NULL; static repmgrdSharedState *shared_state = NULL;
#if (PG_VERSION_NUM >= 150000)
static shmem_request_hook_type prev_shmem_request_hook = NULL;
#endif
static shmem_startup_hook_type prev_shmem_startup_hook = NULL; static shmem_startup_hook_type prev_shmem_startup_hook = NULL;
void _PG_init(void);
#if (PG_VERSION_NUM >= 150000) void _PG_init(void);
static void repmgr_shmem_request(void); void _PG_fini(void);
#endif
static void repmgr_shmem_startup(void); static void repmgr_shmem_startup(void);
PG_FUNCTION_INFO_V1(repmgr_set_local_node_id); PG_FUNCTION_INFO_V1(repmgr_set_local_node_id);
@@ -121,47 +117,35 @@ _PG_init(void)
if (!process_shared_preload_libraries_in_progress) if (!process_shared_preload_libraries_in_progress)
return; return;
#if (PG_VERSION_NUM < 150000)
RequestAddinShmemSpace(MAXALIGN(sizeof(repmgrdSharedState))); RequestAddinShmemSpace(MAXALIGN(sizeof(repmgrdSharedState)));
#if (PG_VERSION_NUM >= 90600) #if (PG_VERSION_NUM >= 90600)
RequestNamedLWLockTranche(TRANCHE_NAME, 1); RequestNamedLWLockTranche(TRANCHE_NAME, 1);
#else #else
RequestAddinLWLocks(1); RequestAddinLWLocks(1);
#endif
#endif #endif
/* /*
* Install hooks. * Install hooks.
*/ */
#if (PG_VERSION_NUM >= 150000)
prev_shmem_request_hook = shmem_request_hook;
shmem_request_hook = repmgr_shmem_request;
#endif
prev_shmem_startup_hook = shmem_startup_hook; prev_shmem_startup_hook = shmem_startup_hook;
shmem_startup_hook = repmgr_shmem_startup; shmem_startup_hook = repmgr_shmem_startup;
} }
#if (PG_VERSION_NUM >= 150000)
/* /*
* shmem_requst_hook: request shared memory * Module unload callback
*/ */
static void void
repmgr_shmem_request(void) _PG_fini(void)
{ {
if (prev_shmem_request_hook) /* Uninstall hook */
prev_shmem_request_hook(); shmem_startup_hook = prev_shmem_startup_hook;
RequestAddinShmemSpace(MAXALIGN(sizeof(repmgrdSharedState)));
RequestNamedLWLockTranche(TRANCHE_NAME, 1);
} }
#endif
/* /*
* shmem_startup hook: allocate or attach to shared memory * shmem_startup hook: allocate or attach to shared memory,
*/ */
static void static void
repmgr_shmem_startup(void) repmgr_shmem_startup(void)

View File

@@ -398,7 +398,7 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
# #
# Debian/Ubuntu users: use "sudo pg_ctlcluster" to execute service control commands. # Debian/Ubuntu users: use "sudo pg_ctlcluster" to execute service control commands.
# #
# For more details, see: https://repmgr.org/docs/current/configuration-file-service-commands.html # For more details, see: https://repmgr.org/docs/current/configuration-service-commands.html
#service_start_command = '' #service_start_command = ''
#service_stop_command = '' #service_stop_command = ''

View File

@@ -1,6 +1,6 @@
# repmgr extension # repmgr extension
comment = 'Replication manager for PostgreSQL' comment = 'Replication manager for PostgreSQL'
default_version = '5.4' default_version = '5.3'
module_pathname = '$libdir/repmgr' module_pathname = '$libdir/repmgr'
relocatable = false relocatable = false
schema = repmgr schema = repmgr

View File

@@ -1,7 +1,7 @@
#define REPMGR_VERSION_DATE "" #define REPMGR_VERSION_DATE ""
#define REPMGR_VERSION "5.4dev" #define REPMGR_VERSION "5.3.1"
#define REPMGR_VERSION_NUM 50400 #define REPMGR_VERSION_NUM 50301
#define REPMGR_EXTENSION_VERSION "5.4" #define REPMGR_EXTENSION_VERSION "5.3"
#define REPMGR_EXTENSION_NUM 50400 #define REPMGR_EXTENSION_NUM 50300
#define REPMGR_RELEASE_DATE "2022-XX-XX" #define REPMGR_RELEASE_DATE "2022-02-15"
#define PG_ACTUAL_VERSION_NUM #define PG_ACTUAL_VERSION_NUM

View File

@@ -1587,22 +1587,22 @@ monitor_streaming_standby(void)
/* TODO: possibly add pre-action event here */ /* TODO: possibly add pre-action event here */
if (upstream_node_info.type == STANDBY) if (upstream_node_info.type == STANDBY)
{ {
create_event_notification(primary_conn, create_event_record(primary_conn,
&config_file_options, &config_file_options,
config_file_options.node_id, config_file_options.node_id,
"repmgrd_upstream_disconnect", "repmgrd_upstream_disconnect",
true, true,
event_details.data); event_details.data);
} }
else else
{ {
/* primary connection lost - script notification only */ /* primary connection lost - script notification only */
create_event_notification(NULL, create_event_record(NULL,
&config_file_options, &config_file_options,
config_file_options.node_id, config_file_options.node_id,
"repmgrd_upstream_disconnect", "repmgrd_upstream_disconnect",
true, true,
event_details.data); event_details.data);
} }
log_warning("%s", event_details.data); log_warning("%s", event_details.data);
@@ -2382,18 +2382,6 @@ monitor_streaming_witness(void)
log_warning(_("unable to retrieve node record from primary")); log_warning(_("unable to retrieve node record from primary"));
} }
/* refresh local node record from the primary */
record_status = get_node_record(primary_conn, config_file_options.node_id, &local_node_info);
if (record_status != RECORD_FOUND)
{
log_error(_("no metadata record found for this node on the current primary - terminating"));
log_hint(_("check that 'repmgr witness register' was executed for this node"));
close_connection(&primary_conn);
close_connection(&local_conn);
terminate(ERR_BAD_CONFIG);
}
initPQExpBuffer(&event_details); initPQExpBuffer(&event_details);
appendPQExpBuffer(&event_details, appendPQExpBuffer(&event_details,
@@ -2482,12 +2470,12 @@ monitor_streaming_witness(void)
_("unable to connect to primary node \"%s\" (ID: %i)"), _("unable to connect to primary node \"%s\" (ID: %i)"),
upstream_node_info.node_name, upstream_node_info.node_id); upstream_node_info.node_name, upstream_node_info.node_id);
create_event_notification(NULL, create_event_record(NULL,
&config_file_options, &config_file_options,
config_file_options.node_id, config_file_options.node_id,
"repmgrd_upstream_disconnect", "repmgrd_upstream_disconnect",
true, true,
event_details.data); event_details.data);
termPQExpBuffer(&event_details); termPQExpBuffer(&event_details);
} }
@@ -2862,7 +2850,6 @@ do_primary_failover(void)
bool final_result = false; bool final_result = false;
NodeInfoList sibling_nodes = T_NODE_INFO_LIST_INITIALIZER; NodeInfoList sibling_nodes = T_NODE_INFO_LIST_INITIALIZER;
int new_primary_id = UNKNOWN_NODE_ID; int new_primary_id = UNKNOWN_NODE_ID;
bool standby_disconnect_on_failover = false;
/* /*
* Double-check status of the local connection * Double-check status of the local connection
@@ -2875,20 +2862,20 @@ do_primary_failover(void)
*/ */
if (config_file_options.standby_disconnect_on_failover == true) if (config_file_options.standby_disconnect_on_failover == true)
{ {
/* NodeInfoListCell *cell = NULL;
* Determine whether we can actually disable the walsender; this depends NodeInfoList check_sibling_nodes = T_NODE_INFO_LIST_INITIALIZER;
* on PostgreSQL version and user permissions. int i;
*/
standby_disconnect_on_failover = can_disable_walsender(local_conn);
if (standby_disconnect_on_failover == true) bool sibling_node_wal_receiver_connected = false;
if (PQserverVersion(local_conn) < 90500)
{
log_warning(_("\"standby_disconnect_on_failover\" specified, but not available for this PostgreSQL version"));
/* TODO: format server version */
log_detail(_("available from PostgreSQL 9.5, this PostgreSQL version is %i"), PQserverVersion(local_conn));
}
else
{ {
NodeInfoListCell *cell = NULL;
NodeInfoList check_sibling_nodes = T_NODE_INFO_LIST_INITIALIZER;
int i;
bool sibling_node_wal_receiver_connected = false;
disable_wal_receiver(local_conn); disable_wal_receiver(local_conn);
/* /*
@@ -2972,7 +2959,7 @@ do_primary_failover(void)
log_debug("election result: %s", _print_election_result(election_result)); log_debug("election result: %s", _print_election_result(election_result));
/* Reenable WAL receiver, if disabled */ /* Reenable WAL receiver, if disabled */
if (standby_disconnect_on_failover == true) if (config_file_options.standby_disconnect_on_failover == true)
{ {
/* adjust "wal_retrieve_retry_interval" but don't wait for WAL receiver to start */ /* adjust "wal_retrieve_retry_interval" but don't wait for WAL receiver to start */
enable_wal_receiver(local_conn, false); enable_wal_receiver(local_conn, false);

View File

@@ -479,7 +479,7 @@ main(int argc, char **argv)
switch (config_file_options.replication_type) switch (config_file_options.replication_type)
{ {
case REPLICATION_TYPE_PHYSICAL: case REPLICATION_TYPE_PHYSICAL:
log_hint(_("check that 'repmgr (primary|standby|witness) register' was executed for this node")); log_hint(_("check that 'repmgr (primary|standby) register' was executed for this node"));
break; break;
} }