mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-22 22:56:29 +00:00
Compare commits
64 Commits
v5.5.0
...
REL5_2_STA
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
922b8de46b | ||
|
|
92cd8c30b5 | ||
|
|
fa234919fb | ||
|
|
03c5220e87 | ||
|
|
65bd0878fa | ||
|
|
f1592f009a | ||
|
|
490e51fd7b | ||
|
|
f5c555a7f5 | ||
|
|
de51df9759 | ||
|
|
b094d7b407 | ||
|
|
44cdb7d001 | ||
|
|
f5f8db8ca1 | ||
|
|
0c568da254 | ||
|
|
46042298f7 | ||
|
|
01e89c3ca9 | ||
|
|
7b97a8f04d | ||
|
|
c362d6d03f | ||
|
|
75a2e2a8b4 | ||
|
|
65d59db6d1 | ||
|
|
10cd15bedc | ||
|
|
cae2255d58 | ||
|
|
bc0bc2696e | ||
|
|
7db9afdc10 | ||
|
|
5eb8bccd33 | ||
|
|
4760c11937 | ||
|
|
cb6501aa48 | ||
|
|
6100007a32 | ||
|
|
a415d85530 | ||
|
|
45a9a784e3 | ||
|
|
8ce212327c | ||
|
|
54851e8df1 | ||
|
|
a2166d0024 | ||
|
|
abe55e60e6 | ||
|
|
220bcbd620 | ||
|
|
e824dfd499 | ||
|
|
9fb9decf13 | ||
|
|
ad6dde4218 | ||
|
|
7cbaec6469 | ||
|
|
9d2c5921ee | ||
|
|
21f94e6de3 | ||
|
|
7418c7b8f0 | ||
|
|
7cee09dd95 | ||
|
|
53774d6998 | ||
|
|
5a251ef268 | ||
|
|
b83ce6b147 | ||
|
|
5f9f1f65ae | ||
|
|
9d7eebef1b | ||
|
|
5cff7fab64 | ||
|
|
2a8ac36aec | ||
|
|
a5a5b506f9 | ||
|
|
bd6871817d | ||
|
|
bd35e503ec | ||
|
|
15801b8f9e | ||
|
|
4d3262d306 | ||
|
|
36a8dfcf4f | ||
|
|
94612a336a | ||
|
|
de567d584f | ||
|
|
0fb3432398 | ||
|
|
5e59e543d6 | ||
|
|
4f6b642320 | ||
|
|
c1973438f7 | ||
|
|
fe5904e04e | ||
|
|
2cb1f4f728 | ||
|
|
5b90842c55 |
@@ -2,7 +2,7 @@ License and Contributions
|
|||||||
=========================
|
=========================
|
||||||
|
|
||||||
`repmgr` is licensed under the GPL v3. All of its code and documentation is
|
`repmgr` is licensed under the GPL v3. All of its code and documentation is
|
||||||
Copyright 2010-2020, 2ndQuadrant Limited. See the files COPYRIGHT and LICENSE for
|
Copyright 2010-2021, EnterpriseDB Corporation. See the files COPYRIGHT and LICENSE for
|
||||||
details.
|
details.
|
||||||
|
|
||||||
The development of repmgr has primarily been sponsored by 2ndQuadrant customers.
|
The development of repmgr has primarily been sponsored by 2ndQuadrant customers.
|
||||||
@@ -12,10 +12,10 @@ which has received funding from the European Union's Seventh Framework Programme
|
|||||||
(FP7/2007-2013) under grant agreement 258862.
|
(FP7/2007-2013) under grant agreement 258862.
|
||||||
|
|
||||||
Contributions to `repmgr` are welcome, and will be listed in the file `CREDITS`.
|
Contributions to `repmgr` are welcome, and will be listed in the file `CREDITS`.
|
||||||
2ndQuadrant Limited requires that any contributions provide a copyright
|
EnterpriseDB Corporation requires that any contributions provide a copyright
|
||||||
assignment and a disclaimer of any work-for-hire ownership claims from the
|
assignment and a disclaimer of any work-for-hire ownership claims from the
|
||||||
employer of the developer. This lets us make sure that all of the repmgr
|
employer of the developer. This lets us make sure that all of the repmgr
|
||||||
distribution remains free code. Please contact info@2ndQuadrant.com for a
|
distribution remains free code. Please contact info@enterprise.com for a
|
||||||
copy of the relevant Copyright Assignment Form.
|
copy of the relevant Copyright Assignment Form.
|
||||||
|
|
||||||
Code style
|
Code style
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2010-2020, 2ndQuadrant Limited
|
Copyright (c) 2010-2021, EnterpriseDB Corporation
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
2
FAQ.md
2
FAQ.md
@@ -5,6 +5,6 @@ The repmgr 4 FAQ is located here: [repmgr FAQ (Frequently Asked Questions)](http
|
|||||||
|
|
||||||
The repmgr 3.x FAQ can be found here:
|
The repmgr 3.x FAQ can be found here:
|
||||||
|
|
||||||
https://github.com/2ndQuadrant/repmgr/blob/REL3_3_STABLE/FAQ.md
|
https://github.com/EnterpriseDB/repmgr/blob/REL3_3_STABLE/FAQ.md
|
||||||
|
|
||||||
Note that repmgr 3.x is no longer supported.
|
Note that repmgr 3.x is no longer supported.
|
||||||
|
|||||||
20
HISTORY
20
HISTORY
@@ -1,4 +1,20 @@
|
|||||||
5.2.0 2020-??-??
|
5.2.2. 2021-??-??
|
||||||
|
standby clone: set "slot_name" in node record if required (Ian)
|
||||||
|
node rejoin: emit rejoin target note information as NOTICE (Ian)
|
||||||
|
repmgrd: ensure short option "-s" is accepted (Ian)
|
||||||
|
|
||||||
|
5.2.1 2020-12-07
|
||||||
|
config: fix parsing of "replication_type"; GitHub #672 (Ian)
|
||||||
|
standby clone: handle missing "postgresql.auto.conf" (Ian)
|
||||||
|
standby clone: add option --recovery-min-apply-delay (Ian)
|
||||||
|
standby clone: fix data directory permissions handling for
|
||||||
|
PostgreSQL 11 and later (Ian)
|
||||||
|
repmgrd: prevent termination when local node not available and
|
||||||
|
standby_disconnect_on_failover; GitHub #675 (Ian)
|
||||||
|
repmgrd: ensure reconnect_interval" is correctly handled;
|
||||||
|
GitHub #673 (Ian)
|
||||||
|
|
||||||
|
5.2.0 2020-10-22
|
||||||
general: add support for PostgreSQL 13 (Ian)
|
general: add support for PostgreSQL 13 (Ian)
|
||||||
general: remove support for PostgreSQL 9.3 (Ian)
|
general: remove support for PostgreSQL 9.3 (Ian)
|
||||||
config: add support for file inclusion directives (Ian)
|
config: add support for file inclusion directives (Ian)
|
||||||
@@ -32,7 +48,7 @@
|
|||||||
repmgr: ensure postgresql.auto.conf is created with correct permissions (Ian)
|
repmgr: ensure postgresql.auto.conf is created with correct permissions (Ian)
|
||||||
repmgr: minimize requirement to check upstream data directory location
|
repmgr: minimize requirement to check upstream data directory location
|
||||||
during "standby clone" (Ian)
|
during "standby clone" (Ian)
|
||||||
repmgr: warn about missing pg_rewind prerequisites when excuting
|
repmgr: warn about missing pg_rewind prerequisites when executing
|
||||||
"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
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ EXTENSION = repmgr
|
|||||||
DATA = \
|
DATA = \
|
||||||
repmgr--unpackaged--4.0.sql \
|
repmgr--unpackaged--4.0.sql \
|
||||||
repmgr--unpackaged--5.1.sql \
|
repmgr--unpackaged--5.1.sql \
|
||||||
|
repmgr--unpackaged--5.2.sql \
|
||||||
repmgr--4.0.sql \
|
repmgr--4.0.sql \
|
||||||
repmgr--4.0--4.1.sql \
|
repmgr--4.0--4.1.sql \
|
||||||
repmgr--4.1.sql \
|
repmgr--4.1.sql \
|
||||||
@@ -75,10 +76,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)
|
||||||
|
|||||||
34
README.md
34
README.md
@@ -7,10 +7,10 @@ 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.
|
||||||
|
|
||||||
PostgreSQL 12, 11, 10, 9.6 and 9.5 are fully supported.
|
The most recent `repmgr` version (5.2.1) supports all PostgreSQL versions from
|
||||||
PostgreSQL 9.4 and 9.3 are 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 2ndQuadrant.
|
`repmgr` is distributed under the GNU GPL 3 and maintained by EnterpriseDB.
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
@@ -21,10 +21,11 @@ The full `repmgr` documentation is available here:
|
|||||||
|
|
||||||
The old `README` file for `repmgr` 3.x is available here:
|
The old `README` file for `repmgr` 3.x is available here:
|
||||||
|
|
||||||
> https://github.com/2ndQuadrant/repmgr/blob/REL3_3_STABLE/README.md
|
> 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;
|
Note that the `repmgr` 3.x series is no longer supported and contains known bugs;
|
||||||
please upgrade to the current `repmgr` version as soon as possible.
|
please upgrade to the [current repmgr version](https://repmgr.org/docs/current/appendix-release-notes.html)
|
||||||
|
as soon as possible.
|
||||||
|
|
||||||
Versions
|
Versions
|
||||||
--------
|
--------
|
||||||
@@ -54,11 +55,11 @@ Directories
|
|||||||
Support and Assistance
|
Support and Assistance
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
2ndQuadrant provides 24x7 production support for `repmgr`, including
|
EnterpriseDB provides 24x7 production support for `repmgr`, including
|
||||||
configuration assistance, installation verification and training for
|
configuration assistance, installation verification and training for
|
||||||
running a robust replication cluster. For further details see:
|
running a robust replication cluster. For further details see:
|
||||||
|
|
||||||
* https://2ndquadrant.com/en/support/
|
* [EDB Support Services](https://www.enterprisedb.com/support/postgresql-support-overview-get-the-most-out-of-postgresql)
|
||||||
|
|
||||||
There is a mailing list/forum to discuss contributions or issues:
|
There is a mailing list/forum to discuss contributions or issues:
|
||||||
|
|
||||||
@@ -68,23 +69,12 @@ 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/2ndQuadrant/repmgr
|
* https://github.com/EnterpriseDB/repmgr
|
||||||
|
|
||||||
See
|
|
||||||
|
|
||||||
Further information is available at https://repmgr.org/
|
Further information is available at https://repmgr.org/
|
||||||
|
|
||||||
We'd love to hear from you about how you use repmgr. Case studies and
|
We'd love to hear from you about how you use repmgr. Case studies and
|
||||||
news are always welcome. Send us an email at info@2ndQuadrant.com, or
|
news are always welcome.
|
||||||
send a postcard to
|
|
||||||
|
|
||||||
repmgr
|
|
||||||
c/o 2ndQuadrant
|
|
||||||
7200 The Quorum
|
|
||||||
Oxford Business Park North
|
|
||||||
Oxford
|
|
||||||
OX4 2JZ
|
|
||||||
United Kingdom
|
|
||||||
|
|
||||||
Thanks from the repmgr core team.
|
Thanks from the repmgr core team.
|
||||||
|
|
||||||
@@ -100,7 +90,3 @@ Further reading
|
|||||||
* [repmgr documentation](https://repmgr.org/docs/current/index.html)
|
* [repmgr documentation](https://repmgr.org/docs/current/index.html)
|
||||||
* [How to Automate PostgreSQL 12 Replication and Failover with repmgr - Part 1](https://www.2ndquadrant.com/en/blog/how-to-automate-postgresql-12-replication-and-failover-with-repmgr-part-1/)
|
* [How to Automate PostgreSQL 12 Replication and Failover with repmgr - Part 1](https://www.2ndquadrant.com/en/blog/how-to-automate-postgresql-12-replication-and-failover-with-repmgr-part-1/)
|
||||||
* [How to Automate PostgreSQL 12 Replication and Failover with repmgr - Part 2](https://www.2ndquadrant.com/en/blog/how-to-automate-postgresql-12-replication-and-failover-with-repmgr-part-2/)
|
* [How to Automate PostgreSQL 12 Replication and Failover with repmgr - Part 2](https://www.2ndquadrant.com/en/blog/how-to-automate-postgresql-12-replication-and-failover-with-repmgr-part-2/)
|
||||||
* https://blog.2ndquadrant.com/repmgr-3-2-is-here-barman-support-brand-new-high-availability-features/
|
|
||||||
* https://blog.2ndquadrant.com/improvements-in-repmgr-3-1-4/
|
|
||||||
* https://blog.2ndquadrant.com/managing-useful-clusters-repmgr/
|
|
||||||
* https://blog.2ndquadrant.com/easier_postgresql_90_clusters/
|
|
||||||
|
|||||||
4
TODO.md
4
TODO.md
@@ -1,7 +1,7 @@
|
|||||||
TODO
|
TODO
|
||||||
====
|
====
|
||||||
|
|
||||||
This file contains a list of improvements which are desireable and/or have
|
This file contains a list of improvements which are desirable and/or have
|
||||||
been requested, and which we aim to address/implement when time and resources
|
been requested, and which we aim to address/implement when time and resources
|
||||||
permit.
|
permit.
|
||||||
|
|
||||||
@@ -17,4 +17,4 @@ repmgrd nodes to prevent unintended failover; this is obviously inconvenient.
|
|||||||
We'll need to implement some way of notifying each repmgrd to suspend automatic
|
We'll need to implement some way of notifying each repmgrd to suspend automatic
|
||||||
failover until further notice.
|
failover until further notice.
|
||||||
|
|
||||||
Requested in GitHub #410 ( https://github.com/2ndQuadrant/repmgr/issues/410 )
|
Requested in GitHub #410 ( https://github.com/EnterpriseDB/repmgr/issues/410 )
|
||||||
|
|||||||
2
compat.c
2
compat.c
@@ -6,7 +6,7 @@
|
|||||||
* supported PostgreSQL versions. They're unlikely to change but
|
* supported PostgreSQL versions. They're unlikely to change but
|
||||||
* it would be worth keeping an eye on them for any fixes/improvements.
|
* it would be worth keeping an eye on them for any fixes/improvements.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
|
|||||||
2
compat.h
2
compat.h
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* compat.h
|
* compat.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
|
|||||||
10
configdata.c
10
configdata.c
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* configdata.c - contains structs with parsed configuration data
|
* configdata.c - contains structs with parsed configuration data
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -120,10 +120,10 @@ struct ConfigFileSetting config_file_settings[] =
|
|||||||
/* replication_type */
|
/* replication_type */
|
||||||
{
|
{
|
||||||
"replication_type",
|
"replication_type",
|
||||||
CONFIG_INT,
|
CONFIG_REPLICATION_TYPE,
|
||||||
{ .intptr = &config_file_options.replication_type },
|
{ .replicationtypeptr = &config_file_options.replication_type },
|
||||||
{ .intdefault = REPLICATION_TYPE_PHYSICAL },
|
{ .replicationtypedefault = DEFAULT_REPLICATION_TYPE },
|
||||||
{ .intminval = -1 },
|
{},
|
||||||
{},
|
{},
|
||||||
{}
|
{}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -107,9 +107,9 @@ ProcessRepmgrConfigFile(const char *config_file, const char *base_dir, ItemList
|
|||||||
|
|
||||||
|
|
||||||
extern bool
|
extern bool
|
||||||
ProcessPostgresConfigFile(const char *config_file, const char *base_dir, KeyValueList *contents, ItemList *error_list, ItemList *warning_list)
|
ProcessPostgresConfigFile(const char *config_file, const char *base_dir, bool strict, KeyValueList *contents, ItemList *error_list, ItemList *warning_list)
|
||||||
{
|
{
|
||||||
return ProcessConfigFile(base_dir, config_file, NULL, true, 0, contents, error_list, warning_list);
|
return ProcessConfigFile(base_dir, config_file, NULL, strict, 0, contents, error_list, warning_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
|||||||
85
configfile.c
85
configfile.c
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* configfile.c - parse repmgr.conf and other configuration-related functionality
|
* configfile.c - parse repmgr.conf and other configuration-related functionality
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -313,6 +313,9 @@ _parse_config(ItemList *error_list, ItemList *warning_list)
|
|||||||
case CONFIG_CONNECTION_CHECK_TYPE:
|
case CONFIG_CONNECTION_CHECK_TYPE:
|
||||||
*setting->val.checktypeptr = setting->defval.checktypedefault;
|
*setting->val.checktypeptr = setting->defval.checktypedefault;
|
||||||
break;
|
break;
|
||||||
|
case CONFIG_REPLICATION_TYPE:
|
||||||
|
*setting->val.replicationtypeptr = setting->defval.replicationtypedefault;
|
||||||
|
break;
|
||||||
case CONFIG_EVENT_NOTIFICATION_LIST:
|
case CONFIG_EVENT_NOTIFICATION_LIST:
|
||||||
case CONFIG_TABLESPACE_MAPPING:
|
case CONFIG_TABLESPACE_MAPPING:
|
||||||
/* no default for these types; lists cleared above */
|
/* no default for these types; lists cleared above */
|
||||||
@@ -566,6 +569,20 @@ parse_configuration_item(ItemList *error_list, ItemList *warning_list, const cha
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CONFIG_REPLICATION_TYPE:
|
||||||
|
{
|
||||||
|
if (strcasecmp(value, "physical") == 0)
|
||||||
|
{
|
||||||
|
*(ReplicationType *)setting->val.replicationtypeptr = REPLICATION_TYPE_PHYSICAL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item_list_append_format(error_list,
|
||||||
|
_("value for \"%s\" must be \"physical\"\n"),
|
||||||
|
name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case CONFIG_EVENT_NOTIFICATION_LIST:
|
case CONFIG_EVENT_NOTIFICATION_LIST:
|
||||||
{
|
{
|
||||||
parse_event_notifications_list((EventNotificationList *)setting->val.notificationlistptr,
|
parse_event_notifications_list((EventNotificationList *)setting->val.notificationlistptr,
|
||||||
@@ -1394,6 +1411,9 @@ dump_config(void)
|
|||||||
case CONFIG_CONNECTION_CHECK_TYPE:
|
case CONFIG_CONNECTION_CHECK_TYPE:
|
||||||
printf("%s", print_connection_check_type(*setting->val.checktypeptr));
|
printf("%s", print_connection_check_type(*setting->val.checktypeptr));
|
||||||
break;
|
break;
|
||||||
|
case CONFIG_REPLICATION_TYPE:
|
||||||
|
printf("%s", print_replication_type(*setting->val.replicationtypeptr));
|
||||||
|
break;
|
||||||
case CONFIG_EVENT_NOTIFICATION_LIST:
|
case CONFIG_EVENT_NOTIFICATION_LIST:
|
||||||
{
|
{
|
||||||
char *list = print_event_notification_list(setting->val.notificationlistptr);
|
char *list = print_event_notification_list(setting->val.notificationlistptr);
|
||||||
@@ -1765,7 +1785,7 @@ modify_auto_conf(const char *data_dir, KeyValueList *items)
|
|||||||
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
mode_t um;
|
mode_t um;
|
||||||
struct stat auto_conf_st;
|
struct stat data_dir_st;
|
||||||
|
|
||||||
KeyValueList config = {NULL, NULL};
|
KeyValueList config = {NULL, NULL};
|
||||||
KeyValueListCell *cell = NULL;
|
KeyValueListCell *cell = NULL;
|
||||||
@@ -1776,7 +1796,12 @@ modify_auto_conf(const char *data_dir, KeyValueList *items)
|
|||||||
appendPQExpBuffer(&auto_conf, "%s/%s",
|
appendPQExpBuffer(&auto_conf, "%s/%s",
|
||||||
data_dir, PG_AUTOCONF_FILENAME);
|
data_dir, PG_AUTOCONF_FILENAME);
|
||||||
|
|
||||||
success = ProcessPostgresConfigFile(auto_conf.data, NULL, &config, NULL, NULL);
|
success = ProcessPostgresConfigFile(auto_conf.data,
|
||||||
|
NULL,
|
||||||
|
false, /* we don't care if the file does not exist */
|
||||||
|
&config,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
if (success == false)
|
if (success == false)
|
||||||
{
|
{
|
||||||
@@ -1787,7 +1812,7 @@ modify_auto_conf(const char *data_dir, KeyValueList *items)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Append requested items to items extracted from the existing file.
|
* Append requested items to any items extracted from the existing file.
|
||||||
*/
|
*/
|
||||||
for (cell = items->head; cell; cell = cell->next)
|
for (cell = items->head; cell; cell = cell->next)
|
||||||
{
|
{
|
||||||
@@ -1816,27 +1841,46 @@ modify_auto_conf(const char *data_dir, KeyValueList *items)
|
|||||||
cell->key, cell->value);
|
cell->key, cell->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
stat(auto_conf.data, &auto_conf_st);
|
/* stat the data directory for the file mode */
|
||||||
|
if (stat(data_dir, &data_dir_st) != 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This is highly unlikely to happen, but if it does (e.g. freak
|
||||||
|
* race condition with some rogue process which is messing about
|
||||||
|
* with the data directory), there's not a lot we can do.
|
||||||
|
*/
|
||||||
|
log_error(_("error encountered when checking \"%s\""),
|
||||||
|
data_dir);
|
||||||
|
log_detail("%s", strerror(errno));
|
||||||
|
exit(ERR_BAD_CONFIG);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set umask so the temporary file is created in the same mode as the original
|
* Set umask so the temporary file is created in the same mode as the data
|
||||||
* postgresql.auto.conf file.
|
* directory. In PostgreSQL 11 and later this can be 0700 or 0750.
|
||||||
*/
|
*/
|
||||||
um = umask(~(auto_conf_st.st_mode));
|
um = umask(~(data_dir_st.st_mode));
|
||||||
|
|
||||||
fp = fopen(auto_conf_tmp.data, "w");
|
fp = fopen(auto_conf_tmp.data, "w");
|
||||||
|
|
||||||
umask(um);
|
umask(um);
|
||||||
|
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "unable to open \"%s\": %s\n",
|
fprintf(stderr, "unable to open \"%s\" for writing: %s\n",
|
||||||
auto_conf_tmp.data,
|
auto_conf_tmp.data,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
|
success = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (fwrite(auto_conf_contents.data, strlen(auto_conf_contents.data), 1, fp) != 1)
|
if (fwrite(auto_conf_contents.data, strlen(auto_conf_contents.data), 1, fp) != 1)
|
||||||
{
|
{
|
||||||
|
fprintf(stderr, "unable to write to \"%s\": %s\n",
|
||||||
|
auto_conf_tmp.data,
|
||||||
|
strerror(errno));
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
success = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1845,7 +1889,7 @@ modify_auto_conf(const char *data_dir, KeyValueList *items)
|
|||||||
/*
|
/*
|
||||||
* Note: durable_rename() is not exposed to frontend code before Pg 10.
|
* Note: durable_rename() is not exposed to frontend code before Pg 10.
|
||||||
* We only really need to be modifying postgresql.auto.conf from Pg 12,
|
* We only really need to be modifying postgresql.auto.conf from Pg 12,
|
||||||
* but provide backwards compatibitilty for Pg 9.6 and earlier for the
|
* but provide backwards compatibility for Pg 9.6 and earlier for the
|
||||||
* (unlikely) event that a repmgr built against one of those versions
|
* (unlikely) event that a repmgr built against one of those versions
|
||||||
* is being used against Pg 12 and later.
|
* is being used against Pg 12 and later.
|
||||||
*/
|
*/
|
||||||
@@ -2167,6 +2211,20 @@ parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_opti
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
print_replication_type(ReplicationType type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case REPLICATION_TYPE_PHYSICAL:
|
||||||
|
return "physical";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* should never reach here */
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
print_connection_check_type(ConnectionCheckType type)
|
print_connection_check_type(ConnectionCheckType type)
|
||||||
{
|
{
|
||||||
@@ -2192,6 +2250,7 @@ print_event_notification_list(EventNotificationList *list)
|
|||||||
PQExpBufferData buf;
|
PQExpBufferData buf;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
EventNotificationListCell *cell;
|
EventNotificationListCell *cell;
|
||||||
|
int ptr_len;
|
||||||
|
|
||||||
initPQExpBuffer(&buf);
|
initPQExpBuffer(&buf);
|
||||||
cell = list->head;
|
cell = list->head;
|
||||||
@@ -2206,8 +2265,10 @@ print_event_notification_list(EventNotificationList *list)
|
|||||||
cell = cell->next;
|
cell = cell->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = palloc0(strlen(buf.data) + 1);
|
ptr_len = strlen(buf.data);
|
||||||
strncpy(ptr, buf.data, strlen(buf.data));
|
ptr = palloc0(ptr_len + 1);
|
||||||
|
|
||||||
|
strncpy(ptr, buf.data, ptr_len);
|
||||||
|
|
||||||
termPQExpBuffer(&buf);
|
termPQExpBuffer(&buf);
|
||||||
|
|
||||||
|
|||||||
19
configfile.h
19
configfile.h
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* configfile.h
|
* configfile.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -50,6 +50,11 @@ typedef enum
|
|||||||
CHECK_CONNECTION
|
CHECK_CONNECTION
|
||||||
} ConnectionCheckType;
|
} ConnectionCheckType;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
REPLICATION_TYPE_PHYSICAL
|
||||||
|
} ReplicationType;
|
||||||
|
|
||||||
typedef struct EventNotificationListCell
|
typedef struct EventNotificationListCell
|
||||||
{
|
{
|
||||||
struct EventNotificationListCell *next;
|
struct EventNotificationListCell *next;
|
||||||
@@ -86,7 +91,8 @@ typedef enum
|
|||||||
CONFIG_FAILOVER_MODE,
|
CONFIG_FAILOVER_MODE,
|
||||||
CONFIG_CONNECTION_CHECK_TYPE,
|
CONFIG_CONNECTION_CHECK_TYPE,
|
||||||
CONFIG_EVENT_NOTIFICATION_LIST,
|
CONFIG_EVENT_NOTIFICATION_LIST,
|
||||||
CONFIG_TABLESPACE_MAPPING
|
CONFIG_TABLESPACE_MAPPING,
|
||||||
|
CONFIG_REPLICATION_TYPE
|
||||||
} ConfigItemType;
|
} ConfigItemType;
|
||||||
|
|
||||||
|
|
||||||
@@ -103,6 +109,7 @@ typedef struct ConfigFileSetting
|
|||||||
ConnectionCheckType *checktypeptr;
|
ConnectionCheckType *checktypeptr;
|
||||||
EventNotificationList *notificationlistptr;
|
EventNotificationList *notificationlistptr;
|
||||||
TablespaceList *tablespacemappingptr;
|
TablespaceList *tablespacemappingptr;
|
||||||
|
ReplicationType *replicationtypeptr;
|
||||||
} val;
|
} val;
|
||||||
union {
|
union {
|
||||||
int intdefault;
|
int intdefault;
|
||||||
@@ -110,6 +117,7 @@ typedef struct ConfigFileSetting
|
|||||||
bool booldefault;
|
bool booldefault;
|
||||||
failover_mode_opt failovermodedefault;
|
failover_mode_opt failovermodedefault;
|
||||||
ConnectionCheckType checktypedefault;
|
ConnectionCheckType checktypedefault;
|
||||||
|
ReplicationType replicationtypedefault;
|
||||||
} defval;
|
} defval;
|
||||||
union {
|
union {
|
||||||
int intminval;
|
int intminval;
|
||||||
@@ -138,7 +146,7 @@ typedef struct
|
|||||||
char config_directory[MAXPGPATH];
|
char config_directory[MAXPGPATH];
|
||||||
char pg_bindir[MAXPGPATH];
|
char pg_bindir[MAXPGPATH];
|
||||||
char repmgr_bindir[MAXPGPATH];
|
char repmgr_bindir[MAXPGPATH];
|
||||||
int replication_type;
|
ReplicationType replication_type;
|
||||||
|
|
||||||
/* log settings */
|
/* log settings */
|
||||||
char log_level[MAXLEN];
|
char log_level[MAXLEN];
|
||||||
@@ -241,7 +249,7 @@ typedef struct
|
|||||||
/*
|
/*
|
||||||
* undocumented settings
|
* undocumented settings
|
||||||
*
|
*
|
||||||
* These settings are for testing or experimential features
|
* These settings are for testing or experimental features
|
||||||
* and may be changed without notice.
|
* and may be changed without notice.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -356,6 +364,7 @@ const char *format_failover_mode(failover_mode_opt failover);
|
|||||||
void exit_with_cli_errors(ItemList *error_list, const char *repmgr_command);
|
void exit_with_cli_errors(ItemList *error_list, const char *repmgr_command);
|
||||||
|
|
||||||
void print_item_list(ItemList *item_list);
|
void print_item_list(ItemList *item_list);
|
||||||
|
const char *print_replication_type(ReplicationType type);
|
||||||
const char *print_connection_check_type(ConnectionCheckType type);
|
const char *print_connection_check_type(ConnectionCheckType type);
|
||||||
char *print_event_notification_list(EventNotificationList *list);
|
char *print_event_notification_list(EventNotificationList *list);
|
||||||
char *print_tablespace_mapping(TablespaceList *tablespacemappingptr);
|
char *print_tablespace_mapping(TablespaceList *tablespacemappingptr);
|
||||||
@@ -364,6 +373,6 @@ extern bool modify_auto_conf(const char *data_dir, KeyValueList *items);
|
|||||||
|
|
||||||
extern bool ProcessRepmgrConfigFile(const char *config_file, const char *base_dir, ItemList *error_list, ItemList *warning_list);
|
extern bool ProcessRepmgrConfigFile(const char *config_file, const char *base_dir, ItemList *error_list, ItemList *warning_list);
|
||||||
|
|
||||||
extern bool ProcessPostgresConfigFile(const char *config_file, const char *base_dir, KeyValueList *contents, ItemList *error_list, ItemList *warning_list);
|
extern bool ProcessPostgresConfigFile(const char *config_file, const char *base_dir, bool strict, KeyValueList *contents, ItemList *error_list, ItemList *warning_list);
|
||||||
|
|
||||||
#endif /* _REPMGR_CONFIGFILE_H_ */
|
#endif /* _REPMGR_CONFIGFILE_H_ */
|
||||||
|
|||||||
24
configure
vendored
24
configure
vendored
@@ -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.2.
|
# Generated by GNU Autoconf 2.69 for repmgr 5.2.1.
|
||||||
#
|
#
|
||||||
# Report bugs to <repmgr@googlegroups.com>.
|
# Report bugs to <repmgr@googlegroups.com>.
|
||||||
#
|
#
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
# This configure script is free software; the Free Software Foundation
|
# This configure script is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy, distribute and modify it.
|
# gives unlimited permission to copy, distribute and modify it.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010-2020, 2ndQuadrant Ltd.
|
# Copyright (c) 2010-2021, EnterpriseDB Corporation
|
||||||
## -------------------- ##
|
## -------------------- ##
|
||||||
## M4sh Initialization. ##
|
## M4sh Initialization. ##
|
||||||
## -------------------- ##
|
## -------------------- ##
|
||||||
@@ -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.2'
|
PACKAGE_VERSION='5.2.1'
|
||||||
PACKAGE_STRING='repmgr 5.2'
|
PACKAGE_STRING='repmgr 5.2.1'
|
||||||
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.2 to adapt to many kinds of systems.
|
\`configure' configures repmgr 5.2.1 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.2:";;
|
short | recursive ) echo "Configuration of repmgr 5.2.1:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@@ -1316,14 +1316,14 @@ 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.2
|
repmgr configure 5.2.1
|
||||||
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.
|
||||||
This configure script is free software; the Free Software Foundation
|
This configure script is free software; the Free Software Foundation
|
||||||
gives unlimited permission to copy, distribute and modify it.
|
gives unlimited permission to copy, distribute and modify it.
|
||||||
|
|
||||||
Copyright (c) 2010-2020, 2ndQuadrant Ltd.
|
Copyright (c) 2010-2021, EnterpriseDB Corporation
|
||||||
_ACEOF
|
_ACEOF
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
@@ -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.2, which was
|
It was created by repmgr $as_me 5.2.1, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
@@ -1824,7 +1824,7 @@ if test "$major_version_num" -lt '10'; then
|
|||||||
version_num_int=$(echo "$version_num"|
|
version_num_int=$(echo "$version_num"|
|
||||||
$SED -e 's/^\([0-9]*\)\.\([0-9]*\)$/\1\2/')
|
$SED -e 's/^\([0-9]*\)\.\([0-9]*\)$/\1\2/')
|
||||||
|
|
||||||
if test "$version_num_int" -lt '93'; then
|
if test "$version_num_int" -lt '94'; then
|
||||||
as_fn_error $? "repmgr is not compatible with detected PostgreSQL version: $version_num" "$LINENO" 5
|
as_fn_error $? "repmgr is not compatible with detected PostgreSQL version: $version_num" "$LINENO" 5
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@@ -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.2, which was
|
This file was extended by repmgr $as_me 5.2.1, 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.2
|
repmgr config.status 5.2.1
|
||||||
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\\"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
AC_INIT([repmgr], [5.2], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/])
|
AC_INIT([repmgr], [5.2.1], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/])
|
||||||
|
|
||||||
AC_COPYRIGHT([Copyright (c) 2010-2020, 2ndQuadrant Ltd.])
|
AC_COPYRIGHT([Copyright (c) 2010-2021, EnterpriseDB Corporation])
|
||||||
|
|
||||||
AC_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ if test "$major_version_num" -lt '10'; then
|
|||||||
version_num_int=$(echo "$version_num"|
|
version_num_int=$(echo "$version_num"|
|
||||||
$SED -e 's/^\([[0-9]]*\)\.\([[0-9]]*\)$/\1\2/')
|
$SED -e 's/^\([[0-9]]*\)\.\([[0-9]]*\)$/\1\2/')
|
||||||
|
|
||||||
if test "$version_num_int" -lt '93'; then
|
if test "$version_num_int" -lt '94'; then
|
||||||
AC_MSG_ERROR([repmgr is not compatible with detected PostgreSQL version: $version_num])
|
AC_MSG_ERROR([repmgr is not compatible with detected PostgreSQL version: $version_num])
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
* controldata.c - functions for reading the pg_control file
|
* controldata.c - functions for reading the pg_control file
|
||||||
*
|
*
|
||||||
* The functions provided here enable repmgr to read a pg_control file
|
* The functions provided here enable repmgr to read a pg_control file
|
||||||
* in a version-indepent way, even if the PostgreSQL instance is not
|
* in a version-independent way, even if the PostgreSQL instance is not
|
||||||
* running. For that reason we can't use on the pg_control_*() functions
|
* running. For that reason we can't use on the pg_control_*() functions
|
||||||
* provided in PostgreSQL 9.6 and later.
|
* provided in PostgreSQL 9.6 and later.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
@@ -333,7 +333,7 @@ get_controlfile(const char *DataDir)
|
|||||||
control_file_info->minRecoveryPointTLI = ptr->minRecoveryPointTLI;
|
control_file_info->minRecoveryPointTLI = ptr->minRecoveryPointTLI;
|
||||||
control_file_info->minRecoveryPoint = ptr->minRecoveryPoint;
|
control_file_info->minRecoveryPoint = ptr->minRecoveryPoint;
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "ERROR: please use a repmgr version built for PostgreSQL 12\n");
|
fprintf(stderr, "ERROR: please use a repmgr version built for PostgreSQL 12 or later\n");
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* controldata.h
|
* controldata.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* dbutils.c - Database connection/management functions
|
* dbutils.c - Database connection/management functions
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -730,6 +730,8 @@ validate_conninfo_string(const char *conninfo_str, char **errmsg)
|
|||||||
if (connOptions == NULL)
|
if (connOptions == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
PQconninfoFree(connOptions);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1255,7 +1257,7 @@ bool
|
|||||||
pg_reload_conf(PGconn *conn)
|
pg_reload_conf(PGconn *conn)
|
||||||
{
|
{
|
||||||
PGresult *res = NULL;
|
PGresult *res = NULL;
|
||||||
bool success = false;
|
bool success = true;
|
||||||
|
|
||||||
res = PQexec(conn, "SELECT pg_catalog.pg_reload_conf()");
|
res = PQexec(conn, "SELECT pg_catalog.pg_reload_conf()");
|
||||||
|
|
||||||
@@ -4825,7 +4827,7 @@ cancel_query(PGconn *conn, int timeout)
|
|||||||
* Wait until current query finishes, ignoring any results.
|
* Wait until current query finishes, ignoring any results.
|
||||||
* Usually this will be an async query or query cancellation.
|
* Usually this will be an async query or query cancellation.
|
||||||
*
|
*
|
||||||
* Returns 1 for success; 0 if any error ocurred; -1 if timeout reached.
|
* Returns 1 for success; 0 if any error occurred; -1 if timeout reached.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
wait_connection_availability(PGconn *conn, int timeout)
|
wait_connection_availability(PGconn *conn, int timeout)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* dbutils.h
|
* dbutils.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
76
dirutil.c
76
dirutil.c
@@ -3,7 +3,7 @@
|
|||||||
* dirmod.c
|
* dirmod.c
|
||||||
* directory handling functions
|
* directory handling functions
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -109,9 +109,56 @@ create_dir(const char *path)
|
|||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
set_dir_permissions(const char *path)
|
set_dir_permissions(const char *path, int server_version_num)
|
||||||
{
|
{
|
||||||
return (chmod(path, 0700) != 0) ? false : true;
|
struct stat stat_buf;
|
||||||
|
bool no_group_access =
|
||||||
|
(server_version_num != UNKNOWN_SERVER_VERSION_NUM) &&
|
||||||
|
(server_version_num < 110000);
|
||||||
|
/*
|
||||||
|
* At this point the path should exist, so this check is very
|
||||||
|
* much just-in-case.
|
||||||
|
*/
|
||||||
|
if (stat(path, &stat_buf) != 0)
|
||||||
|
{
|
||||||
|
if (errno == ENOENT)
|
||||||
|
{
|
||||||
|
log_warning(_("directory \"%s\" does not exist"), path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_warning(_("could not read permissions of directory \"%s\""),
|
||||||
|
path);
|
||||||
|
log_detail("%s", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If mode is not 0700 or 0750, attempt to change.
|
||||||
|
*/
|
||||||
|
if ((no_group_access == true && (stat_buf.st_mode & (S_IRWXG | S_IRWXO)))
|
||||||
|
|| (no_group_access == false && (stat_buf.st_mode & (S_IWGRP | S_IRWXO))))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Currently we default to 0700.
|
||||||
|
* There is no facility to override this directly,
|
||||||
|
* but the user can manually create the directory with
|
||||||
|
* the desired permissions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (chmod(path, 0700) != 0) {
|
||||||
|
log_error(_("unable to change permissions of directory \"%s\""), path);
|
||||||
|
log_detail("%s", strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Leave as-is */
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -158,7 +205,7 @@ mkdir_p(char *path, mode_t omode)
|
|||||||
/*
|
/*
|
||||||
* POSIX 1003.2: For each dir operand that does not name an
|
* POSIX 1003.2: For each dir operand that does not name an
|
||||||
* existing directory, effects equivalent to those caused by the
|
* existing directory, effects equivalent to those caused by the
|
||||||
* following command shall occcur:
|
* following command shall occur:
|
||||||
*
|
*
|
||||||
* mkdir -p -m $(umask -S),u+wx $(dirname dir) && mkdir [-m mode]
|
* mkdir -p -m $(umask -S),u+wx $(dirname dir) && mkdir [-m mode]
|
||||||
* dir
|
* dir
|
||||||
@@ -242,7 +289,7 @@ is_pg_running(const char *path)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* No PID file - PostgreSQL shouldn't be running. From 9.3 (the
|
* No PID file - PostgreSQL shouldn't be running. From 9.3 (the
|
||||||
* earliesty version we care about) removal of the PID file will
|
* earliest version we care about) removal of the PID file will
|
||||||
* cause the postmaster to shut down, so it's highly unlikely
|
* cause the postmaster to shut down, so it's highly unlikely
|
||||||
* that PostgreSQL will still be running.
|
* that PostgreSQL will still be running.
|
||||||
*/
|
*/
|
||||||
@@ -303,7 +350,7 @@ create_pg_dir(const char *path, bool force)
|
|||||||
switch (check_dir(path))
|
switch (check_dir(path))
|
||||||
{
|
{
|
||||||
case DIR_NOENT:
|
case DIR_NOENT:
|
||||||
/* directory does not exist, attempt to create it */
|
/* Directory does not exist, attempt to create it. */
|
||||||
log_info(_("creating directory \"%s\"..."), path);
|
log_info(_("creating directory \"%s\"..."), path);
|
||||||
|
|
||||||
if (!create_dir(path))
|
if (!create_dir(path))
|
||||||
@@ -314,14 +361,23 @@ create_pg_dir(const char *path, bool force)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DIR_EMPTY:
|
case DIR_EMPTY:
|
||||||
/* exists but empty, fix permissions and use it */
|
/*
|
||||||
|
* Directory exists but empty, fix permissions and use it.
|
||||||
|
*
|
||||||
|
* Note that at this point the caller might not know the server
|
||||||
|
* version number, so in this case "set_dir_permissions()" will
|
||||||
|
* accept 0750 as a valid setting. As this is invalid in Pg10 and
|
||||||
|
* earlier, the caller should call "set_dir_permissions()" again
|
||||||
|
* when it has the number.
|
||||||
|
*
|
||||||
|
* We need to do the permissions check here in any case to catch
|
||||||
|
* fatal permissions early.
|
||||||
|
*/
|
||||||
log_info(_("checking and correcting permissions on existing directory \"%s\""),
|
log_info(_("checking and correcting permissions on existing directory \"%s\""),
|
||||||
path);
|
path);
|
||||||
|
|
||||||
if (!set_dir_permissions(path))
|
if (!set_dir_permissions(path, UNKNOWN_SERVER_VERSION_NUM))
|
||||||
{
|
{
|
||||||
log_error(_("unable to change permissions of directory \"%s\""), path);
|
|
||||||
log_detail("%s", strerror(errno));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* dirutil.h
|
* dirutil.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -35,7 +35,7 @@ typedef enum
|
|||||||
} PgDirState;
|
} PgDirState;
|
||||||
|
|
||||||
extern int mkdir_p(char *path, mode_t omode);
|
extern int mkdir_p(char *path, mode_t omode);
|
||||||
extern bool set_dir_permissions(const char *path);
|
extern bool set_dir_permissions(const char *path, int server_version_num);
|
||||||
|
|
||||||
extern DataDirState check_dir(const char *path);
|
extern DataDirState check_dir(const char *path);
|
||||||
extern bool create_dir(const char *path);
|
extern bool create_dir(const char *path);
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ clean:
|
|||||||
rm -f repmgr.html
|
rm -f repmgr.html
|
||||||
rm -f repmgr-A4.pdf
|
rm -f repmgr-A4.pdf
|
||||||
rm -f repmgr-US.pdf
|
rm -f repmgr-US.pdf
|
||||||
|
rm -f *.fo
|
||||||
rm -f html/*
|
rm -f html/*
|
||||||
|
|
||||||
maintainer-clean:
|
maintainer-clean:
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
<tip>
|
<tip>
|
||||||
<para>
|
<para>
|
||||||
2ndQuadrant's recommended configuration is to configure
|
Our recommended configuration is to configure
|
||||||
<ulink url="https://www.pgbarman.org/">Barman</ulink> as a fallback
|
<ulink url="https://www.pgbarman.org/">Barman</ulink> as a fallback
|
||||||
source of WAL files, rather than maintain replication slots for
|
source of WAL files, rather than maintain replication slots for
|
||||||
each standby. See also: <link linkend="cloning-from-barman-restore-command">Using Barman as a WAL file source</link>.
|
each standby. See also: <link linkend="cloning-from-barman-restore-command">Using Barman as a WAL file source</link>.
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
filesystem layouts.
|
filesystem layouts.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Either use PostgreSQL packages provided by the community or 2ndQuadrant; if this
|
Either use PostgreSQL packages provided by the community or EnterpriseDB; if this
|
||||||
is not possible, contact your vendor for assistance.
|
is not possible, contact your vendor for assistance.
|
||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
<para>
|
<para>
|
||||||
If different "minor" &repmgr; versions (e.g. 4.1.1 and 4.1.6) are installed,
|
If different "minor" &repmgr; versions (e.g. 4.1.1 and 4.1.6) are installed,
|
||||||
&repmgr; will function, but we strongly recommend always running the same version
|
&repmgr; will function, but we strongly recommend always running the same version
|
||||||
to ensure there are no unexpected suprises, e.g. a newer version behaving slightly
|
to ensure there are no unexpected surprises, e.g. a newer version behaving slightly
|
||||||
differently to the older version.
|
differently to the older version.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
@@ -212,11 +212,11 @@
|
|||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
<sect2 id="faq-third-party-packages" xreflabel="Compatability with third party vendor packages">
|
<sect2 id="faq-third-party-packages" xreflabel="Compatibility with third party vendor packages">
|
||||||
<title>Are &repmgr; packages compatible with <literal>$third_party_vendor</literal>'s packages?</title>
|
<title>Are &repmgr; packages compatible with <literal>$third_party_vendor</literal>'s packages?</title>
|
||||||
<para>
|
<para>
|
||||||
&repmgr; packages provided by 2ndQuadrant are compatible with the community-provided PostgreSQL
|
&repmgr; packages provided by EnterpriseDB are compatible with the community-provided PostgreSQL
|
||||||
packages and any software provided by 2ndQuadrant.
|
packages and specified software provided by EnterpriseDB.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
A number of other vendors provide their own versions of PostgreSQL packages, often with different
|
A number of other vendors provide their own versions of PostgreSQL packages, often with different
|
||||||
@@ -311,7 +311,7 @@
|
|||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
<sect2 id="faq-repmgr-shared-preload-libaries-no-repmgrd" xreflabel="shared_preload_libraries without repmgrd">
|
<sect2 id="faq-repmgr-shared-preload-libraries-no-repmgrd" xreflabel="shared_preload_libraries without repmgrd">
|
||||||
<title>Do I need to include <literal>shared_preload_libraries = 'repmgr'</literal>
|
<title>Do I need to include <literal>shared_preload_libraries = 'repmgr'</literal>
|
||||||
in <filename>postgresql.conf</filename> if I'm not using &repmgrd;?</title>
|
in <filename>postgresql.conf</filename> if I'm not using &repmgrd;?</title>
|
||||||
<para>
|
<para>
|
||||||
@@ -459,7 +459,7 @@
|
|||||||
</title>
|
</title>
|
||||||
<para>
|
<para>
|
||||||
<varname>promote_command</varname> or <varname>follow_command</varname> can be user-defined scripts,
|
<varname>promote_command</varname> or <varname>follow_command</varname> can be user-defined scripts,
|
||||||
so &repmgr; will not apply <option>pg_bindir</option> even if excuting &repmgr;. Always provide the full
|
so &repmgr; will not apply <option>pg_bindir</option> even if executing &repmgr;. Always provide the full
|
||||||
path; see <xref linkend="repmgrd-automatic-failover-configuration"/> for more details.
|
path; see <xref linkend="repmgrd-automatic-failover-configuration"/> for more details.
|
||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
@@ -479,7 +479,7 @@
|
|||||||
is out-of-date, which may lead to incorrect failover behaviour.
|
is out-of-date, which may lead to incorrect failover behaviour.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
The onus is therefore on the adminstrator to manually set the cluster to a stable, healthy state before
|
The onus is therefore on the administrator to manually set the cluster to a stable, healthy state before
|
||||||
starting &repmgrd;.
|
starting &repmgrd;.
|
||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|||||||
@@ -52,8 +52,7 @@
|
|||||||
<para>
|
<para>
|
||||||
&repmgr; packages are available from the public 2ndQuadrant repository, and also the
|
&repmgr; packages are available from the public 2ndQuadrant repository, and also the
|
||||||
PostgreSQL community repository. The 2ndQuadrant repository is updated immediately
|
PostgreSQL community repository. The 2ndQuadrant repository is updated immediately
|
||||||
after each
|
after each &repmgr; release.
|
||||||
&repmgr; release.
|
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<table id="centos-2ndquadrant-repository">
|
<table id="centos-2ndquadrant-repository">
|
||||||
@@ -398,7 +397,7 @@
|
|||||||
</indexterm>
|
</indexterm>
|
||||||
<indexterm>
|
<indexterm>
|
||||||
<primary>packages</primary>
|
<primary>packages</primary>
|
||||||
<secondary>snaphots</secondary>
|
<secondary>snapshots</secondary>
|
||||||
</indexterm>
|
</indexterm>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
@@ -439,7 +438,7 @@ curl https://dl.2ndquadrant.com/default/snapshot/get/9.6/rpm | sudo bash</progra
|
|||||||
The package name will be formatted like this:
|
The package name will be formatted like this:
|
||||||
<programlisting>
|
<programlisting>
|
||||||
repmgr96-4.1.1-0.0git320.g5113ab0.1.el7.x86_64.rpm</programlisting>
|
repmgr96-4.1.1-0.0git320.g5113ab0.1.el7.x86_64.rpm</programlisting>
|
||||||
containg the snapshot build number (here: <literal>320</literal>) and the hash
|
containing the snapshot build number (here: <literal>320</literal>) and the hash
|
||||||
of the <application>git</application> commit it was built from (here: <literal>g5113ab0</literal>).
|
of the <application>git</application> commit it was built from (here: <literal>g5113ab0</literal>).
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|||||||
@@ -16,16 +16,133 @@
|
|||||||
</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.2.2">
|
||||||
|
<title id="release-current">Release 5.2.2</title>
|
||||||
|
<para><emphasis>??? ? ???, 2021</emphasis></para>
|
||||||
|
<para>
|
||||||
|
&repmgr; 5.2.2 is a minor release.
|
||||||
|
</para>
|
||||||
|
<sect2>
|
||||||
|
<title>Bug fixes</title>
|
||||||
|
<para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<command><link linkend="repmgr-standby-clone">repmgr standby clone</link></command>:
|
||||||
|
if using <option>--replication-conf-only</option> on a node
|
||||||
|
which was set up without replication slots, but the &repmgr; configuration
|
||||||
|
was since changed to <option>use_replication_slots=1</option>,
|
||||||
|
&repmgr; will now set <varname>slot_name</varname> in the
|
||||||
|
node record, if it was previously empty.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<command><link linkend="repmgr-node-rejoin">repmgr node rejoin</link></command>:
|
||||||
|
emit rejoin target note information as <literal>NOTICE</literal>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This makes it clearer what &repmgr; is trying to do.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
&repmgrd;: ensure short option <option>-s</option> is accepted.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="release-5.2.1">
|
||||||
|
<title>Release 5.2.1</title>
|
||||||
|
<para><emphasis>Mon 7 December, 2020</emphasis></para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&repmgr; 5.2.1 is a minor release.
|
||||||
|
</para>
|
||||||
|
<sect2>
|
||||||
|
<title>Improvements</title>
|
||||||
|
<para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<link linkend="repmgr-standby-clone">repmgr standby clone</link>:
|
||||||
|
option <option>--recovery-min-apply-delay</option> added, overriding any
|
||||||
|
setting present in <filename>repmgr.conf</filename>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Bug fixes</title>
|
||||||
|
<para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Configuration: fix parsing of <option>replication_type</option> configuration parameter. GitHub #672.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<link linkend="repmgr-standby-clone">repmgr standby clone</link>:
|
||||||
|
handle case where <filename>postgresql.auto.conf</filename> is absent on the
|
||||||
|
source node.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<link linkend="repmgr-standby-clone">repmgr standby clone</link>:
|
||||||
|
in PostgreSQL 11 and later, an existing data directory's permissions
|
||||||
|
will not be changed to <option>0700</option> if they are already set to
|
||||||
|
<option>0750</option>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
&repmgrd;: prevent termination when local node not available and
|
||||||
|
<option>standby_disconnect_on_failover</option> is set. GitHub #675.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
&repmgrd;: ensure <option>reconnect_interval</option> is correctly handled.
|
||||||
|
GitHub #673.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<command>repmgr witness --help</command>: fix <command>witness unregister</command>
|
||||||
|
description. GitHub #676.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="release-5.2.0">
|
<sect1 id="release-5.2.0">
|
||||||
<title>Release 5.2.0</title>
|
<title>Release 5.2.0</title>
|
||||||
<para><emphasis>??? ?? ???, 2020</emphasis></para>
|
<para><emphasis>Thu 22 October, 2020</emphasis></para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
&repmgr; 5.2.0 is a major release.
|
&repmgr; 5.2.0 is a major release.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
This release provides support for <ulink url="https://www.postgresql.org/docs/13/release-13.htmll">PostgreSQL 13</ulink>, released in September 2020.
|
This release provides support for <ulink url="https://www.postgresql.org/docs/13/release-13.html">PostgreSQL 13</ulink>, released in September 2020.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
This release removes support for PostgreSQL 9.3, which was
|
This release removes support for PostgreSQL 9.3, which was
|
||||||
@@ -220,7 +337,7 @@
|
|||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<sect1 id="release-5.1.0">
|
<sect1 id="release-5.1.0">
|
||||||
<title id="release-current">Release 5.1.0</title>
|
<title>Release 5.1.0</title>
|
||||||
<para><emphasis>Mon 13 April, 2020</emphasis></para>
|
<para><emphasis>Mon 13 April, 2020</emphasis></para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
@@ -1123,7 +1240,7 @@ REPMGRD_OPTS="--daemonize=false"</programlisting>
|
|||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Possible values are <literal>ping</literal> (default; uses <command>PQping()</command> to
|
Possible values are <literal>ping</literal> (default; uses <command>PQping()</command> to
|
||||||
determine server availability), <literal>connection</literal> (attempst to make a new connection to
|
determine server availability), <literal>connection</literal> (attempts to make a new connection to
|
||||||
the upstream node), and <literal>query</literal> (determines server availability
|
the upstream node), and <literal>query</literal> (determines server availability
|
||||||
by executing an SQL statement on the node via the existing connection).
|
by executing an SQL statement on the node via the existing connection).
|
||||||
</para>
|
</para>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
A mailing list/forum is provided via Google groups to discuss contributions or issues: <ulink url="https://groups.google.com/group/repmgr">https://groups.google.com/group/repmgr</ulink>.
|
A mailing list/forum is provided via Google groups to discuss contributions or issues: <ulink url="https://groups.google.com/group/repmgr">https://groups.google.com/group/repmgr</ulink>.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Please report bugs and other issues to: <ulink url="https://github.com/2ndQuadrant/repmgr">https://github.com/2ndQuadrant/repmgr</ulink>.
|
Please report bugs and other issues to: <ulink url="https://github.com/EnterpriseDB/repmgr">https://github.com/EnterpriseDB/repmgr</ulink>.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<important>
|
<important>
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<simpara>
|
<simpara>
|
||||||
<filename>repmpgr.conf</filename> files (suitably anonymized if necessary)
|
<filename>repmgr.conf</filename> files (suitably anonymized if necessary)
|
||||||
</simpara>
|
</simpara>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ description = "Main cluster"
|
|||||||
Cascading replication, introduced with PostgreSQL 9.2, enables a standby server
|
Cascading replication, introduced with PostgreSQL 9.2, enables a standby server
|
||||||
to replicate from another standby server rather than directly from the primary,
|
to replicate from another standby server rather than directly from the primary,
|
||||||
meaning replication changes "cascade" down through a hierarchy of servers. This
|
meaning replication changes "cascade" down through a hierarchy of servers. This
|
||||||
can be used to reduce load on the primary and minimize bandwith usage between
|
can be used to reduce load on the primary and minimize bandwidth usage between
|
||||||
sites. For more details, see the
|
sites. For more details, see the
|
||||||
<ulink url="https://www.postgresql.org/docs/current/warm-standby.html#CASCADING-REPLICATION">
|
<ulink url="https://www.postgresql.org/docs/current/warm-standby.html#CASCADING-REPLICATION">
|
||||||
PostgreSQL cascading replication documentation</ulink>.
|
PostgreSQL cascading replication documentation</ulink>.
|
||||||
@@ -391,7 +391,7 @@ description = "Main cluster"
|
|||||||
cluster, you may wish to clone a downstream standby whose upstream node
|
cluster, you may wish to clone a downstream standby whose upstream node
|
||||||
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 explictly set the upstream's <varname>primary_conninfo</varname> string
|
to explicitly set the upstream's <varname>primary_conninfo</varname> string
|
||||||
in <filename>recovery.conf</filename>.
|
in <filename>recovery.conf</filename>.
|
||||||
</simpara>
|
</simpara>
|
||||||
</tip>
|
</tip>
|
||||||
|
|||||||
@@ -7,6 +7,14 @@
|
|||||||
<secondary>optional settings</secondary>
|
<secondary>optional settings</secondary>
|
||||||
</indexterm>
|
</indexterm>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<simpara>
|
||||||
|
This section documents a subset of optional configuration settings; for a full
|
||||||
|
for a full and annotated view of all configuration options see the
|
||||||
|
see the <ulink url="https://raw.githubusercontent.com/EnterpriseDB/repmgr/master/repmgr.conf.sample">sample repmgr.conf file</ulink>
|
||||||
|
</simpara>
|
||||||
|
</note>
|
||||||
|
|
||||||
<variablelist>
|
<variablelist>
|
||||||
|
|
||||||
|
|
||||||
@@ -132,5 +140,50 @@ ssh_options='-q -o ConnectTimeout=10'</programlisting>
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="repmgr-conf-pg-bindir" xreflabel="pg_bindir">
|
||||||
|
<term><varname>pg_bindir</varname> (<type>string</type>)
|
||||||
|
<indexterm>
|
||||||
|
<primary><varname>pg_bindir</varname> configuration file parameter</primary>
|
||||||
|
</indexterm>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Path to the PostgreSQL binary directory (location of <application>pg_ctl</application>,
|
||||||
|
<application>pg_basebackup</application> etc.). Only required
|
||||||
|
if these are not in the system <varname>PATH</varname>.
|
||||||
|
</para>
|
||||||
|
<tip>
|
||||||
|
<para>
|
||||||
|
When &repmgr; is executed via <application>SSH</application> (e.g. when running
|
||||||
|
<command><link linkend="repmgr-standby-switchover">repmgr standby switchover</link></command>,
|
||||||
|
<command><link linkend="repmgr-cluster-matrix">repmgr cluster matrix</link></command> or
|
||||||
|
<command><link linkend="repmgr-cluster-crosscheck">repmgr cluster crosscheck</link></command>,
|
||||||
|
or if it is executed as cronjob), a login shell will not be used and only the
|
||||||
|
default system <varname>PATH</varname> will be set. Therefore it's recommended to set
|
||||||
|
<varname>pg_bindir</varname> so &repmgr; can correctly invoke binaries on a remote
|
||||||
|
system and avoid potential path issues.
|
||||||
|
</para>
|
||||||
|
</tip>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Debian/Ubuntu users: you will probably need to set this to the directory where
|
||||||
|
<application>pg_ctl</application> is located, e.g. <filename>/usr/lib/postgresql/9.6/bin/</filename>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<emphasis>NOTE</emphasis>: <varname>pg_bindir</varname> is only used when &repmgr; directly
|
||||||
|
executes PostgreSQL binaries; any user-defined scripts
|
||||||
|
<emphasis>must</emphasis> be specified with the full path.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
<tip>
|
||||||
|
<simpara>
|
||||||
|
See the <ulink url="https://raw.githubusercontent.com/EnterpriseDB/repmgr/master/repmgr.conf.sample">sample repmgr.conf file</ulink>
|
||||||
|
for a full and annotated view of all configuration options.
|
||||||
|
</simpara>
|
||||||
|
</tip>
|
||||||
|
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|||||||
@@ -96,6 +96,9 @@
|
|||||||
</variablelist>
|
</variablelist>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
See <xref linkend="configuration-file-optional-settings"/> for further configuration options.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|||||||
@@ -27,7 +27,9 @@
|
|||||||
<note>
|
<note>
|
||||||
<para>
|
<para>
|
||||||
If using <application>systemd</application>, ensure you have <varname>RemoveIPC</varname> set to <literal>off</literal>.
|
If using <application>systemd</application>, ensure you have <varname>RemoveIPC</varname> set to <literal>off</literal>.
|
||||||
See the <ulink url="https://wiki.postgresql.org/wiki/Systemd">systemd</ulink>
|
See the <ulink url="https://www.postgresql.org/docs/current/index.html">PostgreSQL documentation</ulink> section
|
||||||
|
<ulink url="https://www.postgresql.org/docs/current/kernel-resources.html#SYSTEMD-REMOVEIPC">systemd RemoveIPC</ulink>
|
||||||
|
and also the <ulink url="https://wiki.postgresql.org/wiki/Systemd">systemd</ulink>
|
||||||
entry in the <ulink url="https://wiki.postgresql.org/wiki/Main_Page">PostgreSQL wiki</ulink> for details.
|
entry in the <ulink url="https://wiki.postgresql.org/wiki/Main_Page">PostgreSQL wiki</ulink> for details.
|
||||||
</para>
|
</para>
|
||||||
</note>
|
</note>
|
||||||
|
|||||||
@@ -93,7 +93,7 @@
|
|||||||
<table id="repmgr-compatibility-matrix">
|
<table id="repmgr-compatibility-matrix">
|
||||||
<title>&repmgr; compatibility matrix</title>
|
<title>&repmgr; compatibility matrix</title>
|
||||||
|
|
||||||
<tgroup cols="3">
|
<tgroup cols="4">
|
||||||
<thead>
|
<thead>
|
||||||
<row>
|
<row>
|
||||||
<entry>
|
<entry>
|
||||||
@@ -133,10 +133,10 @@
|
|||||||
&repmgr; 5.1
|
&repmgr; 5.1
|
||||||
</entry>
|
</entry>
|
||||||
<entry>
|
<entry>
|
||||||
YES
|
NO
|
||||||
</entry>
|
</entry>
|
||||||
<entry>
|
<entry>
|
||||||
<link linkend="release-5.1.0">5.1</link> (2020-04-13)
|
<link linkend="release-5.1.0">5.1.0</link> (2020-04-13)
|
||||||
</entry>
|
</entry>
|
||||||
<entry>
|
<entry>
|
||||||
9.3, 9.4, 9.5, 9.6, 10, 11, 12
|
9.3, 9.4, 9.5, 9.6, 10, 11, 12
|
||||||
|
|||||||
@@ -178,18 +178,18 @@ deb-src https://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main</programlist
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
The source for &repmgr; is maintained at
|
The source for &repmgr; is maintained at
|
||||||
<ulink url="https://github.com/2ndQuadrant/repmgr">https://github.com/2ndQuadrant/repmgr</ulink>.
|
<ulink url="https://github.com/EnterpriseDB/repmgr">https://github.com/EnterpriseDB/repmgr</ulink>.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
There are also tags for each <ulink url="https://github.com/2ndQuadrant/repmgr/releases">&repmgr; release</ulink>, e.g.
|
There are also tags for each <ulink url="https://github.com/EnterpriseDB/repmgr/releases">&repmgr; release</ulink>, e.g.
|
||||||
<literal><ulink url="https://github.com/2ndQuadrant/repmgr/releases/tag/v4.4.0">v4.4.0</ulink></literal>.
|
<literal><ulink url="https://github.com/EnterpriseDB/repmgr/releases/tag/v4.4.0">v4.4.0</ulink></literal>.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Clone the source code using <application>git</application>:
|
Clone the source code using <application>git</application>:
|
||||||
<programlisting>
|
<programlisting>
|
||||||
git clone https://github.com/2ndQuadrant/repmgr</programlisting>
|
git clone https://github.com/EnterpriseDB/repmgr</programlisting>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
|||||||
@@ -3,16 +3,16 @@
|
|||||||
<date>2017</date>
|
<date>2017</date>
|
||||||
|
|
||||||
<copyright>
|
<copyright>
|
||||||
<year>2010-2020</year>
|
<year>2010-2021</year>
|
||||||
<holder>2ndQuadrant, Ltd.</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 © 2010-2020
|
<productname>repmgr</productname> is Copyright © 2010-2021
|
||||||
by 2ndQuadrant, Ltd. All rights reserved.
|
by EnterpriseDB Corporation All rights reserved.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
|||||||
@@ -284,7 +284,7 @@
|
|||||||
|
|
||||||
<tip>
|
<tip>
|
||||||
<simpara>
|
<simpara>
|
||||||
For Debian-based distributions we recommend explictly setting
|
For Debian-based distributions we recommend explicitly setting
|
||||||
<option>pg_bindir</option> to the directory where <command>pg_ctl</command> and other binaries
|
<option>pg_bindir</option> to the directory where <command>pg_ctl</command> and other binaries
|
||||||
not in the standard path are located. For PostgreSQL 9.6 this would be <filename>/usr/lib/postgresql/9.6/bin/</filename>.
|
not in the standard path are located. For PostgreSQL 9.6 this would be <filename>/usr/lib/postgresql/9.6/bin/</filename>.
|
||||||
</simpara>
|
</simpara>
|
||||||
@@ -302,7 +302,7 @@
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
See the file
|
See the file
|
||||||
<ulink url="https://raw.githubusercontent.com/2ndQuadrant/repmgr/master/repmgr.conf.sample">repmgr.conf.sample</ulink>
|
<ulink url="https://raw.githubusercontent.com/EnterpriseDB/repmgr/master/repmgr.conf.sample">repmgr.conf.sample</ulink>
|
||||||
for details of all available configuration parameters.
|
for details of all available configuration parameters.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
By default, &repmgr; will wait for up to 15 seconds to confirm that &repmgrd;
|
By default, &repmgr; will wait for up to 15 seconds to confirm that &repmgrd;
|
||||||
started. This behaviour can be overridden by specifying a diffent value using the <option>--wait</option>
|
started. This behaviour can be overridden by specifying a different value using the <option>--wait</option>
|
||||||
option, or disabled altogether with the <option>--no-wait</option> option.
|
option, or disabled altogether with the <option>--no-wait</option> option.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
By default, &repmgr; will wait for up to 15 seconds to confirm that &repmgrd;
|
By default, &repmgr; will wait for up to 15 seconds to confirm that &repmgrd;
|
||||||
stopped. This behaviour can be overridden by specifying a diffent value using the <option>--wait</option>
|
stopped. This behaviour can be overridden by specifying a different value using the <option>--wait</option>
|
||||||
option, or disabled altogether with the <option>--no-wait</option> option.
|
option, or disabled altogether with the <option>--no-wait</option> option.
|
||||||
</para>
|
</para>
|
||||||
<note>
|
<note>
|
||||||
|
|||||||
@@ -22,6 +22,10 @@
|
|||||||
This can optionally use <application>pg_rewind</application> to re-integrate
|
This can optionally use <application>pg_rewind</application> to re-integrate
|
||||||
a node which has diverged from the rest of the cluster, typically a failed primary.
|
a node which has diverged from the rest of the cluster, typically a failed primary.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
Note that <command>repmgr node rejoin</command> can only be used to attach
|
||||||
|
a standby to the current primary, not another standby.
|
||||||
|
</para>
|
||||||
|
|
||||||
<tip>
|
<tip>
|
||||||
<para>
|
<para>
|
||||||
@@ -281,6 +285,7 @@
|
|||||||
<programlisting>
|
<programlisting>
|
||||||
$ repmgr node rejoin -f /etc/repmgr.conf -d 'host=node3 dbname=repmgr user=repmgr' \
|
$ repmgr node rejoin -f /etc/repmgr.conf -d 'host=node3 dbname=repmgr user=repmgr' \
|
||||||
--force-rewind --config-files=postgresql.local.conf,postgresql.conf --verbose --dry-run
|
--force-rewind --config-files=postgresql.local.conf,postgresql.conf --verbose --dry-run
|
||||||
|
NOTICE: rejoin target is node "node3" (node ID: 3)
|
||||||
INFO: replication connection to the rejoin target node was successful
|
INFO: replication connection to the rejoin target node was successful
|
||||||
INFO: local and rejoin target system identifiers match
|
INFO: local and rejoin target system identifiers match
|
||||||
DETAIL: system identifier is 6652184002263212600
|
DETAIL: system identifier is 6652184002263212600
|
||||||
@@ -339,6 +344,7 @@
|
|||||||
<programlisting>
|
<programlisting>
|
||||||
$ repmgr node rejoin -f /etc/repmgr.conf -d 'host=node3 dbname=repmgr user=repmgr' \
|
$ repmgr node rejoin -f /etc/repmgr.conf -d 'host=node3 dbname=repmgr user=repmgr' \
|
||||||
--config-files=postgresql.local.conf,postgresql.conf --verbose --force-rewind --dry-run
|
--config-files=postgresql.local.conf,postgresql.conf --verbose --force-rewind --dry-run
|
||||||
|
NOTICE: rejoin target is node "node3" (node ID: 3)
|
||||||
INFO: replication connection to the rejoin target node was successful
|
INFO: replication connection to the rejoin target node was successful
|
||||||
INFO: local and rejoin target system identifiers match
|
INFO: local and rejoin target system identifiers match
|
||||||
DETAIL: system identifier is 6652460429293670710
|
DETAIL: system identifier is 6652460429293670710
|
||||||
@@ -449,15 +455,16 @@
|
|||||||
</para>
|
</para>
|
||||||
<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://www.postgresql.org/message-id/flat/CABvVfJU-LDWvoz4-Yow3Ay5LZYTuPD7eSjjE4kGyNZpXC6FrVQ@mail.gmail.com">patch</ulink>
|
A <ulink url="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=2b4f3130382fe2f8705863e4d38589d4d69cd695">patch</ulink>
|
||||||
has been submitted and will hopefully be included in a forthcoming PostgreSQL minor release.
|
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,
|
||||||
and ensure the standby can be attached to it. If <application>pg_rewind</application> was actually executed,
|
and ensure the standby can be attached to it. If <application>pg_rewind</application> was actually executed,
|
||||||
it will have copied in the <filename>.history</filename> file from the target primary server; this must
|
it will have copied in the <filename>.history</filename> file from the target primary server; this must
|
||||||
be removed. <command>repmgr node rejoin</command> can then be used to attach the standby to the original
|
be removed. <command>repmgr node rejoin</command> can then be used to attach the standby to the original
|
||||||
primary. Ensure any changes pending on the primary have propogated to the standby. Then shut down the primary
|
primary. Ensure any changes pending on the primary have propagated to the standby. Then shut down the primary
|
||||||
server <emphasis>first</emphasis>, before shutting down the standby. It should then be possible to
|
server <emphasis>first</emphasis>, before shutting down the standby. It should then be possible to
|
||||||
use <command>repmgr node rejoin</command> to attach the standby to the new primary.
|
use <command>repmgr node rejoin</command> to attach the standby to the new primary.
|
||||||
</para>
|
</para>
|
||||||
|
|||||||
@@ -260,16 +260,29 @@ pg_basebackup_options='--waldir=/path/to/wal-directory'</programlisting>
|
|||||||
upstream node if required.
|
upstream node if required.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Note that the upstream node must be running. In PostgreSQL 11 and earlier, an existing
|
The upstream node must be running so the correct replication configuration can be obtained.
|
||||||
<filename>recovery.conf</filename> will not be overwritten unless the
|
|
||||||
<option>-F/--force</option> option is provided.
|
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Execute <command>repmgr standby clone --replication-conf-only --dry-run</command>
|
If the standby is running, the replication configuration will not be written unless the
|
||||||
to check the prerequisites for creating the recovery configuration,
|
<option>-F/--force</option> option is provided.
|
||||||
and display the contents of the configuration which would be added without actually
|
|
||||||
making any changes.
|
|
||||||
</para>
|
</para>
|
||||||
|
<tip>
|
||||||
|
<para>
|
||||||
|
Execute <command>repmgr standby clone --replication-conf-only --dry-run</command>
|
||||||
|
to check the prerequisites for creating the recovery configuration,
|
||||||
|
and display the configuration changes which would be made without actually
|
||||||
|
making any changes.
|
||||||
|
</para>
|
||||||
|
</tip>
|
||||||
|
<para>
|
||||||
|
In PostgreSQL 13 and later, the PostgreSQL configuration must be reloaded for replication
|
||||||
|
configuration changes to take effect.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In PostgreSQL 12 and earlier, the PostgreSQL instance must be restarted for replication
|
||||||
|
configuration changes to take effect.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
@@ -331,6 +344,25 @@ pg_basebackup_options='--waldir=/path/to/wal-directory'</programlisting>
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--recovery-min-apply-delay</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Set PostgreSQL configuration <option>recovery_min_apply_delay</option> parameter
|
||||||
|
to the provided value.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This overrides any <option>recovery_min_apply_delay</option> provided via
|
||||||
|
<filename>repmgr.conf</filename>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
For more details on this parameter, see:
|
||||||
|
<ulink url="https://www.postgresql.org/docs/current/runtime-config-replication.html#GUC-RECOVERY-MIN-APPLY-DELAY">recovery_min_apply_delay</ulink>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>-R, --remote-user=USERNAME</option></term>
|
<term><option>-R, --remote-user=USERNAME</option></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
@@ -346,14 +378,14 @@ pg_basebackup_options='--waldir=/path/to/wal-directory'</programlisting>
|
|||||||
<para>
|
<para>
|
||||||
Create recovery configuration for a previously cloned instance.
|
Create recovery configuration for a previously cloned instance.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
|
||||||
In PostgreSQL 11 and earlier, the replication configuration will be
|
|
||||||
written to <filename>recovery.conf</filename>.
|
|
||||||
</para>
|
|
||||||
<para>
|
<para>
|
||||||
In PostgreSQL 12 and later, the replication configuration will be
|
In PostgreSQL 12 and later, the replication configuration will be
|
||||||
written to <filename>postgresql.auto.conf</filename>.
|
written to <filename>postgresql.auto.conf</filename>.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
In PostgreSQL 11 and earlier, the replication configuration will be
|
||||||
|
written to <filename>recovery.conf</filename>.
|
||||||
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|||||||
@@ -189,14 +189,14 @@
|
|||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<simpara>
|
<simpara>
|
||||||
If the promotion candidate has insufficient free walsenders to accomodate the standbys which will
|
If the promotion candidate has insufficient free walsenders to accommodate the standbys which will
|
||||||
be attached to it, the standby will be promoted anyway.
|
be attached to it, the standby will be promoted anyway.
|
||||||
</simpara>
|
</simpara>
|
||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<simpara>
|
<simpara>
|
||||||
If replication slots are in use but the promotion candidate has insufficient free replication slots
|
If replication slots are in use but the promotion candidate has insufficient free replication slots
|
||||||
to accomodate the standbys which will be attached to it, the standby will be promoted anyway.
|
to accommodate the standbys which will be attached to it, the standby will be promoted anyway.
|
||||||
</simpara>
|
</simpara>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
<title>repmgr &repmgrversion; Documentation</title>
|
<title>repmgr &repmgrversion; Documentation</title>
|
||||||
|
|
||||||
<bookinfo>
|
<bookinfo>
|
||||||
<corpauthor>2ndQuadrant Ltd</corpauthor>
|
<corpauthor>EnterpriseDB Corporation</corpauthor>
|
||||||
<productname>repmgr</productname>
|
<productname>repmgr</productname>
|
||||||
<productnumber>&repmgrversion;</productnumber>
|
<productnumber>&repmgrversion;</productnumber>
|
||||||
&legal;
|
&legal;
|
||||||
@@ -38,20 +38,20 @@
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
&repmgr; is developed by
|
&repmgr; is developed by
|
||||||
<ulink url="https://2ndquadrant.com">2ndQuadrant</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/2ndQuadrant/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 2ndQuadrant customers contribute funding
|
Multiple 2ndQuadrant (EDB) customers contribute funding
|
||||||
to make repmgr development possible.
|
to make repmgr development possible.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
&repmgr; is fully supported by 2ndQuadrant's
|
&repmgr; is fully supported by 2ndQuadrant (EDB)'s
|
||||||
<ulink url="https://www.2ndquadrant.com/en/support/support-postgresql/">24/7 Production Support</ulink>.
|
<ulink url="https://www.2ndquadrant.com/en/support/support-postgresql/">24/7 Production Support</ulink>.
|
||||||
2ndQuadrant, a Major Sponsor of the PostgreSQL project, continues to develop and maintain &repmgr;.
|
EnterpriseDB Corporation, a Major Sponsor of the PostgreSQL project, continues to maintain &repmgr;.
|
||||||
Other organisations as well as individual developers are welcome to participate in the efforts.
|
We welcome participation from other organisations and individual developers.
|
||||||
</para>
|
</para>
|
||||||
</abstract>
|
</abstract>
|
||||||
|
|
||||||
|
|||||||
@@ -586,7 +586,7 @@ INFO: node 3 received notification to rerun promotion candidate election
|
|||||||
<sect2 id="repmgrd-primary-child-disconnection-caveats">
|
<sect2 id="repmgrd-primary-child-disconnection-caveats">
|
||||||
<title>Standby disconnections monitoring caveats</title>
|
<title>Standby disconnections monitoring caveats</title>
|
||||||
<para>
|
<para>
|
||||||
The follwing caveats should be considered if you are intending to use this functionality.
|
The following caveats should be considered if you are intending to use this functionality.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
<itemizedlist mark="bullet">
|
<itemizedlist mark="bullet">
|
||||||
|
|||||||
@@ -89,6 +89,10 @@
|
|||||||
<literal>query</literal> - determines server availability
|
<literal>query</literal> - determines server availability
|
||||||
by executing an SQL statement on the node via the existing connection
|
by executing an SQL statement on the node via the existing connection
|
||||||
</simpara>
|
</simpara>
|
||||||
|
<simpara>
|
||||||
|
The query is a minimal throwaway query - <command>SELECT 1</command> -
|
||||||
|
which is used to determine that the server can accept queries.
|
||||||
|
</simpara>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
@@ -152,7 +156,7 @@
|
|||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
See also <filename><ulink url="https://raw.githubusercontent.com/2ndQuadrant/repmgr/master/repmgr.conf.sample">repmgr.conf.sample</ulink></filename> for an annotated sample configuration file.
|
See also <filename><ulink url="https://raw.githubusercontent.com/EnterpriseDB/repmgr/master/repmgr.conf.sample">repmgr.conf.sample</ulink></filename> for an annotated sample configuration file.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<sect2 id="repmgrd-automatic-failover-configuration">
|
<sect2 id="repmgrd-automatic-failover-configuration">
|
||||||
@@ -329,7 +333,7 @@
|
|||||||
<title>Optional configuration for automatic failover</title>
|
<title>Optional configuration for automatic failover</title>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
The following configuraton options can be use to fine-tune automatic failover:
|
The following configuraton options can be used to fine-tune automatic failover:
|
||||||
</para>
|
</para>
|
||||||
<variablelist>
|
<variablelist>
|
||||||
|
|
||||||
@@ -539,7 +543,7 @@
|
|||||||
</indexterm>
|
</indexterm>
|
||||||
<para>
|
<para>
|
||||||
For further details and a reference implementation, see the separate document
|
For further details and a reference implementation, see the separate document
|
||||||
<ulink url="https://github.com/2ndQuadrant/repmgr/blob/master/doc/repmgrd-node-fencing.md">Fencing a failed master node with repmgrd and PgBouncer</ulink>.
|
<ulink url="https://github.com/EnterpriseDB/repmgr/blob/master/doc/repmgrd-node-fencing.md">Fencing a failed master node with repmgrd and PgBouncer</ulink>.
|
||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
@@ -969,7 +973,7 @@ repmgrd_service_stop_command='sudo systemctl repmgr12 stop'
|
|||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
If none of the above apply, &repmgrd; will create a PID file
|
If none of the above apply, &repmgrd; will create a PID file
|
||||||
in the operating system's temporary directory (as setermined by the environment variable
|
in the operating system's temporary directory (as determined by the environment variable
|
||||||
<varname>TMPDIR</varname>, or if that is not set, will use <filename>/tmp</filename>).
|
<varname>TMPDIR</varname>, or if that is not set, will use <filename>/tmp</filename>).
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
|
|||||||
@@ -120,16 +120,19 @@
|
|||||||
</important>
|
</important>
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<simpara>
|
<para>
|
||||||
On <literal>systemd</literal> systems we strongly recommend using the appropriate
|
On <literal>systemd</literal> systems we strongly recommend using the appropriate
|
||||||
<command>systemctl</command> commands (typically run via <command>sudo</command>) to ensure
|
<command>systemctl</command> commands (typically run via <command>sudo</command>) to ensure
|
||||||
<literal>systemd</literal> is informed about the status of the PostgreSQL service.
|
<literal>systemd</literal> is informed about the status of the PostgreSQL service.
|
||||||
</simpara>
|
</para>
|
||||||
<simpara>
|
<para>
|
||||||
If using <command>sudo</command> for the <command>systemctl</command> calls, make sure the
|
If using <command>sudo</command> for the <command>systemctl</command> calls, make sure the
|
||||||
<command>sudo</command> specification doesn't require a real tty for the user. If not set
|
<command>sudo</command> specification doesn't require a real tty for the user. If not set
|
||||||
this way, <command>repmgr</command> will fail to stop the primary.
|
this way, <command>repmgr</command> will fail to stop the primary.
|
||||||
</simpara>
|
</para>
|
||||||
|
<para>
|
||||||
|
See the <xref linkend="configuration-file-service-commands"/> documentation section for further details.
|
||||||
|
</para>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
|||||||
@@ -482,7 +482,7 @@ ALTER EXTENSION repmgr UPDATE</programlisting>
|
|||||||
<simpara>
|
<simpara>
|
||||||
If you don't care about any data from the existing &repmgr; installation,
|
If you don't care about any data from the existing &repmgr; installation,
|
||||||
(e.g. the contents of the <structname>events</structname> and <structname>monitoring</structname>
|
(e.g. the contents of the <structname>events</structname> and <structname>monitoring</structname>
|
||||||
tables), the follwing steps can be skipped; proceed to <xref linkend="upgrade-reregister-nodes"/>.
|
tables), the following steps can be skipped; proceed to <xref linkend="upgrade-reregister-nodes"/>.
|
||||||
</simpara>
|
</simpara>
|
||||||
</tip>
|
</tip>
|
||||||
|
|
||||||
@@ -497,10 +497,10 @@ ALTER EXTENSION repmgr UPDATE</programlisting>
|
|||||||
<itemizedlist spacing="compact" mark="bullet">
|
<itemizedlist spacing="compact" mark="bullet">
|
||||||
<listitem>
|
<listitem>
|
||||||
<simpara>
|
<simpara>
|
||||||
<ulink url="https://raw.githubusercontent.com/2ndQuadrant/repmgr/REL3_3_STABLE/sql/repmgr3.0_repmgr3.1.sql">repmgr3.0_repmgr3.1.sql</ulink></simpara>
|
<ulink url="https://raw.githubusercontent.com/EnterpriseDB/repmgr/REL3_3_STABLE/sql/repmgr3.0_repmgr3.1.sql">repmgr3.0_repmgr3.1.sql</ulink></simpara>
|
||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<simpara><ulink url="https://raw.githubusercontent.com/2ndQuadrant/repmgr/REL3_3_STABLE/sql/repmgr3.1.1_repmgr3.1.2.sql">repmgr3.1.1_repmgr3.1.2.sql</ulink></simpara>
|
<simpara><ulink url="https://raw.githubusercontent.com/EnterpriseDB/repmgr/REL3_3_STABLE/sql/repmgr3.1.1_repmgr3.1.2.sql">repmgr3.1.1_repmgr3.1.2.sql</ulink></simpara>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
</para>
|
</para>
|
||||||
@@ -532,7 +532,7 @@ ALTER EXTENSION repmgr UPDATE</programlisting>
|
|||||||
<sect2>
|
<sect2>
|
||||||
<title>Upgrading the repmgr schema (PostgreSQL 13 and later)</title>
|
<title>Upgrading the repmgr schema (PostgreSQL 13 and later)</title>
|
||||||
<para>
|
<para>
|
||||||
Beginning with PostgreSQL 13, the <command>CREATE EXTENSION ... FROM</command>
|
Beginning with PostgreSQL 13, the <command>CREATE EXTENSION ... FROM unpackaged</command>
|
||||||
syntax is no longer available. In the unlikely event you have ended up with an
|
syntax is no longer available. In the unlikely event you have ended up with an
|
||||||
installation running PostgreSQL 13 or later and containing the legacy &repmgr;
|
installation running PostgreSQL 13 or later and containing the legacy &repmgr;
|
||||||
schema, there is no convenient way of upgrading this; instead you'll just need
|
schema, there is no convenient way of upgrading this; instead you'll just need
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* errcode.h
|
* errcode.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
2
log.c
2
log.c
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* log.c - Logging methods
|
* log.c - Logging methods
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
2
log.h
2
log.h
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* log.h
|
* log.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
245
repmgr--unpackaged--5.2.sql
Normal file
245
repmgr--unpackaged--5.2.sql
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "CREATE EXTENSION repmgr" to load this file. \quit
|
||||||
|
|
||||||
|
-- extract the current schema name
|
||||||
|
-- NOTE: this assumes there will be only one schema matching 'repmgr_%';
|
||||||
|
-- user is responsible for ensuring this is the case
|
||||||
|
|
||||||
|
CREATE TEMPORARY TABLE repmgr_old_schema (schema_name TEXT);
|
||||||
|
INSERT INTO repmgr_old_schema (schema_name)
|
||||||
|
SELECT nspname AS schema_name
|
||||||
|
FROM pg_catalog.pg_namespace
|
||||||
|
WHERE nspname LIKE 'repmgr_%'
|
||||||
|
LIMIT 1;
|
||||||
|
|
||||||
|
-- move old objects into new schema
|
||||||
|
DO $repmgr$
|
||||||
|
DECLARE
|
||||||
|
old_schema TEXT;
|
||||||
|
BEGIN
|
||||||
|
SELECT schema_name FROM repmgr_old_schema
|
||||||
|
INTO old_schema;
|
||||||
|
EXECUTE format('ALTER TABLE %I.repl_nodes SET SCHEMA repmgr', old_schema);
|
||||||
|
EXECUTE format('ALTER TABLE %I.repl_events SET SCHEMA repmgr', old_schema);
|
||||||
|
EXECUTE format('ALTER TABLE %I.repl_monitor SET SCHEMA repmgr', old_schema);
|
||||||
|
EXECUTE format('DROP VIEW IF EXISTS %I.repl_show_nodes', old_schema);
|
||||||
|
EXECUTE format('DROP VIEW IF EXISTS %I.repl_status', old_schema);
|
||||||
|
END$repmgr$;
|
||||||
|
|
||||||
|
-- convert "repmgr_$cluster.repl_nodes" to "repmgr.nodes"
|
||||||
|
CREATE TABLE repmgr.nodes (
|
||||||
|
node_id INTEGER PRIMARY KEY,
|
||||||
|
upstream_node_id INTEGER NULL REFERENCES repmgr.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
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO repmgr.nodes
|
||||||
|
(node_id, upstream_node_id, active, node_name, type, location, priority, conninfo, repluser, slot_name, config_file)
|
||||||
|
SELECT id, upstream_node_id, active, name,
|
||||||
|
CASE WHEN type = 'master' THEN 'primary' ELSE type END,
|
||||||
|
'default', priority, conninfo, 'unknown', slot_name, 'unknown'
|
||||||
|
FROM repmgr.repl_nodes
|
||||||
|
ORDER BY id;
|
||||||
|
|
||||||
|
|
||||||
|
-- convert "repmgr_$cluster.repl_event" to "event"
|
||||||
|
|
||||||
|
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
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO repmgr.events
|
||||||
|
(node_id, event, successful, event_timestamp, details)
|
||||||
|
SELECT node_id, event, successful, event_timestamp, details
|
||||||
|
FROM repmgr.repl_events;
|
||||||
|
|
||||||
|
-- create new table "repmgr.voting_term"
|
||||||
|
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;
|
||||||
|
|
||||||
|
INSERT INTO repmgr.voting_term (term) VALUES (1);
|
||||||
|
|
||||||
|
-- convert "repmgr_$cluster.repl_monitor" to "monitoring_history"
|
||||||
|
|
||||||
|
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
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO repmgr.monitoring_history
|
||||||
|
(primary_node_id, standby_node_id, last_monitor_time, last_apply_time, last_wal_primary_location, last_wal_standby_location, replication_lag, apply_lag)
|
||||||
|
SELECT primary_node, standby_node, last_monitor_time, last_apply_time, last_wal_primary_location::pg_lsn, last_wal_standby_location::pg_lsn, replication_lag, apply_lag
|
||||||
|
FROM repmgr.repl_monitor;
|
||||||
|
|
||||||
|
CREATE INDEX idx_monitoring_history_time
|
||||||
|
ON repmgr.monitoring_history (last_monitor_time, standby_node_id);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
/* ================= */
|
||||||
|
/* repmgrd functions */
|
||||||
|
/* ================= */
|
||||||
|
|
||||||
|
/* monitoring functions */
|
||||||
|
|
||||||
|
CREATE FUNCTION set_local_node_id(INT)
|
||||||
|
RETURNS VOID
|
||||||
|
AS 'MODULE_PATHNAME', 'set_local_node_id'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION get_local_node_id()
|
||||||
|
RETURNS INT
|
||||||
|
AS 'MODULE_PATHNAME', 'get_local_node_id'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION standby_set_last_updated()
|
||||||
|
RETURNS TIMESTAMP WITH TIME ZONE
|
||||||
|
AS 'MODULE_PATHNAME', 'standby_set_last_updated'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION standby_get_last_updated()
|
||||||
|
RETURNS TIMESTAMP WITH TIME ZONE
|
||||||
|
AS 'MODULE_PATHNAME', 'standby_get_last_updated'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION set_upstream_last_seen(INT)
|
||||||
|
RETURNS VOID
|
||||||
|
AS 'MODULE_PATHNAME', 'set_upstream_last_seen'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION get_upstream_last_seen()
|
||||||
|
RETURNS INT
|
||||||
|
AS 'MODULE_PATHNAME', 'get_upstream_last_seen'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION get_upstream_node_id()
|
||||||
|
RETURNS INT
|
||||||
|
AS 'MODULE_PATHNAME', 'get_upstream_node_id'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION set_upstream_node_id(INT)
|
||||||
|
RETURNS VOID
|
||||||
|
AS 'MODULE_PATHNAME', 'set_upstream_node_id'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
/* failover functions */
|
||||||
|
|
||||||
|
CREATE FUNCTION notify_follow_primary(INT)
|
||||||
|
RETURNS VOID
|
||||||
|
AS 'MODULE_PATHNAME', 'notify_follow_primary'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION get_new_primary()
|
||||||
|
RETURNS INT
|
||||||
|
AS 'MODULE_PATHNAME', 'get_new_primary'
|
||||||
|
LANGUAGE C STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION reset_voting_status()
|
||||||
|
RETURNS VOID
|
||||||
|
AS 'MODULE_PATHNAME', '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', '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
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* drop old tables */
|
||||||
|
DROP TABLE repmgr.repl_nodes;
|
||||||
|
DROP TABLE repmgr.repl_monitor;
|
||||||
|
DROP TABLE repmgr.repl_events;
|
||||||
|
|
||||||
|
-- remove temporary table
|
||||||
|
DROP TABLE repmgr_old_schema;
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Implements cluster information actions for the repmgr command line utility
|
* Implements cluster information actions for the repmgr command line utility
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-cluster.h
|
* repmgr-action-cluster.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* repmgr-action-daemon.c
|
* repmgr-action-daemon.c
|
||||||
*
|
*
|
||||||
* Implements repmgrd actions for the repmgr command line utility
|
* Implements repmgrd actions for the repmgr command line utility
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-daemon.h
|
* repmgr-action-daemon.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Implements actions available for any kind of node
|
* Implements actions available for any kind of node
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -2612,6 +2612,13 @@ do_node_rejoin(void)
|
|||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Emit a notice about the identity of the rejoin target
|
||||||
|
*/
|
||||||
|
log_notice(_("rejoin target is node \"%s\" (ID: %i)"),
|
||||||
|
primary_node_record.node_name,
|
||||||
|
primary_node_record.node_id);
|
||||||
|
|
||||||
/* connect to registered primary and check it's not in recovery */
|
/* connect to registered primary and check it's not in recovery */
|
||||||
primary_conn = establish_db_connection(primary_node_record.conninfo, false);
|
primary_conn = establish_db_connection(primary_node_record.conninfo, false);
|
||||||
|
|
||||||
@@ -3599,7 +3606,7 @@ do_node_help(void)
|
|||||||
printf(_(" Following options check an individual status:\n"));
|
printf(_(" Following options check an individual status:\n"));
|
||||||
printf(_(" --archive-ready number of WAL files ready for archiving\n"));
|
printf(_(" --archive-ready number of WAL files ready for archiving\n"));
|
||||||
printf(_(" --downstream whether all downstream nodes are connected\n"));
|
printf(_(" --downstream whether all downstream nodes are connected\n"));
|
||||||
printf(_(" --uptream whether the node is connected to its upstream\n"));
|
printf(_(" --upstream whether the node is connected to its upstream\n"));
|
||||||
printf(_(" --replication-lag replication lag in seconds (standbys only)\n"));
|
printf(_(" --replication-lag replication lag in seconds (standbys only)\n"));
|
||||||
printf(_(" --role check node has expected role\n"));
|
printf(_(" --role check node has expected role\n"));
|
||||||
printf(_(" --slots check for inactive replication slots\n"));
|
printf(_(" --slots check for inactive replication slots\n"));
|
||||||
@@ -3617,7 +3624,7 @@ do_node_help(void)
|
|||||||
printf(_(" --dry-run check that the prerequisites are met for rejoining the node\n" \
|
printf(_(" --dry-run check that the prerequisites are met for rejoining the node\n" \
|
||||||
" (including usability of \"pg_rewind\" if requested)\n"));
|
" (including usability of \"pg_rewind\" if requested)\n"));
|
||||||
printf(_(" --force-rewind[=VALUE] execute \"pg_rewind\" if necessary\n"));
|
printf(_(" --force-rewind[=VALUE] execute \"pg_rewind\" if necessary\n"));
|
||||||
printf(_(" (9.3 and 9.4 - provide full \"pg_rewind\" path)\n"));
|
printf(_(" (PostgreSQL 9.4 - provide full \"pg_rewind\" path)\n"));
|
||||||
|
|
||||||
printf(_(" --config-files comma-separated list of configuration files to retain\n" \
|
printf(_(" --config-files comma-separated list of configuration files to retain\n" \
|
||||||
" after executing \"pg_rewind\"\n"));
|
" after executing \"pg_rewind\"\n"));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-node.h
|
* repmgr-action-node.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Implements primary actions for the repmgr command line utility
|
* Implements primary actions for the repmgr command line utility
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-primary.h
|
* repmgr-action-primary.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* repmgr-action-service.c
|
* repmgr-action-service.c
|
||||||
*
|
*
|
||||||
* Implements repmgrd actions for the repmgr command line utility
|
* Implements repmgrd actions for the repmgr command line utility
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-service.h
|
* repmgr-action-service.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Implements standby actions for the repmgr command line utility
|
* Implements standby actions for the repmgr command line utility
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -733,7 +733,7 @@ do_standby_clone(void)
|
|||||||
drop_replication_slot_if_exists(source_conn, UNKNOWN_NODE_ID, local_node_record.slot_name);
|
drop_replication_slot_if_exists(source_conn, UNKNOWN_NODE_ID, local_node_record.slot_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_error(_("unable to take a base backup of the primary server"));
|
log_error(_("unable to take a base backup of the source server"));
|
||||||
log_hint(_("data directory (\"%s\") may need to be cleaned up manually"),
|
log_hint(_("data directory (\"%s\") may need to be cleaned up manually"),
|
||||||
local_data_directory);
|
local_data_directory);
|
||||||
|
|
||||||
@@ -763,7 +763,7 @@ do_standby_clone(void)
|
|||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
appendPQExpBufferStr(&command, " ");
|
appendPQExpBufferChar(&command, ' ');
|
||||||
|
|
||||||
/* Somewhat inconsistent, but pg_verifybackup doesn't accept a -D option */
|
/* Somewhat inconsistent, but pg_verifybackup doesn't accept a -D option */
|
||||||
appendShellString(&command,
|
appendShellString(&command,
|
||||||
@@ -838,6 +838,16 @@ do_standby_clone(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do a final check on the data directory permissions - if the user
|
||||||
|
* is cloning into an existing directory set to 0750, and the server
|
||||||
|
* is Pg10 or earlier, Pg will refuse to start. We might not have
|
||||||
|
* known the server version when creating the data directory
|
||||||
|
* (mainly if cloning from Barman with no upstream connection), hence
|
||||||
|
* the additional check here.
|
||||||
|
*/
|
||||||
|
set_dir_permissions(local_data_directory, source_server_version_num);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: It might be nice to provide an option to have repmgr start the
|
* TODO: It might be nice to provide an option to have repmgr start the
|
||||||
* PostgreSQL server automatically
|
* PostgreSQL server automatically
|
||||||
@@ -1290,6 +1300,64 @@ _do_create_replication_conf(void)
|
|||||||
PQExpBufferData msg;
|
PQExpBufferData msg;
|
||||||
t_replication_slot slot_info = T_REPLICATION_SLOT_INITIALIZER;
|
t_replication_slot slot_info = T_REPLICATION_SLOT_INITIALIZER;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check the node record has slot_name set; if not we'll need to
|
||||||
|
* update it.
|
||||||
|
*/
|
||||||
|
if (local_node_record.slot_name[0] == '\0')
|
||||||
|
{
|
||||||
|
PGconn *primary_conn = NULL;
|
||||||
|
|
||||||
|
create_slot_name(local_node_record.slot_name, local_node_record.node_id);
|
||||||
|
|
||||||
|
/* Check we can connect to the primary so we can update the record */
|
||||||
|
|
||||||
|
if (get_recovery_type(upstream_conn) == RECTYPE_PRIMARY)
|
||||||
|
{
|
||||||
|
primary_conn = upstream_conn;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
primary_conn = establish_primary_db_connection(upstream_conn, false);
|
||||||
|
|
||||||
|
if (primary_conn == NULL)
|
||||||
|
{
|
||||||
|
log_error(_("unable to connect to primary to update slot name for node \"%s\" (ID: %i)"),
|
||||||
|
local_node_record.node_name,
|
||||||
|
local_node_record.node_id);
|
||||||
|
PQfinish(upstream_conn);
|
||||||
|
termPQExpBuffer(&msg);
|
||||||
|
exit(ERR_BAD_CONFIG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runtime_options.dry_run == true)
|
||||||
|
{
|
||||||
|
log_info(_("would set \"slot_name\" for node \"%s\" (ID: %i) to \"%s\""),
|
||||||
|
local_node_record.node_name,
|
||||||
|
local_node_record.node_id,
|
||||||
|
local_node_record.slot_name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bool success = update_node_record_slot_name(primary_conn,
|
||||||
|
local_node_record.node_id,
|
||||||
|
local_node_record.slot_name);
|
||||||
|
|
||||||
|
if (primary_conn != upstream_conn)
|
||||||
|
PQfinish(primary_conn);
|
||||||
|
|
||||||
|
if (success == false)
|
||||||
|
{
|
||||||
|
log_error(_("unable to update slot name for node \"%s\" (ID: %i)"),
|
||||||
|
local_node_record.node_name,
|
||||||
|
local_node_record.node_id);
|
||||||
|
PQfinish(upstream_conn);
|
||||||
|
exit(ERR_BAD_CONFIG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
record_status = get_slot_record(upstream_conn, local_node_record.slot_name, &slot_info);
|
record_status = get_slot_record(upstream_conn, local_node_record.slot_name, &slot_info);
|
||||||
|
|
||||||
/* check if replication slot exists*/
|
/* check if replication slot exists*/
|
||||||
@@ -1444,7 +1512,18 @@ _do_create_replication_conf(void)
|
|||||||
|
|
||||||
if (node_is_running == true)
|
if (node_is_running == true)
|
||||||
{
|
{
|
||||||
log_hint(_("node must be restarted for the new file to take effect"));
|
if (PQserverVersion(upstream_conn) >= 130000)
|
||||||
|
{
|
||||||
|
log_hint(_("configuration must be reloaded for the configuration changes to take effect"));
|
||||||
|
}
|
||||||
|
else if (PQserverVersion(upstream_conn) >= 120000)
|
||||||
|
{
|
||||||
|
log_hint(_("node must be restarted for the configuration changes to take effect"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_hint(_("node must be restarted for the new file to take effect"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1911,7 +1990,7 @@ do_standby_register(void)
|
|||||||
/*
|
/*
|
||||||
* If --upstream-node-id not provided, we're defaulting to the primary as
|
* If --upstream-node-id not provided, we're defaulting to the primary as
|
||||||
* upstream node. If local node is available, double-check that it's attached
|
* upstream node. If local node is available, double-check that it's attached
|
||||||
* to the primary, in case --upstream-node-id was an accidental ommission.
|
* to the primary, in case --upstream-node-id was an accidental omission.
|
||||||
*
|
*
|
||||||
* Currently we'll only do this for newly registered nodes.
|
* Currently we'll only do this for newly registered nodes.
|
||||||
*/
|
*/
|
||||||
@@ -3374,7 +3453,7 @@ do_standby_follow_internal(PGconn *primary_conn, PGconn *follow_target_conn, t_n
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In the unlikley event that fails, we'll fall back to a restart */
|
/* In the unlikely event that fails, we'll fall back to a restart */
|
||||||
log_warning(_("unable to reload server configuration"));
|
log_warning(_("unable to reload server configuration"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3605,7 +3684,7 @@ do_standby_switchover(void)
|
|||||||
* SANITY CHECKS
|
* SANITY CHECKS
|
||||||
*
|
*
|
||||||
* We'll be doing a bunch of operations on the remote server (primary to
|
* We'll be doing a bunch of operations on the remote server (primary to
|
||||||
* be demoted) - careful checks needed before proceding.
|
* be demoted) - careful checks needed before proceeding.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
local_conn = establish_db_connection(config_file_options.conninfo, true);
|
local_conn = establish_db_connection(config_file_options.conninfo, true);
|
||||||
@@ -4087,7 +4166,7 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
if (command_success == false || command_output.data[0] == '0')
|
if (command_success == false || command_output.data[0] == '0')
|
||||||
{
|
{
|
||||||
log_error(_("expected configuration file not found on the demotion candiate \"%s\" (ID: %i)"),
|
log_error(_("expected configuration file not found on the demotion candidate \"%s\" (ID: %i)"),
|
||||||
remote_node_record.node_name,
|
remote_node_record.node_name,
|
||||||
remote_node_record.node_id);
|
remote_node_record.node_id);
|
||||||
log_detail(_("registered configuration file is \"%s\""),
|
log_detail(_("registered configuration file is \"%s\""),
|
||||||
@@ -4187,7 +4266,7 @@ do_standby_switchover(void)
|
|||||||
else if (remote_error == REMOTE_ERROR_CONNINFO_PARSE)
|
else if (remote_error == REMOTE_ERROR_CONNINFO_PARSE)
|
||||||
{
|
{
|
||||||
/* highly unlikely */
|
/* highly unlikely */
|
||||||
log_detail(_("an error was encountered when parsing the \"conninfo\" parameter in \"rempgr.conf\" on node \"%s\" (ID: %i)"),
|
log_detail(_("an error was encountered when parsing the \"conninfo\" parameter in \"repmgr.conf\" on node \"%s\" (ID: %i)"),
|
||||||
remote_node_record.node_name,
|
remote_node_record.node_name,
|
||||||
remote_node_record.node_id);
|
remote_node_record.node_id);
|
||||||
}
|
}
|
||||||
@@ -5325,7 +5404,7 @@ do_standby_switchover(void)
|
|||||||
break;
|
break;
|
||||||
case JOIN_SUCCESS:
|
case JOIN_SUCCESS:
|
||||||
appendPQExpBuffer(&event_details,
|
appendPQExpBuffer(&event_details,
|
||||||
_("node \"%s\" (ID: %i) promoted to primary, node \"%s\" (ID: %i) demoted to standby"),
|
_("node \"%s\" (ID: %i) promoted to primary, node \"%s\" (ID: %i) demoted to standby"),
|
||||||
config_file_options.node_name,
|
config_file_options.node_name,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
remote_node_record.node_name,
|
remote_node_record.node_name,
|
||||||
@@ -5962,19 +6041,22 @@ check_source_server_via_barman()
|
|||||||
|
|
||||||
initPQExpBuffer(&command_output);
|
initPQExpBuffer(&command_output);
|
||||||
maxlen_snprintf(buf,
|
maxlen_snprintf(buf,
|
||||||
"ssh %s \"psql -Aqt \\\"%s\\\" -c \\\""
|
"psql -AqtX -d \\\"%s\\\" -c \\\""
|
||||||
" SELECT conninfo"
|
" SELECT conninfo"
|
||||||
" FROM repmgr.nodes"
|
" FROM repmgr.nodes"
|
||||||
" WHERE %s"
|
" WHERE %s"
|
||||||
" AND active IS TRUE"
|
" AND active IS TRUE"
|
||||||
"\\\"\"",
|
"\\\"",
|
||||||
config_file_options.barman_host,
|
|
||||||
repmgr_conninfo_buf.data,
|
repmgr_conninfo_buf.data,
|
||||||
where_condition);
|
where_condition);
|
||||||
|
|
||||||
termPQExpBuffer(&repmgr_conninfo_buf);
|
termPQExpBuffer(&repmgr_conninfo_buf);
|
||||||
|
|
||||||
command_success = local_command(buf, &command_output);
|
command_success = remote_command(config_file_options.barman_host,
|
||||||
|
runtime_options.remote_user,
|
||||||
|
buf,
|
||||||
|
config_file_options.ssh_options,
|
||||||
|
&command_output);
|
||||||
|
|
||||||
if (command_success == false)
|
if (command_success == false)
|
||||||
{
|
{
|
||||||
@@ -7506,7 +7588,7 @@ stop_backup:
|
|||||||
if (record_status == RECORD_FOUND)
|
if (record_status == RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_verbose(LOG_INFO,
|
log_verbose(LOG_INFO,
|
||||||
_("replication slot \"%s\" aleady exists on upstream node %i"),
|
_("replication slot \"%s\" already exists on upstream node %i"),
|
||||||
local_node_record->slot_name,
|
local_node_record->slot_name,
|
||||||
upstream_node_id);
|
upstream_node_id);
|
||||||
}
|
}
|
||||||
@@ -7759,7 +7841,9 @@ static void
|
|||||||
tablespace_data_append(TablespaceDataList *list, const char *name, const char *oid, const char *location)
|
tablespace_data_append(TablespaceDataList *list, const char *name, const char *oid, const char *location)
|
||||||
{
|
{
|
||||||
TablespaceDataListCell *cell = NULL;
|
TablespaceDataListCell *cell = NULL;
|
||||||
|
int oid_len = strlen(oid);
|
||||||
|
int name_len = strlen(name);
|
||||||
|
int location_len = strlen(location);
|
||||||
cell = (TablespaceDataListCell *) pg_malloc0(sizeof(TablespaceDataListCell));
|
cell = (TablespaceDataListCell *) pg_malloc0(sizeof(TablespaceDataListCell));
|
||||||
|
|
||||||
if (cell == NULL)
|
if (cell == NULL)
|
||||||
@@ -7768,13 +7852,13 @@ tablespace_data_append(TablespaceDataList *list, const char *name, const char *o
|
|||||||
exit(ERR_OUT_OF_MEMORY);
|
exit(ERR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell->oid = pg_malloc(1 + strlen(oid));
|
cell->oid = pg_malloc0(1 + oid_len);
|
||||||
cell->name = pg_malloc(1 + strlen(name));
|
cell->name = pg_malloc0(1 + name_len);
|
||||||
cell->location = pg_malloc(1 + strlen(location));
|
cell->location = pg_malloc0(1 + location_len);
|
||||||
|
|
||||||
strncpy(cell->oid, oid, 1 + strlen(oid));
|
strncpy(cell->oid, oid, oid_len);
|
||||||
strncpy(cell->name, name, 1 + strlen(name));
|
strncpy(cell->name, name, name_len);
|
||||||
strncpy(cell->location, location, 1 + strlen(location));
|
strncpy(cell->location, location, location_len);
|
||||||
|
|
||||||
if (list->tail)
|
if (list->tail)
|
||||||
list->tail->next = cell;
|
list->tail->next = cell;
|
||||||
@@ -8908,6 +8992,8 @@ do_standby_help(void)
|
|||||||
#endif
|
#endif
|
||||||
printf(_(" --without-barman do not clone from Barman even if configured\n"));
|
printf(_(" --without-barman do not clone from Barman even if configured\n"));
|
||||||
printf(_(" --replication-conf-only generate replication configuration for a previously cloned instance\n"));
|
printf(_(" --replication-conf-only generate replication configuration for a previously cloned instance\n"));
|
||||||
|
printf(_(" --recovery-min-apply-delay set PostgreSQL configuration parameter \"recovery_min_apply_delay\"\n" \
|
||||||
|
" (overrides any setting in repmgr.conf)\n"));
|
||||||
|
|
||||||
puts("");
|
puts("");
|
||||||
|
|
||||||
@@ -8960,7 +9046,7 @@ do_standby_help(void)
|
|||||||
printf(_(" --dry-run perform checks etc. but don't actually execute switchover\n"));
|
printf(_(" --dry-run perform checks etc. but don't actually execute switchover\n"));
|
||||||
printf(_(" -F, --force ignore warnings and continue anyway\n"));
|
printf(_(" -F, --force ignore warnings and continue anyway\n"));
|
||||||
printf(_(" --force-rewind[=VALUE] use \"pg_rewind\" to reintegrate the old primary if necessary\n"));
|
printf(_(" --force-rewind[=VALUE] use \"pg_rewind\" to reintegrate the old primary if necessary\n"));
|
||||||
printf(_(" (9.3 and 9.4 - provide \"pg_rewind\" path)\n"));
|
printf(_(" (PostgreSQL 9.4 - provide \"pg_rewind\" path)\n"));
|
||||||
|
|
||||||
printf(_(" -R, --remote-user=USERNAME database server username for SSH operations (default: \"%s\")\n"), runtime_options.username);
|
printf(_(" -R, --remote-user=USERNAME database server username for SSH operations (default: \"%s\")\n"), runtime_options.username);
|
||||||
printf(_(" -S, --superuser=USERNAME superuser to use, if repmgr user is not superuser\n"));
|
printf(_(" -S, --superuser=USERNAME superuser to use, if repmgr user is not superuser\n"));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-standby.h
|
* repmgr-action-standby.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Implements witness actions for the repmgr command line utility
|
* Implements witness actions for the repmgr command line utility
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -560,7 +560,7 @@ void do_witness_help(void)
|
|||||||
|
|
||||||
printf(_("WITNESS UNREGISTER\n"));
|
printf(_("WITNESS UNREGISTER\n"));
|
||||||
puts("");
|
puts("");
|
||||||
printf(_(" \"witness register\" unregisters a witness node.\n"));
|
printf(_(" \"witness unregister\" unregisters a witness node.\n"));
|
||||||
puts("");
|
puts("");
|
||||||
printf(_(" --dry-run check prerequisites but don't make any changes\n"));
|
printf(_(" --dry-run check prerequisites but don't make any changes\n"));
|
||||||
printf(_(" -F, --force unregister when witness node not running\n"));
|
printf(_(" -F, --force unregister when witness node not running\n"));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-witness.h
|
* repmgr-action-witness.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-client-global.h
|
* repmgr-client-global.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -84,7 +84,7 @@ typedef struct
|
|||||||
bool fast_checkpoint;
|
bool fast_checkpoint;
|
||||||
bool rsync_only;
|
bool rsync_only;
|
||||||
bool no_upstream_connection;
|
bool no_upstream_connection;
|
||||||
char recovery_min_apply_delay[MAXLEN];
|
char recovery_min_apply_delay[MAXLEN]; /* overrides setting in repmgr.conf */
|
||||||
char replication_user[MAXLEN];
|
char replication_user[MAXLEN];
|
||||||
char upstream_conninfo[MAXLEN];
|
char upstream_conninfo[MAXLEN];
|
||||||
bool without_barman;
|
bool without_barman;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-client.c - Command interpreter for the repmgr package
|
* repmgr-client.c - Command interpreter for the repmgr package
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This module is a command-line utility to easily setup a cluster of
|
* This module is a command-line utility to easily setup a cluster of
|
||||||
* hot standby servers for an HA environment
|
* hot standby servers for an HA environment
|
||||||
@@ -122,7 +122,7 @@ main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Tell the logger we're a command-line program - this will ensure any
|
* Tell the logger we're a command-line program - this will ensure any
|
||||||
* output logged before the logger is initialized will be formatted
|
* output logged before the logger is initialized will be formatted
|
||||||
* correctly. Can be overriden with "--log-to-file".
|
* correctly. Can be overridden with "--log-to-file".
|
||||||
*/
|
*/
|
||||||
logger_output_mode = OM_COMMAND_LINE;
|
logger_output_mode = OM_COMMAND_LINE;
|
||||||
|
|
||||||
@@ -438,6 +438,11 @@ main(int argc, char **argv)
|
|||||||
runtime_options.replication_conf_only = true;
|
runtime_options.replication_conf_only = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* --recovery-min-apply-delay */
|
||||||
|
case OPT_RECOVERY_MIN_APPLY_DELAY:
|
||||||
|
strncpy(runtime_options.recovery_min_apply_delay, optarg, sizeof(runtime_options.recovery_min_apply_delay));
|
||||||
|
break;
|
||||||
|
|
||||||
/* --verify-backup */
|
/* --verify-backup */
|
||||||
case OPT_VERIFY_BACKUP:
|
case OPT_VERIFY_BACKUP:
|
||||||
runtime_options.verify_backup = true;
|
runtime_options.verify_backup = true;
|
||||||
@@ -1105,10 +1110,25 @@ main(int argc, char **argv)
|
|||||||
exit(SUCCESS);
|
exit(SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
check_cli_parameters(action);
|
check_cli_parameters(action);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Command-line parameter --recovery-min-apply-delay overrides the equivalent
|
||||||
|
* setting in the config file. Note we'll need to parse it here to handle
|
||||||
|
* any formatting errors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (*runtime_options.recovery_min_apply_delay != '\0')
|
||||||
|
{
|
||||||
|
parse_time_unit_parameter("--recovery-min-apply-delay",
|
||||||
|
runtime_options.recovery_min_apply_delay,
|
||||||
|
config_file_options.recovery_min_apply_delay,
|
||||||
|
&cli_errors);
|
||||||
|
|
||||||
|
config_file_options.recovery_min_apply_delay_provided = true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sanity checks for command line parameters completed by now; any further
|
* Sanity checks for command line parameters completed by now; any further
|
||||||
* errors will be runtime ones
|
* errors will be runtime ones
|
||||||
@@ -1169,7 +1189,7 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for configuration file items which can be overriden by runtime
|
* Check for configuration file items which can be overridden by runtime
|
||||||
* options
|
* options
|
||||||
* =====================================================================
|
* =====================================================================
|
||||||
*/
|
*/
|
||||||
@@ -2715,7 +2735,7 @@ do_help(void)
|
|||||||
*
|
*
|
||||||
* Note:
|
* Note:
|
||||||
* This is one of two places where superuser rights are required.
|
* This is one of two places where superuser rights are required.
|
||||||
* We should also consider possible scenarious where a non-superuser
|
* We should also consider possible scenarios where a non-superuser
|
||||||
* has sufficient privileges to install the extension.
|
* has sufficient privileges to install the extension.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -2750,7 +2770,7 @@ create_repmgr_extension(PGconn *conn)
|
|||||||
log_detail(_("version %s is installed but newer version %s is available"),
|
log_detail(_("version %s is installed but newer version %s is available"),
|
||||||
extversions.installed_version,
|
extversions.installed_version,
|
||||||
extversions.default_version);
|
extversions.default_version);
|
||||||
log_hint(_("update the installed extension version by executing \"ALTER EXTENSION repmgr UPDATE\""));
|
log_hint(_("update the installed extension version by executing \"ALTER EXTENSION repmgr UPDATE\" in the repmgr database"));
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
case REPMGR_INSTALLED:
|
case REPMGR_INSTALLED:
|
||||||
@@ -2916,7 +2936,7 @@ check_server_version(PGconn *conn, char *server_type, bool exit_on_error, char *
|
|||||||
* PostgreSQL from a particular PostgreSQL release onwards (e.g. 4.4 with PostgreSQL
|
* PostgreSQL from a particular PostgreSQL release onwards (e.g. 4.4 with PostgreSQL
|
||||||
* 12 and later due to recovery.conf removal), set MAX_UNSUPPORTED_VERSION and
|
* 12 and later due to recovery.conf removal), set MAX_UNSUPPORTED_VERSION and
|
||||||
* MAX_UNSUPPORTED_VERSION_NUM in "repmgr.h" to define the first PostgreSQL
|
* MAX_UNSUPPORTED_VERSION_NUM in "repmgr.h" to define the first PostgreSQL
|
||||||
* version which can't be suppored.
|
* version which can't be supported.
|
||||||
*/
|
*/
|
||||||
#ifdef MAX_UNSUPPORTED_VERSION_NUM
|
#ifdef MAX_UNSUPPORTED_VERSION_NUM
|
||||||
if (conn_server_version_num >= MAX_UNSUPPORTED_VERSION_NUM)
|
if (conn_server_version_num >= MAX_UNSUPPORTED_VERSION_NUM)
|
||||||
@@ -4066,7 +4086,7 @@ check_standby_join(PGconn *upstream_conn, t_node_info *upstream_node_record, t_n
|
|||||||
|
|
||||||
if (node_attached == NODE_NOT_ATTACHED)
|
if (node_attached == NODE_NOT_ATTACHED)
|
||||||
{
|
{
|
||||||
log_detail(_("node \"%s\" (ID: %i) is currrently attached to its upstream node in state \"%s\""),
|
log_detail(_("node \"%s\" (ID: %i) is currently attached to its upstream node in state \"%s\""),
|
||||||
upstream_node_record->node_name,
|
upstream_node_record->node_name,
|
||||||
standby_node_record->node_id,
|
standby_node_record->node_id,
|
||||||
node_state);
|
node_state);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-client.h
|
* repmgr-client.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -99,6 +99,7 @@
|
|||||||
#define OPT_REPLICATION_CONFIG_OWNER 1046
|
#define OPT_REPLICATION_CONFIG_OWNER 1046
|
||||||
#define OPT_DB_CONNECTION 1047
|
#define OPT_DB_CONNECTION 1047
|
||||||
#define OPT_VERIFY_BACKUP 1048
|
#define OPT_VERIFY_BACKUP 1048
|
||||||
|
#define OPT_RECOVERY_MIN_APPLY_DELAY 1049
|
||||||
|
|
||||||
/* These options are for internal use only */
|
/* These options are for internal use only */
|
||||||
#define OPT_CONFIG_ARCHIVE_DIR 2001
|
#define OPT_CONFIG_ARCHIVE_DIR 2001
|
||||||
@@ -164,6 +165,7 @@ static struct option long_options[] =
|
|||||||
{"without-barman", no_argument, NULL, OPT_WITHOUT_BARMAN},
|
{"without-barman", no_argument, NULL, OPT_WITHOUT_BARMAN},
|
||||||
{"replication-conf-only", no_argument, NULL, OPT_REPLICATION_CONF_ONLY},
|
{"replication-conf-only", no_argument, NULL, OPT_REPLICATION_CONF_ONLY},
|
||||||
{"verify-backup", no_argument, NULL, OPT_VERIFY_BACKUP },
|
{"verify-backup", no_argument, NULL, OPT_VERIFY_BACKUP },
|
||||||
|
{"recovery-min-apply-delay", required_argument, NULL, OPT_RECOVERY_MIN_APPLY_DELAY },
|
||||||
/* deprecate this once Pg11 and earlier are unsupported */
|
/* deprecate this once Pg11 and earlier are unsupported */
|
||||||
{"recovery-conf-only", no_argument, NULL, OPT_REPLICATION_CONF_ONLY},
|
{"recovery-conf-only", no_argument, NULL, OPT_REPLICATION_CONF_ONLY},
|
||||||
|
|
||||||
|
|||||||
4
repmgr.c
4
repmgr.c
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr.c - repmgr extension
|
* repmgr.c - repmgr extension
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This is the actual extension code; see repmgr-client.c for the code which
|
* This is the actual extension code; see repmgr-client.c for the code which
|
||||||
* generates the repmgr binary
|
* generates the repmgr binary
|
||||||
@@ -194,7 +194,7 @@ repmgr_shmem_startup(void)
|
|||||||
shared_state = NULL;
|
shared_state = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create or attach to the shared memory state, including hash table
|
* Create or attach to the shared memory state
|
||||||
*/
|
*/
|
||||||
LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE);
|
LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE);
|
||||||
|
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
|
|
||||||
#primary_follow_timeout=60 # The max length of time (in seconds) to wait
|
#primary_follow_timeout=60 # The max length of time (in seconds) to wait
|
||||||
# for the new primary to become available
|
# for the new primary to become available
|
||||||
#standby_follow_timeout=15 # The max length of time (in seconds) to wait
|
#standby_follow_timeout=30 # The max length of time (in seconds) to wait
|
||||||
# for the standby to connect to the primary
|
# for the standby to connect to the primary
|
||||||
#standby_follow_restart=false # Restart the standby instead of sending a SIGHUP
|
#standby_follow_restart=false # Restart the standby instead of sending a SIGHUP
|
||||||
# (only for PostgreSQL 13 and later)
|
# (only for PostgreSQL 13 and later)
|
||||||
@@ -301,7 +301,7 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
|
|
||||||
#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': execute a throwaway query on the current connection
|
# '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
|
||||||
#reconnect_attempts=6 # Number of attempts which will be made to reconnect to an unreachable
|
#reconnect_attempts=6 # Number of attempts which will be made to reconnect to an unreachable
|
||||||
# primary (or other upstream node)
|
# primary (or other upstream node)
|
||||||
@@ -323,7 +323,7 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
# for the the local node to restart and become ready to accept connections after
|
# for the the local node to restart and become ready to accept connections after
|
||||||
# executing "follow_command" (defaults to the value set in "standby_reconnect_timeout")
|
# executing "follow_command" (defaults to the value set in "standby_reconnect_timeout")
|
||||||
|
|
||||||
#monitoring_history=no # Whether to write monitoring data to the "montoring_history" table
|
#monitoring_history=no # Whether to write monitoring data to the "monitoring_history" table
|
||||||
#monitor_interval_secs=2 # Interval (in seconds) at which to write monitoring data
|
#monitor_interval_secs=2 # Interval (in seconds) at which to write monitoring data
|
||||||
#degraded_monitoring_timeout=-1 # Interval (in seconds) after which repmgrd will terminate if the
|
#degraded_monitoring_timeout=-1 # Interval (in seconds) after which repmgrd will terminate if the
|
||||||
# server(s) being monitored are no longer available. -1 (default)
|
# server(s) being monitored are no longer available. -1 (default)
|
||||||
|
|||||||
5
repmgr.h
5
repmgr.h
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr.h
|
* repmgr.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -77,8 +77,6 @@
|
|||||||
#define MIN_SUPPORTED_VERSION "9.4"
|
#define MIN_SUPPORTED_VERSION "9.4"
|
||||||
#define MIN_SUPPORTED_VERSION_NUM 90400
|
#define MIN_SUPPORTED_VERSION_NUM 90400
|
||||||
|
|
||||||
#define REPLICATION_TYPE_PHYSICAL 1
|
|
||||||
|
|
||||||
#define UNKNOWN_SERVER_VERSION_NUM -1
|
#define UNKNOWN_SERVER_VERSION_NUM -1
|
||||||
#define UNKNOWN_REPMGR_VERSION_NUM -1
|
#define UNKNOWN_REPMGR_VERSION_NUM -1
|
||||||
|
|
||||||
@@ -122,6 +120,7 @@
|
|||||||
#define DEFAULT_NODE_REJOIN_TIMEOUT 60 /* seconds */
|
#define DEFAULT_NODE_REJOIN_TIMEOUT 60 /* seconds */
|
||||||
#define DEFAULT_ARCHIVE_READY_WARNING 16 /* WAL files */
|
#define DEFAULT_ARCHIVE_READY_WARNING 16 /* WAL files */
|
||||||
#define DEFAULT_ARCHIVE_READY_CRITICAL 128 /* WAL files */
|
#define DEFAULT_ARCHIVE_READY_CRITICAL 128 /* WAL files */
|
||||||
|
#define DEFAULT_REPLICATION_TYPE REPLICATION_TYPE_PHYSICAL
|
||||||
#define DEFAULT_REPLICATION_LAG_WARNING 300 /* seconds */
|
#define DEFAULT_REPLICATION_LAG_WARNING 300 /* seconds */
|
||||||
#define DEFAULT_REPLICATION_LAG_CRITICAL 600 /* seconds */
|
#define DEFAULT_REPLICATION_LAG_CRITICAL 600 /* seconds */
|
||||||
#define DEFAULT_WITNESS_SYNC_INTERVAL 15 /* seconds */
|
#define DEFAULT_WITNESS_SYNC_INTERVAL 15 /* seconds */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#define REPMGR_VERSION_DATE ""
|
#define REPMGR_VERSION_DATE ""
|
||||||
#define REPMGR_VERSION "5.2dev"
|
#define REPMGR_VERSION "5.2.1"
|
||||||
#define REPMGR_VERSION_NUM 50200
|
#define REPMGR_VERSION_NUM 50201
|
||||||
#define REPMGR_RELEASE_DATE "2020-XX-XX"
|
#define REPMGR_RELEASE_DATE "2020-12-07"
|
||||||
#define PG_ACTUAL_VERSION_NUM
|
#define PG_ACTUAL_VERSION_NUM
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* repmgrd-physical.c - physical (streaming) replication functionality for repmgrd
|
* repmgrd-physical.c - physical (streaming) replication functionality for repmgrd
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -737,7 +737,7 @@ check_primary_status(int degraded_monitoring_elapsed)
|
|||||||
/* refresh our copy of the node record from the primary */
|
/* refresh our copy of the node record from the primary */
|
||||||
record_status = get_node_record(new_primary_conn, config_file_options.node_id, &local_node_info);
|
record_status = get_node_record(new_primary_conn, config_file_options.node_id, &local_node_info);
|
||||||
|
|
||||||
/* this is unlikley to happen */
|
/* this is unlikely to happen */
|
||||||
if (record_status != RECORD_FOUND)
|
if (record_status != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_warning(_("unable to retrieve local node record from primary node %i"), primary_node_id);
|
log_warning(_("unable to retrieve local node record from primary node %i"), primary_node_id);
|
||||||
@@ -1111,7 +1111,7 @@ execute_child_nodes_disconnect_command(NodeInfoList *db_child_node_records, t_ch
|
|||||||
/* calculate number of connected child nodes */
|
/* calculate number of connected child nodes */
|
||||||
for (cell = db_child_node_records->head; cell; cell = cell->next)
|
for (cell = db_child_node_records->head; cell; cell = cell->next)
|
||||||
{
|
{
|
||||||
/* exclude witness server from total, if necessay */
|
/* exclude witness server from total, if necessary */
|
||||||
if (config_file_options.child_nodes_connected_include_witness == false &&
|
if (config_file_options.child_nodes_connected_include_witness == false &&
|
||||||
cell->node_info->type == WITNESS)
|
cell->node_info->type == WITNESS)
|
||||||
continue;
|
continue;
|
||||||
@@ -1149,7 +1149,7 @@ execute_child_nodes_disconnect_command(NodeInfoList *db_child_node_records, t_ch
|
|||||||
instr_time current_time = current_time_base;
|
instr_time current_time = current_time_base;
|
||||||
int seconds_since_detached;
|
int seconds_since_detached;
|
||||||
|
|
||||||
/* exclude witness server from calculatin if neccessary */
|
/* exclude witness server from calculation, if requested */
|
||||||
if (config_file_options.child_nodes_connected_include_witness == false &&
|
if (config_file_options.child_nodes_connected_include_witness == false &&
|
||||||
child_node_rec->type == WITNESS)
|
child_node_rec->type == WITNESS)
|
||||||
continue;
|
continue;
|
||||||
@@ -3254,7 +3254,7 @@ update_monitoring_history(void)
|
|||||||
*
|
*
|
||||||
* Attach cascaded standby to another node, currently the primary.
|
* Attach cascaded standby to another node, currently the primary.
|
||||||
*
|
*
|
||||||
* Note that in contrast to a primary failover, where one of the downstrean
|
* Note that in contrast to a primary failover, where one of the downstream
|
||||||
* standby nodes will become a primary, a cascaded standby failover (where the
|
* standby nodes will become a primary, a cascaded standby failover (where the
|
||||||
* upstream standby has gone away) is "just" a case of attaching the standby to
|
* upstream standby has gone away) is "just" a case of attaching the standby to
|
||||||
* another node.
|
* another node.
|
||||||
@@ -3921,6 +3921,7 @@ follow_new_primary(int new_primary_id)
|
|||||||
|
|
||||||
termPQExpBuffer(&event_details);
|
termPQExpBuffer(&event_details);
|
||||||
|
|
||||||
|
close_connection(&upstream_conn);
|
||||||
close_connection(&old_primary_conn);
|
close_connection(&old_primary_conn);
|
||||||
|
|
||||||
return FAILOVER_STATE_PRIMARY_REAPPEARED;
|
return FAILOVER_STATE_PRIMARY_REAPPEARED;
|
||||||
@@ -3931,6 +3932,8 @@ follow_new_primary(int new_primary_id)
|
|||||||
close_connection(&old_primary_conn);
|
close_connection(&old_primary_conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
close_connection(&upstream_conn);
|
||||||
|
|
||||||
return FAILOVER_STATE_FOLLOW_FAIL;
|
return FAILOVER_STATE_FOLLOW_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5381,7 +5384,7 @@ try_primary_reconnect(PGconn **conn, PGconn *local_conn, t_node_info *node_info)
|
|||||||
time_t started_at = time(NULL);
|
time_t started_at = time(NULL);
|
||||||
int up_to;
|
int up_to;
|
||||||
bool sleep_now = false;
|
bool sleep_now = false;
|
||||||
bool max_sleep_seconds;
|
int max_sleep_seconds;
|
||||||
|
|
||||||
log_info(_("checking state of node \"%s\" (ID: %i), %i of %i attempts"),
|
log_info(_("checking state of node \"%s\" (ID: %i), %i of %i attempts"),
|
||||||
node_info->node_name,
|
node_info->node_name,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgrd-physical.h
|
* repmgrd-physical.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
10
repmgrd.c
10
repmgrd.c
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* repmgrd.c - Replication manager daemon
|
* repmgrd.c - Replication manager daemon
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -131,7 +131,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
memset(pid_file, 0, MAXPGPATH);
|
memset(pid_file, 0, MAXPGPATH);
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, "?Vf:L:vdp:m", long_options, &optindex)) != -1)
|
while ((c = getopt_long(argc, argv, "?Vf:L:vdp:sm", long_options, &optindex)) != -1)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
@@ -249,7 +249,7 @@ main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Parse the configuration file, if provided (if no configuration file was
|
* Parse the configuration file, if provided (if no configuration file was
|
||||||
* provided, an attempt will be made to find one in one of the default
|
* provided, an attempt will be made to find one in one of the default
|
||||||
* locations). If no conifguration file is available, or it can't be parsed
|
* locations). If no configuration file is available, or it can't be parsed
|
||||||
* parse_config() will abort anyway, with an appropriate message.
|
* parse_config() will abort anyway, with an appropriate message.
|
||||||
*/
|
*/
|
||||||
load_config(config_file, verbose, false, argv[0]);
|
load_config(config_file, verbose, false, argv[0]);
|
||||||
@@ -307,7 +307,7 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Some configuration file items can be overriden by command line options */
|
/* Some configuration file items can be overridden by command line options */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command-line parameter -L/--log-level overrides any setting in config
|
* Command-line parameter -L/--log-level overrides any setting in config
|
||||||
@@ -416,7 +416,7 @@ main(int argc, char **argv)
|
|||||||
log_detail(_("\"repmgr\" version %s is installed but extension is version %s"),
|
log_detail(_("\"repmgr\" version %s is installed but extension is version %s"),
|
||||||
REPMGR_VERSION,
|
REPMGR_VERSION,
|
||||||
extversions.installed_version);
|
extversions.installed_version);
|
||||||
log_hint(_("update the installed extension version by executing \"ALTER EXTENSION repmgr UPDATE\""));
|
log_hint(_("update the installed extension version by executing \"ALTER EXTENSION repmgr UPDATE\" in the repmgr database"));
|
||||||
|
|
||||||
close_connection(&local_conn);
|
close_connection(&local_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* repmgrd.h
|
* repmgrd.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* strutil.c
|
* strutil.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* strutil.h
|
* strutil.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
27
sysutils.c
27
sysutils.c
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Functions which need to be executed on the local system.
|
* Functions which need to be executed on the local system.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -289,10 +289,19 @@ disable_wal_receiver(PGconn *conn)
|
|||||||
|
|
||||||
if (wal_retrieve_retry_interval < WALRECEIVER_DISABLE_TIMEOUT_VALUE)
|
if (wal_retrieve_retry_interval < WALRECEIVER_DISABLE_TIMEOUT_VALUE)
|
||||||
{
|
{
|
||||||
|
bool success;
|
||||||
|
|
||||||
log_notice(_("setting \"wal_retrieve_retry_interval\" to %i milliseconds"),
|
log_notice(_("setting \"wal_retrieve_retry_interval\" to %i milliseconds"),
|
||||||
new_wal_retrieve_retry_interval);
|
new_wal_retrieve_retry_interval);
|
||||||
alter_system_int(conn, "wal_retrieve_retry_interval", new_wal_retrieve_retry_interval);
|
alter_system_int(conn, "wal_retrieve_retry_interval", new_wal_retrieve_retry_interval);
|
||||||
pg_reload_conf(conn);
|
|
||||||
|
success = pg_reload_conf(conn);
|
||||||
|
|
||||||
|
if (success == false)
|
||||||
|
{
|
||||||
|
log_warning(_("unable to reload configuration"));
|
||||||
|
return UNKNOWN_PID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -354,6 +363,12 @@ enable_wal_receiver(PGconn *conn, bool wait_startup)
|
|||||||
/* make timeout configurable */
|
/* make timeout configurable */
|
||||||
int i, timeout = 30;
|
int i, timeout = 30;
|
||||||
|
|
||||||
|
if (PQstatus(conn) != CONNECTION_OK)
|
||||||
|
{
|
||||||
|
log_error(_("database connection not available"));
|
||||||
|
return UNKNOWN_PID;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_superuser_connection(conn, NULL) == false)
|
if (is_superuser_connection(conn, NULL) == false)
|
||||||
{
|
{
|
||||||
log_error(_("superuser connection required"));
|
log_error(_("superuser connection required"));
|
||||||
@@ -394,7 +409,13 @@ enable_wal_receiver(PGconn *conn, bool wait_startup)
|
|||||||
return UNKNOWN_PID;
|
return UNKNOWN_PID;
|
||||||
}
|
}
|
||||||
|
|
||||||
pg_reload_conf(conn);
|
success = pg_reload_conf(conn);
|
||||||
|
|
||||||
|
if (success == false)
|
||||||
|
{
|
||||||
|
log_warning(_("unable to reload configuration"));
|
||||||
|
return UNKNOWN_PID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* sysutils.h
|
* sysutils.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
2
voting.h
2
voting.h
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* voting.h
|
* voting.h
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2020
|
* Copyright (c) EnterpriseDB Corporation, 2010-2021
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
Reference in New Issue
Block a user