mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-23 15:16:29 +00:00
Compare commits
1 Commits
dev/v5.5.0
...
dev/codeow
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
412d029dc8 |
@@ -32,9 +32,7 @@ DATA = \
|
|||||||
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.3--5.4.sql \
|
||||||
repmgr--5.4.sql \
|
repmgr--5.4.sql
|
||||||
repmgr--5.4--5.5.sql \
|
|
||||||
repmgr--5.5.sql
|
|
||||||
|
|
||||||
REGRESS = repmgr_extension
|
REGRESS = repmgr_extension
|
||||||
|
|
||||||
|
|||||||
15
README.md
15
README.md
@@ -7,9 +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.5.x) supports all PostgreSQL versions from
|
The most recent `repmgr` version (5.3.2) supports all PostgreSQL versions from
|
||||||
13 to 17. Despite it could be used with some older ones, some features might not
|
9.5 to 15. PostgreSQL 9.4 is also supported, with some restrictions.
|
||||||
be available, however, it's strongly recommended to use the latest version.
|
|
||||||
|
|
||||||
`repmgr` is distributed under the GNU GPL 3 and maintained by EnterpriseDB.
|
`repmgr` is distributed under the GNU GPL 3 and maintained by EnterpriseDB.
|
||||||
|
|
||||||
@@ -57,6 +56,8 @@ There is a mailing list/forum to discuss contributions or issues:
|
|||||||
|
|
||||||
* https://groups.google.com/group/repmgr
|
* https://groups.google.com/group/repmgr
|
||||||
|
|
||||||
|
The IRC channel #repmgr is registered with freenode.
|
||||||
|
|
||||||
Please report bugs and other issues to:
|
Please report bugs and other issues to:
|
||||||
|
|
||||||
* https://github.com/EnterpriseDB/repmgr
|
* https://github.com/EnterpriseDB/repmgr
|
||||||
@@ -68,14 +69,6 @@ news are always welcome.
|
|||||||
|
|
||||||
Thanks from the repmgr core team.
|
Thanks from the repmgr core team.
|
||||||
|
|
||||||
* Ian Barwick
|
|
||||||
* Israel Barth
|
|
||||||
* Mario González
|
|
||||||
* Martín Marqués
|
|
||||||
* Gianni Ciolli
|
|
||||||
|
|
||||||
Past contributors:
|
|
||||||
|
|
||||||
* Jaime Casanova
|
* Jaime Casanova
|
||||||
* Abhijit Menon-Sen
|
* Abhijit Menon-Sen
|
||||||
* Simon Riggs
|
* Simon Riggs
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
AC_INIT([repmgr], [5.5.0], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/])
|
AC_INIT([repmgr], [5.4.0], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/])
|
||||||
|
|
||||||
AC_COPYRIGHT([Copyright (c) 2010-2024, EnterpriseDB Corporation])
|
AC_COPYRIGHT([Copyright (c) 2010-2021, EnterpriseDB Corporation])
|
||||||
|
|
||||||
AC_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
|
|||||||
54
dbutils.c
54
dbutils.c
@@ -1852,51 +1852,6 @@ get_wal_receiver_pid(PGconn *conn)
|
|||||||
/* =============================== */
|
/* =============================== */
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Determine if the user associated with the current connection can execute CHECKPOINT command.
|
|
||||||
* User must be a supersuer or a member of the pg_checkpoint default role (available from PostgreSQL 15).
|
|
||||||
*/
|
|
||||||
bool
|
|
||||||
can_execute_checkpoint(PGconn *conn)
|
|
||||||
{
|
|
||||||
PQExpBufferData query;
|
|
||||||
PGresult *res;
|
|
||||||
bool has_pg_checkpoint_role = false;
|
|
||||||
|
|
||||||
/* superusers can do anything, no role check needed */
|
|
||||||
if (is_superuser_connection(conn, NULL) == true)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
/* pg_checkpoint available from PostgreSQL 15 */
|
|
||||||
if (PQserverVersion(conn) < 150000)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
initPQExpBuffer(&query);
|
|
||||||
appendPQExpBufferStr(&query,
|
|
||||||
" SELECT pg_catalog.pg_has_role('pg_checkpoint','USAGE') ");
|
|
||||||
|
|
||||||
res = PQexec(conn, query.data);
|
|
||||||
|
|
||||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
|
||||||
{
|
|
||||||
log_db_error(conn, query.data,
|
|
||||||
_("can_execute_checkpoint(): unable to query user roles"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
has_pg_checkpoint_role = atobool(PQgetvalue(res, 0, 0));
|
|
||||||
}
|
|
||||||
termPQExpBuffer(&query);
|
|
||||||
PQclear(res);
|
|
||||||
|
|
||||||
return has_pg_checkpoint_role;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Determine if the user associated with the current connection
|
|
||||||
* has sufficient permissions to use pg_promote function
|
|
||||||
*/
|
|
||||||
bool
|
bool
|
||||||
can_execute_pg_promote(PGconn *conn)
|
can_execute_pg_promote(PGconn *conn)
|
||||||
{
|
{
|
||||||
@@ -2024,13 +1979,13 @@ connection_has_pg_monitor_role(PGconn *conn, const char *subrole)
|
|||||||
initPQExpBuffer(&query);
|
initPQExpBuffer(&query);
|
||||||
appendPQExpBufferStr(&query,
|
appendPQExpBufferStr(&query,
|
||||||
" SELECT CASE "
|
" SELECT CASE "
|
||||||
" WHEN pg_catalog.pg_has_role('pg_monitor','USAGE') "
|
" WHEN pg_catalog.pg_has_role('pg_monitor','MEMBER') "
|
||||||
" THEN TRUE ");
|
" THEN TRUE ");
|
||||||
|
|
||||||
if (subrole != NULL)
|
if (subrole != NULL)
|
||||||
{
|
{
|
||||||
appendPQExpBuffer(&query,
|
appendPQExpBuffer(&query,
|
||||||
" WHEN pg_catalog.pg_has_role('%s','USAGE') "
|
" WHEN pg_catalog.pg_has_role('%s','MEMBER') "
|
||||||
" THEN TRUE ",
|
" THEN TRUE ",
|
||||||
subrole);
|
subrole);
|
||||||
}
|
}
|
||||||
@@ -2537,10 +2492,7 @@ get_repmgr_extension_status(PGconn *conn, t_extension_versions *extversions)
|
|||||||
/* node management functions */
|
/* node management functions */
|
||||||
/* ========================= */
|
/* ========================= */
|
||||||
|
|
||||||
/*
|
/* assumes superuser connection */
|
||||||
* Assumes the connection can execute CHECKPOINT command.
|
|
||||||
* A check can be executed via 'can_execute_checkpoint' function.
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
checkpoint(PGconn *conn)
|
checkpoint(PGconn *conn)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -453,7 +453,6 @@ TimeLineHistoryEntry *get_timeline_history(PGconn *repl_conn, TimeLineID tli);
|
|||||||
pid_t get_wal_receiver_pid(PGconn *conn);
|
pid_t get_wal_receiver_pid(PGconn *conn);
|
||||||
|
|
||||||
/* user/role information functions */
|
/* user/role information functions */
|
||||||
bool can_execute_checkpoint(PGconn *conn);
|
|
||||||
bool can_execute_pg_promote(PGconn *conn);
|
bool can_execute_pg_promote(PGconn *conn);
|
||||||
bool can_disable_walsender(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);
|
||||||
|
|||||||
@@ -79,10 +79,6 @@
|
|||||||
Alternatively the meta-role <varname>pg_monitor</varname> can be granted, which includes membership
|
Alternatively the meta-role <varname>pg_monitor</varname> can be granted, which includes membership
|
||||||
of the above predefined roles.
|
of the above predefined roles.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
|
||||||
PostgreSQL 15 introduced the <varname>pg_checkpoint</varname> predefined role which allows a
|
|
||||||
non-superuser &repmgr; database user to perform a CHECKPOINT command.
|
|
||||||
</para>
|
|
||||||
<para>
|
<para>
|
||||||
Membership of these roles can be granted with e.g. <command>GRANT pg_read_all_stats TO repmgr</command>.
|
Membership of these roles can be granted with e.g. <command>GRANT pg_read_all_stats TO repmgr</command>.
|
||||||
</para>
|
</para>
|
||||||
@@ -152,8 +148,6 @@
|
|||||||
<link linkend="repmgr-standby-switchover">repmgr standby switchover</link>. This can only
|
<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,
|
be executed by a superuser; if the &repmgr; user is not a superuser,
|
||||||
the <option>-S</option>/<option>--superuser</option> should be used.
|
the <option>-S</option>/<option>--superuser</option> should be used.
|
||||||
From PostgreSQL 15 the <varname>pg_checkpoint</varname> predefined role removes the need of
|
|
||||||
superuser permissions to perform <command>CHECKPOINT</command> command.
|
|
||||||
</simpara>
|
</simpara>
|
||||||
<simpara>
|
<simpara>
|
||||||
If &repmgr; is not able to execute <command>CHECKPOINT</command>,
|
If &repmgr; is not able to execute <command>CHECKPOINT</command>,
|
||||||
|
|||||||
@@ -77,8 +77,7 @@
|
|||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Note that a superuser connection is required to be able to execute the
|
Note that a superuser connection is required to be able to execute the
|
||||||
<command>CHECKPOINT</command> command. From PostgreSQL 15 the <varname>pg_checkpoint</varname>
|
<command>CHECKPOINT</command> command.
|
||||||
predefined role removes the need for superuser permissions to perform <command>CHECKPOINT</command> command.
|
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|||||||
@@ -79,8 +79,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. From PostgreSQL 15 the <varname>pg_checkpoint</varname>
|
provided with the <option>-S</option>/<option>--superuser</option> option.
|
||||||
predefined role removes the need for superuser permissions to perform <command>CHECKPOINT</command> command.
|
|
||||||
</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
|
||||||
|
|||||||
@@ -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
|
|
||||||
191
repmgr--5.5.sql
191
repmgr--5.5.sql
@@ -1,191 +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
|
|
||||||
);
|
|
||||||
@@ -2365,26 +2365,19 @@ do_node_service(void)
|
|||||||
conn = establish_db_connection_by_params(&source_conninfo, true);
|
conn = establish_db_connection_by_params(&source_conninfo, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (can_execute_checkpoint(conn) == false)
|
if (is_superuser_connection(conn, NULL) == false)
|
||||||
{
|
{
|
||||||
if (runtime_options.dry_run == true)
|
if (runtime_options.dry_run == true)
|
||||||
{
|
{
|
||||||
log_warning(_("a CHECKPOINT would be issued here but no authorized connection is available"));
|
log_warning(_("a CHECKPOINT would be issued here but no superuser connection is available"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_warning(_("an authorized connection is required to issue a CHECKPOINT"));
|
log_warning(_("a superuser connection is required to issue a CHECKPOINT"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PQserverVersion(conn) >= 150000)
|
|
||||||
{
|
|
||||||
log_hint(_("provide a superuser with -S/--superuser or grant pg_checkpoint role to repmgr user"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log_hint(_("provide a superuser with -S/--superuser"));
|
log_hint(_("provide a superuser with -S/--superuser"));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (runtime_options.dry_run == true)
|
if (runtime_options.dry_run == true)
|
||||||
|
|||||||
@@ -5288,7 +5288,7 @@ do_standby_switchover(void)
|
|||||||
checkpoint_conn = superuser_conn;
|
checkpoint_conn = superuser_conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (can_execute_checkpoint(checkpoint_conn) == true)
|
if (is_superuser_connection(checkpoint_conn, NULL) == true)
|
||||||
{
|
{
|
||||||
log_notice(_("issuing CHECKPOINT on node \"%s\" (ID: %i) "),
|
log_notice(_("issuing CHECKPOINT on node \"%s\" (ID: %i) "),
|
||||||
config_file_options.node_name,
|
config_file_options.node_name,
|
||||||
@@ -5297,16 +5297,7 @@ do_standby_switchover(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_warning(_("no authorized connection available, unable to issue CHECKPOINT"));
|
log_warning(_("no superuser connection available, unable to issue CHECKPOINT"));
|
||||||
|
|
||||||
if (PQserverVersion(local_conn) >= 150000)
|
|
||||||
{
|
|
||||||
log_hint(_("provide a superuser with -S/--superuser or grant pg_checkpoint role to repmgr user"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log_hint(_("provide a superuser with -S/--superuser"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,11 +70,7 @@
|
|||||||
#include "repmgr-action-service.h"
|
#include "repmgr-action-service.h"
|
||||||
#include "repmgr-action-daemon.h"
|
#include "repmgr-action-daemon.h"
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= 170000)
|
|
||||||
#include <common/file_utils.h> /* for PG_TEMP_FILE_PREFIX */
|
|
||||||
#else
|
|
||||||
#include <storage/fd.h> /* for PG_TEMP_FILE_PREFIX */
|
#include <storage/fd.h> /* for PG_TEMP_FILE_PREFIX */
|
||||||
#endif
|
|
||||||
|
|
||||||
/* globally available variables *
|
/* globally available variables *
|
||||||
* ============================ */
|
* ============================ */
|
||||||
|
|||||||
@@ -299,7 +299,7 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
# a value of zero prevents the node being promoted to primary
|
# a value of zero prevents the node being promoted to primary
|
||||||
# (default: 100)
|
# (default: 100)
|
||||||
|
|
||||||
#connection_check_type='ping' # How to check availability of the upstream node; valid options:
|
#connection_check_type=ping # How to check availability of the upstream node; valid options:
|
||||||
# 'ping': use PQping() to check if the node is accepting connections
|
# 'ping': use PQping() to check if the node is accepting connections
|
||||||
# 'connection': attempt to make a new connection to the node
|
# 'connection': attempt to make a new connection to the node
|
||||||
# 'query': execute an SQL statement on the node via the existing connection
|
# 'query': execute an SQL statement on the node via the existing connection
|
||||||
@@ -350,21 +350,14 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
# the primary node recently. *Must* be the same on all nodes.
|
# the primary node recently. *Must* be the same on all nodes.
|
||||||
#always_promote=false # Always promote a node, even if repmgr metadata is outdated
|
#always_promote=false # Always promote a node, even if repmgr metadata is outdated
|
||||||
#failover_validation_command='' # Script to execute for an external mechanism to validate the failover
|
#failover_validation_command='' # Script to execute for an external mechanism to validate the failover
|
||||||
# decision made by repmgrd. Each of the following parameter placeholders
|
# decision made by repmgrd. One or both of the following parameter placeholders
|
||||||
# should be provided, which will be replaced by repmgrd with the appropriate value:
|
# should be provided, which will be replaced by repmgrd with the appropriate
|
||||||
# %n (node_id)
|
# value: %n (node_id), %a (node_name). *Must* be the same on all nodes.
|
||||||
# %a (node_name)
|
|
||||||
# %v (number of visible nodes)
|
|
||||||
# %u (number of shared upstream nodes)
|
|
||||||
# %t (total number of nodes)
|
|
||||||
# *Must* be the same on all nodes.
|
|
||||||
#election_rerun_interval=15 # if "failover_validation_command" is set, and the command returns
|
#election_rerun_interval=15 # if "failover_validation_command" is set, and the command returns
|
||||||
# an error, pause the specified amount of seconds before rerunning the election.
|
# an error, pause the specified amount of seconds before rerunning the election.
|
||||||
|
#
|
||||||
# The following items are relevant for repmgrd running on the primary,
|
# The following items are relevant for repmgrd running on the primary,
|
||||||
# and will be ignored on non-primary nodes.
|
# and will be ignored on non-primary nodes
|
||||||
# (see: https://repmgr.org/docs/current/repmgrd-primary-child-disconnection.html )
|
|
||||||
|
|
||||||
#child_nodes_check_interval=5 # Interval (in seconds) to check for attached child nodes (standbys)
|
#child_nodes_check_interval=5 # Interval (in seconds) to check for attached child nodes (standbys)
|
||||||
#child_nodes_connected_min_count=-1 # Minimum number of child nodes which must remain connected, otherwise
|
#child_nodes_connected_min_count=-1 # Minimum number of child nodes which must remain connected, otherwise
|
||||||
# disconnection command will be triggered
|
# disconnection command will be triggered
|
||||||
@@ -372,7 +365,6 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
# (ignored if "child_nodes_connected_min_count" set)
|
# (ignored if "child_nodes_connected_min_count" set)
|
||||||
#child_nodes_disconnect_timeout=30 # Interval between child node disconnection and disconnection command execution
|
#child_nodes_disconnect_timeout=30 # Interval between child node disconnection and disconnection command execution
|
||||||
#child_nodes_disconnect_command='' # Command to execute if child node disconnection detected
|
#child_nodes_disconnect_command='' # Command to execute if child node disconnection detected
|
||||||
#child_nodes_connected_include_witness=false # Whether to count the witness node (if in use) as a child node when determining whether to execute child_nodes_disconnect_command.
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# service control commands
|
# service control commands
|
||||||
@@ -395,20 +387,20 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
#
|
#
|
||||||
# For example, to use systemd, you can set
|
# For example, to use systemd, you can set
|
||||||
#
|
#
|
||||||
# service_start_command = 'sudo systemctl start postgresql-16'
|
# service_start_command = 'sudo systemctl start postgresql-9.6'
|
||||||
# (...)
|
# (...)
|
||||||
#
|
#
|
||||||
# and then use the following sudoers configuration:
|
# and then use the following sudoers configuration:
|
||||||
#
|
#
|
||||||
# # this is required when running sudo over ssh without -t:
|
# # this is required when running sudo over ssh without -t:
|
||||||
# Defaults:postgres !requiretty
|
# Defaults:postgres !requiretty
|
||||||
# postgres ALL = NOPASSWD: /usr/bin/systemctl stop postgresql-16, \
|
# postgres ALL = NOPASSWD: /usr/bin/systemctl stop postgresql-9.6, \
|
||||||
# /usr/bin/systemctl start postgresql-16, \
|
# /usr/bin/systemctl start postgresql-9.6, \
|
||||||
# /usr/bin/systemctl restart postgresql-16
|
# /usr/bin/systemctl restart postgresql-9.6
|
||||||
#
|
#
|
||||||
# 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 further details, see: https://repmgr.org/docs/current/configuration-file-service-commands.html
|
# For more details, see: https://repmgr.org/docs/current/configuration-file-service-commands.html
|
||||||
|
|
||||||
#service_start_command = ''
|
#service_start_command = ''
|
||||||
#service_stop_command = ''
|
#service_stop_command = ''
|
||||||
@@ -451,3 +443,4 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
# "repmgr standby switchover" to warn about potential
|
# "repmgr standby switchover" to warn about potential
|
||||||
# issues with shutting down the demotion candidate.
|
# issues with shutting down the demotion candidate.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#define REPMGR_VERSION_DATE "2024-11-20"
|
#define REPMGR_VERSION_DATE ""
|
||||||
#define REPMGR_VERSION "5.5.0"
|
#define REPMGR_VERSION "5.4dev"
|
||||||
#define REPMGR_VERSION_NUM 50500
|
#define REPMGR_VERSION_NUM 50400
|
||||||
#define REPMGR_EXTENSION_VERSION "5.5.0"
|
#define REPMGR_EXTENSION_VERSION "5.4"
|
||||||
#define REPMGR_EXTENSION_NUM 50500
|
#define REPMGR_EXTENSION_NUM 50400
|
||||||
#define REPMGR_RELEASE_DATE "2024-XX-XX"
|
#define REPMGR_RELEASE_DATE "2022-XX-XX"
|
||||||
#define PG_ACTUAL_VERSION_NUM
|
#define PG_ACTUAL_VERSION_NUM
|
||||||
|
|||||||
Reference in New Issue
Block a user