Commit 2dedf4d9 authored by Peter Eisentraut's avatar Peter Eisentraut

Integrate recovery.conf into postgresql.conf

recovery.conf settings are now set in postgresql.conf (or other GUC
sources).  Currently, all the affected settings are PGC_POSTMASTER;
this could be refined in the future case by case.

Recovery is now initiated by a file recovery.signal.  Standby mode is
initiated by a file standby.signal.  The standby_mode setting is
gone.  If a recovery.conf file is found, an error is issued.

The trigger_file setting has been renamed to promote_trigger_file as
part of the move.

The documentation chapter "Recovery Configuration" has been integrated
into "Server Configuration".

pg_basebackup -R now appends settings to postgresql.auto.conf and
creates a standby.signal file.

Author: Fujii Masao <masao.fujii@gmail.com>
Author: Simon Riggs <simon@2ndquadrant.com>
Author: Abhijit Menon-Sen <ams@2ndquadrant.com>
Author: Sergei Kornilov <sk@zsrv.org>
Discussion: https://www.postgresql.org/message-id/flat/607741529606767@web3g.yandex.ru/
parent ab69ea9f
...@@ -611,7 +611,7 @@ usage(void) ...@@ -611,7 +611,7 @@ usage(void)
printf(" -w MAXWAITTIME max seconds to wait for a file (0=no limit) (default=0)\n"); printf(" -w MAXWAITTIME max seconds to wait for a file (0=no limit) (default=0)\n");
printf(" -?, --help show this help, then exit\n"); printf(" -?, --help show this help, then exit\n");
printf("\n" printf("\n"
"Main intended use as restore_command in recovery.conf:\n" "Main intended use as restore_command in postgresql.conf:\n"
" restore_command = 'pg_standby [OPTION]... ARCHIVELOCATION %%f %%p %%r'\n" " restore_command = 'pg_standby [OPTION]... ARCHIVELOCATION %%f %%p %%r'\n"
"e.g.\n" "e.g.\n"
" restore_command = 'pg_standby /mnt/server/archiverdir %%f %%p %%r'\n"); " restore_command = 'pg_standby /mnt/server/archiverdir %%f %%p %%r'\n");
......
...@@ -1220,8 +1220,11 @@ SELECT pg_stop_backup(); ...@@ -1220,8 +1220,11 @@ SELECT pg_stop_backup();
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
Create a recovery command file <filename>recovery.conf</filename> in the cluster Set recovery configuration settings in
data directory (see <xref linkend="recovery-config"/>). You might <filename>postgresql.conf</filename> (see <xref
linkend="runtime-config-wal-archive-recovery"/>) and create a file
<filename>recovery.signal</filename> in the cluster
data directory. You might
also want to temporarily modify <filename>pg_hba.conf</filename> to prevent also want to temporarily modify <filename>pg_hba.conf</filename> to prevent
ordinary users from connecting until you are sure the recovery was successful. ordinary users from connecting until you are sure the recovery was successful.
</para> </para>
...@@ -1232,8 +1235,8 @@ SELECT pg_stop_backup(); ...@@ -1232,8 +1235,8 @@ SELECT pg_stop_backup();
proceed to read through the archived WAL files it needs. Should the proceed to read through the archived WAL files it needs. Should the
recovery be terminated because of an external error, the server can recovery be terminated because of an external error, the server can
simply be restarted and it will continue recovery. Upon completion simply be restarted and it will continue recovery. Upon completion
of the recovery process, the server will rename of the recovery process, the server will remove
<filename>recovery.conf</filename> to <filename>recovery.done</filename> (to prevent <filename>recovery.signal</filename> (to prevent
accidentally re-entering recovery mode later) and then accidentally re-entering recovery mode later) and then
commence normal database operations. commence normal database operations.
</para> </para>
...@@ -1249,12 +1252,9 @@ SELECT pg_stop_backup(); ...@@ -1249,12 +1252,9 @@ SELECT pg_stop_backup();
</para> </para>
<para> <para>
The key part of all this is to set up a recovery configuration file that The key part of all this is to set up a recovery configuration that
describes how you want to recover and how far the recovery should describes how you want to recover and how far the recovery should
run. You can use <filename>recovery.conf.sample</filename> (normally run. The one thing that you absolutely must specify is the <varname>restore_command</varname>,
located in the installation's <filename>share/</filename> directory) as a
prototype. The one thing that you absolutely must specify in
<filename>recovery.conf</filename> is the <varname>restore_command</varname>,
which tells <productname>PostgreSQL</productname> how to retrieve archived which tells <productname>PostgreSQL</productname> how to retrieve archived
WAL file segments. Like the <varname>archive_command</varname>, this is WAL file segments. Like the <varname>archive_command</varname>, this is
a shell command string. It can contain <literal>%f</literal>, which is a shell command string. It can contain <literal>%f</literal>, which is
...@@ -1316,7 +1316,7 @@ restore_command = 'cp /mnt/server/archivedir/%f %p' ...@@ -1316,7 +1316,7 @@ restore_command = 'cp /mnt/server/archivedir/%f %p'
<para> <para>
If you want to recover to some previous point in time (say, right before If you want to recover to some previous point in time (say, right before
the junior DBA dropped your main transaction table), just specify the the junior DBA dropped your main transaction table), just specify the
required <link linkend="recovery-target-settings">stopping point</link> in <filename>recovery.conf</filename>. You can specify required <link linkend="runtime-config-wal-recovery-target">stopping point</link>. You can specify
the stop point, known as the <quote>recovery target</quote>, either by the stop point, known as the <quote>recovery target</quote>, either by
date/time, named restore point or by completion of a specific transaction date/time, named restore point or by completion of a specific transaction
ID. As of this writing only the date/time and named restore point options ID. As of this writing only the date/time and named restore point options
...@@ -1414,7 +1414,7 @@ restore_command = 'cp /mnt/server/archivedir/%f %p' ...@@ -1414,7 +1414,7 @@ restore_command = 'cp /mnt/server/archivedir/%f %p'
that was current when the base backup was taken. If you wish to recover that was current when the base backup was taken. If you wish to recover
into some child timeline (that is, you want to return to some state that into some child timeline (that is, you want to return to some state that
was itself generated after a recovery attempt), you need to specify the was itself generated after a recovery attempt), you need to specify the
target timeline ID in <filename>recovery.conf</filename>. You cannot recover into target timeline ID in <xref linkend="guc-recovery-target-timeline"/>. You cannot recover into
timelines that branched off earlier than the base backup. timelines that branched off earlier than the base backup.
</para> </para>
</sect2> </sect2>
......
This diff is collapsed.
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
<!ENTITY manage-ag SYSTEM "manage-ag.sgml"> <!ENTITY manage-ag SYSTEM "manage-ag.sgml">
<!ENTITY monitoring SYSTEM "monitoring.sgml"> <!ENTITY monitoring SYSTEM "monitoring.sgml">
<!ENTITY regress SYSTEM "regress.sgml"> <!ENTITY regress SYSTEM "regress.sgml">
<!ENTITY recovery-config SYSTEM "recovery-config.sgml">
<!ENTITY runtime SYSTEM "runtime.sgml"> <!ENTITY runtime SYSTEM "runtime.sgml">
<!ENTITY config SYSTEM "config.sgml"> <!ENTITY config SYSTEM "config.sgml">
<!ENTITY user-manag SYSTEM "user-manag.sgml"> <!ENTITY user-manag SYSTEM "user-manag.sgml">
......
...@@ -19094,7 +19094,7 @@ postgres=# select pg_start_backup('label_goes_here'); ...@@ -19094,7 +19094,7 @@ postgres=# select pg_start_backup('label_goes_here');
<function>pg_create_restore_point</function> creates a named write-ahead log <function>pg_create_restore_point</function> creates a named write-ahead log
record that can be used as recovery target, and returns the corresponding record that can be used as recovery target, and returns the corresponding
write-ahead log location. The given name can then be used with write-ahead log location. The given name can then be used with
<xref linkend="recovery-target-name"/> to specify the point up to which <xref linkend="guc-recovery-target-name"/> to specify the point up to which
recovery will proceed. Avoid creating multiple restore points with the recovery will proceed. Avoid creating multiple restore points with the
same name, since recovery will stop at the first one whose name matches same name, since recovery will stop at the first one whose name matches
the recovery target. the recovery target.
......
...@@ -618,7 +618,7 @@ protocol to make nodes agree on a serializable transactional order. ...@@ -618,7 +618,7 @@ protocol to make nodes agree on a serializable transactional order.
<para> <para>
In standby mode, the server continuously applies WAL received from the In standby mode, the server continuously applies WAL received from the
master server. The standby server can read WAL from a WAL archive master server. The standby server can read WAL from a WAL archive
(see <xref linkend="restore-command"/>) or directly from the master (see <xref linkend="guc-restore-command"/>) or directly from the master
over a TCP connection (streaming replication). The standby server will over a TCP connection (streaming replication). The standby server will
also attempt to restore any WAL found in the standby cluster's also attempt to restore any WAL found in the standby cluster's
<filename>pg_wal</filename> directory. That typically happens after a server <filename>pg_wal</filename> directory. That typically happens after a server
...@@ -645,7 +645,7 @@ protocol to make nodes agree on a serializable transactional order. ...@@ -645,7 +645,7 @@ protocol to make nodes agree on a serializable transactional order.
<para> <para>
Standby mode is exited and the server switches to normal operation Standby mode is exited and the server switches to normal operation
when <command>pg_ctl promote</command> is run or a trigger file is found when <command>pg_ctl promote</command> is run or a trigger file is found
(<varname>trigger_file</varname>). Before failover, (<varname>promote_trigger_file</varname>). Before failover,
any WAL immediately available in the archive or in <filename>pg_wal</filename> will be any WAL immediately available in the archive or in <filename>pg_wal</filename> will be
restored, but no attempt is made to connect to the master. restored, but no attempt is made to connect to the master.
</para> </para>
...@@ -686,10 +686,9 @@ protocol to make nodes agree on a serializable transactional order. ...@@ -686,10 +686,9 @@ protocol to make nodes agree on a serializable transactional order.
<para> <para>
To set up the standby server, restore the base backup taken from primary To set up the standby server, restore the base backup taken from primary
server (see <xref linkend="backup-pitr-recovery"/>). Create a recovery server (see <xref linkend="backup-pitr-recovery"/>). Create a file
command file <filename>recovery.conf</filename> in the standby's cluster data <filename>standby.signal</filename> in the standby's cluster data
directory, and turn on <varname>standby_mode</varname>. Set directory. Set <xref linkend="guc-restore-command"/> to a simple command to copy files from
<varname>restore_command</varname> to a simple command to copy files from
the WAL archive. If you plan to have multiple standby servers for high the WAL archive. If you plan to have multiple standby servers for high
availability purposes, set <varname>recovery_target_timeline</varname> to availability purposes, set <varname>recovery_target_timeline</varname> to
<literal>latest</literal>, to make the standby server follow the timeline change <literal>latest</literal>, to make the standby server follow the timeline change
...@@ -699,7 +698,7 @@ protocol to make nodes agree on a serializable transactional order. ...@@ -699,7 +698,7 @@ protocol to make nodes agree on a serializable transactional order.
<note> <note>
<para> <para>
Do not use pg_standby or similar tools with the built-in standby mode Do not use pg_standby or similar tools with the built-in standby mode
described here. <varname>restore_command</varname> should return immediately described here. <xref linkend="guc-restore-command"/> should return immediately
if the file does not exist; the server will retry the command again if if the file does not exist; the server will retry the command again if
necessary. See <xref linkend="log-shipping-alternative"/> necessary. See <xref linkend="log-shipping-alternative"/>
for using tools like pg_standby. for using tools like pg_standby.
...@@ -708,11 +707,11 @@ protocol to make nodes agree on a serializable transactional order. ...@@ -708,11 +707,11 @@ protocol to make nodes agree on a serializable transactional order.
<para> <para>
If you want to use streaming replication, fill in If you want to use streaming replication, fill in
<varname>primary_conninfo</varname> with a libpq connection string, including <xref linkend="guc-primary-conninfo"/> with a libpq connection string, including
the host name (or IP address) and any additional details needed to the host name (or IP address) and any additional details needed to
connect to the primary server. If the primary needs a password for connect to the primary server. If the primary needs a password for
authentication, the password needs to be specified in authentication, the password needs to be specified in
<varname>primary_conninfo</varname> as well. <xref linkend="guc-primary-conninfo"/> as well.
</para> </para>
<para> <para>
...@@ -724,7 +723,7 @@ protocol to make nodes agree on a serializable transactional order. ...@@ -724,7 +723,7 @@ protocol to make nodes agree on a serializable transactional order.
<para> <para>
If you're using a WAL archive, its size can be minimized using the <xref If you're using a WAL archive, its size can be minimized using the <xref
linkend="archive-cleanup-command"/> parameter to remove files that are no linkend="guc-archive-cleanup-command"/> parameter to remove files that are no
longer required by the standby server. longer required by the standby server.
The <application>pg_archivecleanup</application> utility is designed specifically to The <application>pg_archivecleanup</application> utility is designed specifically to
be used with <varname>archive_cleanup_command</varname> in typical single-standby be used with <varname>archive_cleanup_command</varname> in typical single-standby
...@@ -735,9 +734,8 @@ protocol to make nodes agree on a serializable transactional order. ...@@ -735,9 +734,8 @@ protocol to make nodes agree on a serializable transactional order.
</para> </para>
<para> <para>
A simple example of a <filename>recovery.conf</filename> is: A simple example of configuration is:
<programlisting> <programlisting>
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass options=''-c wal_sender_timeout=5000''' primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass options=''-c wal_sender_timeout=5000'''
restore_command = 'cp /path/to/archive/%f %p' restore_command = 'cp /path/to/archive/%f %p'
archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r' archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r'
...@@ -793,8 +791,8 @@ archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r' ...@@ -793,8 +791,8 @@ archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r'
To use streaming replication, set up a file-based log-shipping standby To use streaming replication, set up a file-based log-shipping standby
server as described in <xref linkend="warm-standby"/>. The step that server as described in <xref linkend="warm-standby"/>. The step that
turns a file-based log-shipping standby into streaming replication turns a file-based log-shipping standby into streaming replication
standby is setting <varname>primary_conninfo</varname> setting in the standby is setting the <varname>primary_conninfo</varname> setting
<filename>recovery.conf</filename> file to point to the primary server. Set to point to the primary server. Set
<xref linkend="guc-listen-addresses"/> and authentication options <xref linkend="guc-listen-addresses"/> and authentication options
(see <filename>pg_hba.conf</filename>) on the primary so that the standby server (see <filename>pg_hba.conf</filename>) on the primary so that the standby server
can connect to the <literal>replication</literal> pseudo-database on the primary can connect to the <literal>replication</literal> pseudo-database on the primary
...@@ -854,14 +852,14 @@ host replication foo 192.168.1.100/32 md5 ...@@ -854,14 +852,14 @@ host replication foo 192.168.1.100/32 md5
</para> </para>
<para> <para>
The host name and port number of the primary, connection user name, The host name and port number of the primary, connection user name,
and password are specified in the <filename>recovery.conf</filename> file. and password are specified in the <xref linkend="guc-primary-conninfo"/>.
The password can also be set in the <filename>~/.pgpass</filename> file on the The password can also be set in the <filename>~/.pgpass</filename> file on the
standby (specify <literal>replication</literal> in the <replaceable>database</replaceable> standby (specify <literal>replication</literal> in the <replaceable>database</replaceable>
field). field).
For example, if the primary is running on host IP <literal>192.168.1.50</literal>, For example, if the primary is running on host IP <literal>192.168.1.50</literal>,
port <literal>5432</literal>, the account name for replication is port <literal>5432</literal>, the account name for replication is
<literal>foo</literal>, and the password is <literal>foopass</literal>, the administrator <literal>foo</literal>, and the password is <literal>foopass</literal>, the administrator
can add the following line to the <filename>recovery.conf</filename> file on the can add the following line to the <filename>postgresql.conf</filename> file on the
standby: standby:
<programlisting> <programlisting>
...@@ -973,10 +971,8 @@ postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots; ...@@ -973,10 +971,8 @@ postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots;
(1 row) (1 row)
</programlisting> </programlisting>
To configure the standby to use this slot, <varname>primary_slot_name</varname> To configure the standby to use this slot, <varname>primary_slot_name</varname>
should be configured in the standby's <filename>recovery.conf</filename>. should be configured on the standby. Here is a simple example:
Here is a simple example:
<programlisting> <programlisting>
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'
primary_slot_name = 'node_a_slot' primary_slot_name = 'node_a_slot'
</programlisting> </programlisting>
...@@ -1474,11 +1470,10 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' ...@@ -1474,11 +1470,10 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
To trigger failover of a log-shipping standby server, run To trigger failover of a log-shipping standby server, run
<command>pg_ctl promote</command>, call <function>pg_promote</function>, <command>pg_ctl promote</command>, call <function>pg_promote</function>,
or create a trigger file with the file name and path specified by the or create a trigger file with the file name and path specified by the
<varname>trigger_file</varname> setting in <varname>promote_trigger_file</varname>. If you're planning to use
<filename>recovery.conf</filename>. If you're planning to use
<command>pg_ctl promote</command> or to call <command>pg_ctl promote</command> or to call
<function>pg_promote</function> to fail over, <function>pg_promote</function> to fail over,
<varname>trigger_file</varname> is not required. If you're <varname>promote_trigger_file</varname> is not required. If you're
setting up the reporting servers that are only used to offload read-only setting up the reporting servers that are only used to offload read-only
queries from the primary, not for high availability purposes, you don't queries from the primary, not for high availability purposes, you don't
need to promote it. need to promote it.
...@@ -1491,11 +1486,8 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' ...@@ -1491,11 +1486,8 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
<para> <para>
An alternative to the built-in standby mode described in the previous An alternative to the built-in standby mode described in the previous
sections is to use a <varname>restore_command</varname> that polls the archive location. sections is to use a <varname>restore_command</varname> that polls the archive location.
This was the only option available in versions 8.4 and below. In this This was the only option available in versions 8.4 and below. See the
setup, set <varname>standby_mode</varname> off, because you are implementing <xref linkend="pgstandby"/> module for a reference implementation of this.
the polling required for standby operation yourself. See the
<xref linkend="pgstandby"/> module for a reference
implementation of this.
</para> </para>
<para> <para>
...@@ -1522,8 +1514,7 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' ...@@ -1522,8 +1514,7 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
The magic that makes the two loosely coupled servers work together is The magic that makes the two loosely coupled servers work together is
simply a <varname>restore_command</varname> used on the standby that, simply a <varname>restore_command</varname> used on the standby that,
when asked for the next WAL file, waits for it to become available from when asked for the next WAL file, waits for it to become available from
the primary. The <varname>restore_command</varname> is specified in the the primary. Normal recovery
<filename>recovery.conf</filename> file on the standby server. Normal recovery
processing would request a file from the WAL archive, reporting failure processing would request a file from the WAL archive, reporting failure
if the file was unavailable. For standby processing it is normal for if the file was unavailable. For standby processing it is normal for
the next WAL file to be unavailable, so the standby must wait for the next WAL file to be unavailable, so the standby must wait for
...@@ -1611,9 +1602,8 @@ if (!triggered) ...@@ -1611,9 +1602,8 @@ if (!triggered)
<listitem> <listitem>
<para> <para>
Begin recovery on the standby server from the local WAL Begin recovery on the standby server from the local WAL
archive, using a <filename>recovery.conf</filename> that specifies a archive, using <varname>restore_command</varname> that waits
<varname>restore_command</varname> that waits as described as described previously (see <xref linkend="backup-pitr-recovery"/>).
previously (see <xref linkend="backup-pitr-recovery"/>).
</para> </para>
</listitem> </listitem>
</orderedlist> </orderedlist>
...@@ -2108,7 +2098,7 @@ if (!triggered) ...@@ -2108,7 +2098,7 @@ if (!triggered)
<para> <para>
If <varname>hot_standby</varname> is <literal>on</literal> in <filename>postgresql.conf</filename> If <varname>hot_standby</varname> is <literal>on</literal> in <filename>postgresql.conf</filename>
(the default value) and there is a <filename>recovery.conf</filename> (the default value) and there is a <filename>standby.signal</filename>
file present, the server will run in Hot Standby mode. file present, the server will run in Hot Standby mode.
However, it may take some time for Hot Standby connections to be allowed, However, it may take some time for Hot Standby connections to be allowed,
because the server will not accept connections until it has completed because the server will not accept connections until it has completed
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
<para> <para>
To configure a standby To configure a standby
server to use <application>pg_standby</application>, put this into its server to use <application>pg_standby</application>, put this into its
<filename>recovery.conf</filename> configuration file: <filename>postgresql.conf</filename> configuration file:
<programlisting> <programlisting>
restore_command = 'pg_standby <replaceable>archiveDir</replaceable> %f %p %r' restore_command = 'pg_standby <replaceable>archiveDir</replaceable> %f %p %r'
</programlisting> </programlisting>
......
...@@ -158,7 +158,6 @@ ...@@ -158,7 +158,6 @@
&maintenance; &maintenance;
&backup; &backup;
&high-availability; &high-availability;
&recovery-config;
&monitoring; &monitoring;
&diskusage; &diskusage;
&wal; &wal;
......
This diff is collapsed.
...@@ -214,10 +214,11 @@ PostgreSQL documentation ...@@ -214,10 +214,11 @@ PostgreSQL documentation
<listitem> <listitem>
<para> <para>
Write a minimal <filename>recovery.conf</filename> in the output Create <filename>standby.signal</filename> and append connection settings
to <filename>postgresql.auto.conf</filename> in the output
directory (or into the base archive file when using tar format) to directory (or into the base archive file when using tar format) to
ease setting up a standby server. ease setting up a standby server.
The <filename>recovery.conf</filename> file will record the connection The <filename>postgresql.auto.conf</filename> file will record the connection
settings and, if specified, the replication slot settings and, if specified, the replication slot
that <application>pg_basebackup</application> is using, so that the that <application>pg_basebackup</application> is using, so that the
streaming replication will use the same settings later on. streaming replication will use the same settings later on.
...@@ -470,7 +471,7 @@ PostgreSQL documentation ...@@ -470,7 +471,7 @@ PostgreSQL documentation
replication slot. If the base backup is intended to be used as a replication slot. If the base backup is intended to be used as a
streaming replication standby using replication slots, it should then streaming replication standby using replication slots, it should then
use the same replication slot name use the same replication slot name
in <filename>recovery.conf</filename>. That way, it is ensured that in <xref linkend="guc-primary-slot-name"/>. That way, it is ensured that
the server does not remove any necessary WAL data in the time between the server does not remove any necessary WAL data in the time between
the end of the base backup and the start of streaming replication. the end of the base backup and the start of streaming replication.
</para> </para>
......
...@@ -69,7 +69,8 @@ PostgreSQL documentation ...@@ -69,7 +69,8 @@ PostgreSQL documentation
target cluster ran for a long time after the divergence, the old WAL target cluster ran for a long time after the divergence, the old WAL
files might no longer be present. In that case, they can be manually files might no longer be present. In that case, they can be manually
copied from the WAL archive to the <filename>pg_wal</filename> directory, or copied from the WAL archive to the <filename>pg_wal</filename> directory, or
fetched on startup by configuring <filename>recovery.conf</filename>. The use of fetched on startup by configuring <xref linkend="guc-primary-conninfo"/> or
<xref linkend="guc-restore-command"/>. The use of
<application>pg_rewind</application> is not limited to failover, e.g. a standby <application>pg_rewind</application> is not limited to failover, e.g. a standby
server can be promoted, run some write transactions, and then rewinded server can be promoted, run some write transactions, and then rewinded
to become a standby again. to become a standby again.
...@@ -83,8 +84,9 @@ PostgreSQL documentation ...@@ -83,8 +84,9 @@ PostgreSQL documentation
<application>pg_rewind</application> was run, and therefore could not be copied by the <application>pg_rewind</application> was run, and therefore could not be copied by the
<application>pg_rewind</application> session, it must be made available when the <application>pg_rewind</application> session, it must be made available when the
target server is started. This can be done by creating a target server is started. This can be done by creating a
<filename>recovery.conf</filename> file in the target data directory with a <filename>recovery.signal</filename> file in the target data directory
suitable <varname>restore_command</varname>. and configuring suitable <xref linkend="guc-restore-command"/>
in <filename>postgresql.conf</filename>.
</para> </para>
<para> <para>
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
<para> <para>
To configure a standby To configure a standby
server to use <application>pg_archivecleanup</application>, put this into its server to use <application>pg_archivecleanup</application>, put this into its
<filename>recovery.conf</filename> configuration file: <filename>postgresql.conf</filename> configuration file:
<programlisting> <programlisting>
archive_cleanup_command = 'pg_archivecleanup <replaceable>archivelocation</replaceable> %r' archive_cleanup_command = 'pg_archivecleanup <replaceable>archivelocation</replaceable> %r'
</programlisting> </programlisting>
...@@ -47,7 +47,7 @@ archive_cleanup_command = 'pg_archivecleanup <replaceable>archivelocation</repla ...@@ -47,7 +47,7 @@ archive_cleanup_command = 'pg_archivecleanup <replaceable>archivelocation</repla
files should be removed. files should be removed.
</para> </para>
<para> <para>
When used within <xref linkend="archive-cleanup-command"/>, all WAL files When used within <xref linkend="guc-archive-cleanup-command"/>, all WAL files
logically preceding the value of the <literal>%r</literal> argument will be removed logically preceding the value of the <literal>%r</literal> argument will be removed
from <replaceable>archivelocation</replaceable>. This minimizes the number of files from <replaceable>archivelocation</replaceable>. This minimizes the number of files
that need to be retained, while preserving crash-restart capability. Use of that need to be retained, while preserving crash-restart capability. Use of
......
...@@ -506,7 +506,7 @@ pg_upgrade.exe ...@@ -506,7 +506,7 @@ pg_upgrade.exe
<para> <para>
Save any configuration files from the old standbys' configuration Save any configuration files from the old standbys' configuration
directories you need to keep, e.g. <filename>postgresql.conf</filename>, directories you need to keep, e.g. <filename>postgresql.conf</filename>,
<literal>recovery.conf</literal>, because these will be overwritten or <literal>pg_hba.conf</literal>, because these will be overwritten or
removed in the next step. removed in the next step.
</para> </para>
</step> </step>
......
...@@ -7303,7 +7303,7 @@ This was disabled in the PG 9.6 branch so there is no commit here. ...@@ -7303,7 +7303,7 @@ This was disabled in the PG 9.6 branch so there is no commit here.
<para> <para>
Allow specification of the recovery stopping point by Log Sequence Allow specification of the recovery stopping point by Log Sequence
Number (<acronym>LSN</acronym>) in Number (<acronym>LSN</acronym>) in
<link linkend="recovery-config"><filename>recovery.conf</filename></link> <filename>recovery.conf</filename>
(Michael Paquier) (Michael Paquier)
</para> </para>
......
...@@ -9811,7 +9811,7 @@ Branch: REL9_0_STABLE [9d6af7367] 2015-08-15 11:02:34 -0400 ...@@ -9811,7 +9811,7 @@ Branch: REL9_0_STABLE [9d6af7367] 2015-08-15 11:02:34 -0400
<para> <para>
These named restore points can be specified as recovery These named restore points can be specified as recovery
targets using the new <filename>recovery.conf</filename> setting targets using the new <filename>recovery.conf</filename> setting
<link linkend="recovery-target-name"><varname>recovery_target_name</varname></link>. <varname>recovery_target_name</varname>.
</para> </para>
</listitem> </listitem>
...@@ -9843,8 +9843,7 @@ Branch: REL9_0_STABLE [9d6af7367] 2015-08-15 11:02:34 -0400 ...@@ -9843,8 +9843,7 @@ Branch: REL9_0_STABLE [9d6af7367] 2015-08-15 11:02:34 -0400
<listitem> <listitem>
<para> <para>
Allow <link Allow <filename>recovery.conf</filename>
linkend="recovery-config"><filename>recovery.conf</filename></link>
to use the same quoting behavior as <filename>postgresql.conf</filename> to use the same quoting behavior as <filename>postgresql.conf</filename>
(Dimitri Fontaine) (Dimitri Fontaine)
</para> </para>
......
...@@ -5350,7 +5350,7 @@ Branch: REL9_1_STABLE [de887cc8a] 2016-05-25 19:39:49 -0400 ...@@ -5350,7 +5350,7 @@ Branch: REL9_1_STABLE [de887cc8a] 2016-05-25 19:39:49 -0400
<listitem> <listitem>
<para> <para>
Ignore <xref linkend="recovery-min-apply-delay"/> parameter until Ignore <varname>recovery_min_apply_delay</varname> parameter until
recovery has reached a consistent state (Michael Paquier) recovery has reached a consistent state (Michael Paquier)
</para> </para>
...@@ -10869,8 +10869,8 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500 ...@@ -10869,8 +10869,8 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500
<listitem> <listitem>
<para> <para>
Use the last specified <link linkend="recovery-target-settings">recovery Use the last specified recovery
target parameter</link> if multiple target parameters are specified target parameter if multiple target parameters are specified
(Heikki Linnakangas) (Heikki Linnakangas)
</para> </para>
...@@ -10889,7 +10889,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500 ...@@ -10889,7 +10889,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500
<para> <para>
User commands that did their own quote preservation might need User commands that did their own quote preservation might need
adjustment. This is likely to be an issue for commands used in adjustment. This is likely to be an issue for commands used in
<xref linkend="guc-archive-command"/>, <xref linkend="restore-command"/>, <xref linkend="guc-archive-command"/>, <xref linkend="guc-restore-command"/>,
and <link linkend="sql-copy"><command>COPY TO/FROM PROGRAM</command></link>. and <link linkend="sql-copy"><command>COPY TO/FROM PROGRAM</command></link>.
</para> </para>
</listitem> </listitem>
...@@ -11510,7 +11510,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500 ...@@ -11510,7 +11510,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500
<listitem> <listitem>
<para> <para>
Add recovery parameter <xref linkend="recovery-min-apply-delay"/> Add recovery parameter <varname>recovery_min_apply_delay</varname>
to delay replication (Robert Haas, Fabr&iacute;zio de Royes Mello, to delay replication (Robert Haas, Fabr&iacute;zio de Royes Mello,
Simon Riggs) Simon Riggs)
</para> </para>
...@@ -11523,7 +11523,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500 ...@@ -11523,7 +11523,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500
<listitem> <listitem>
<para> <para>
Add <xref linkend="recovery-target"/> Add <varname>recovery_target</varname>
option <option>immediate</option> to stop <link option <option>immediate</option> to stop <link
linkend="wal"><acronym>WAL</acronym></link> recovery as soon as a linkend="wal"><acronym>WAL</acronym></link> recovery as soon as a
consistent state is reached (MauMau, Heikki Linnakangas) consistent state is reached (MauMau, Heikki Linnakangas)
...@@ -11559,8 +11559,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500 ...@@ -11559,8 +11559,7 @@ Branch: REL9_4_STABLE [c2b06ab17] 2015-01-30 22:45:58 -0500
<listitem> <listitem>
<para> <para>
Report failure return codes from <link Report failure return codes from external recovery commands
linkend="archive-recovery-settings">external recovery commands</link>
(Peter Eisentraut) (Peter Eisentraut)
</para> </para>
</listitem> </listitem>
......
...@@ -7305,7 +7305,7 @@ Branch: REL9_4_STABLE [a9613ee69] 2016-03-06 02:43:26 +0900 ...@@ -7305,7 +7305,7 @@ Branch: REL9_4_STABLE [a9613ee69] 2016-03-06 02:43:26 +0900
<listitem> <listitem>
<para> <para>
Ignore <xref linkend="recovery-min-apply-delay"/> parameter until Ignore <varname>recovery_min_apply_delay</varname> parameter until
recovery has reached a consistent state (Michael Paquier) recovery has reached a consistent state (Michael Paquier)
</para> </para>
...@@ -9096,9 +9096,8 @@ Add GUC and storage parameter to set the maximum size of GIN pending list. ...@@ -9096,9 +9096,8 @@ Add GUC and storage parameter to set the maximum size of GIN pending list.
2015-03-15 [51c11a7] Andres..: Remove pause_at_recovery_target recovery.conf s.. 2015-03-15 [51c11a7] Andres..: Remove pause_at_recovery_target recovery.conf s..
--> -->
<para> <para>
Add <link linkend="recovery-config"><filename>recovery.conf</filename></link> Add <filename>recovery.conf</filename>
parameter <link parameter <varname>recovery_target_action</varname>
linkend="recovery-target-action"><varname>recovery_target_action</varname></link>
to control post-recovery activity (Petr Jel&iacute;nek) to control post-recovery activity (Petr Jel&iacute;nek)
</para> </para>
...@@ -9199,8 +9198,8 @@ Add GUC and storage parameter to set the maximum size of GIN pending list. ...@@ -9199,8 +9198,8 @@ Add GUC and storage parameter to set the maximum size of GIN pending list.
2014-11-25 [b3fc672] Heikki..: Allow using connection URI in primary_conninfo. 2014-11-25 [b3fc672] Heikki..: Allow using connection URI in primary_conninfo.
--> -->
<para> <para>
Allow <filename>recovery.conf</filename>'s <link Allow <filename>recovery.conf</filename>'s
linkend="primary-conninfo"><varname>primary_conninfo</varname></link> setting to <varname>primary_conninfo</varname> setting to
use connection <acronym>URI</acronym>s, e.g. <literal>postgres://</literal> use connection <acronym>URI</acronym>s, e.g. <literal>postgres://</literal>
(Alexander Shulgin) (Alexander Shulgin)
</para> </para>
......
...@@ -5,8 +5,7 @@ Typical markup: ...@@ -5,8 +5,7 @@ Typical markup:
&<> use & escapes &<> use & escapes
PostgreSQL <productname> PostgreSQL <productname>
postgresql.conf, pg_hba.conf, postgresql.conf, pg_hba.conf <filename>
recovery.conf <filename>
[A-Z][A-Z_ ]+[A-Z_] <command>, <literal>, <envar>, <acronym> [A-Z][A-Z_ ]+[A-Z_] <command>, <literal>, <envar>, <acronym>
[A-Za-z_][A-Za-z0-9_]+() <function> [A-Za-z_][A-Za-z0-9_]+() <function>
\-\-?[A-Za-z_]+[-A-Za-z_]* <option> (use backslashes to avoid SGML markup) \-\-?[A-Za-z_]+[-A-Za-z_]* <option> (use backslashes to avoid SGML markup)
......
...@@ -209,7 +209,6 @@ endif ...@@ -209,7 +209,6 @@ endif
$(INSTALL_DATA) $(srcdir)/libpq/pg_hba.conf.sample '$(DESTDIR)$(datadir)/pg_hba.conf.sample' $(INSTALL_DATA) $(srcdir)/libpq/pg_hba.conf.sample '$(DESTDIR)$(datadir)/pg_hba.conf.sample'
$(INSTALL_DATA) $(srcdir)/libpq/pg_ident.conf.sample '$(DESTDIR)$(datadir)/pg_ident.conf.sample' $(INSTALL_DATA) $(srcdir)/libpq/pg_ident.conf.sample '$(DESTDIR)$(datadir)/pg_ident.conf.sample'
$(INSTALL_DATA) $(srcdir)/utils/misc/postgresql.conf.sample '$(DESTDIR)$(datadir)/postgresql.conf.sample' $(INSTALL_DATA) $(srcdir)/utils/misc/postgresql.conf.sample '$(DESTDIR)$(datadir)/postgresql.conf.sample'
$(INSTALL_DATA) $(srcdir)/access/transam/recovery.conf.sample '$(DESTDIR)$(datadir)/recovery.conf.sample'
ifeq ($(with_llvm), yes) ifeq ($(with_llvm), yes)
install-bin: install-postgres-bitcode install-bin: install-postgres-bitcode
...@@ -274,8 +273,7 @@ endif ...@@ -274,8 +273,7 @@ endif
$(MAKE) -C utils uninstall-data $(MAKE) -C utils uninstall-data
rm -f '$(DESTDIR)$(datadir)/pg_hba.conf.sample' \ rm -f '$(DESTDIR)$(datadir)/pg_hba.conf.sample' \
'$(DESTDIR)$(datadir)/pg_ident.conf.sample' \ '$(DESTDIR)$(datadir)/pg_ident.conf.sample' \
'$(DESTDIR)$(datadir)/postgresql.conf.sample' \ '$(DESTDIR)$(datadir)/postgresql.conf.sample'
'$(DESTDIR)$(datadir)/recovery.conf.sample'
ifeq ($(with_llvm), yes) ifeq ($(with_llvm), yes)
$(call uninstall_llvm_module,postgres) $(call uninstall_llvm_module,postgres)
endif endif
......
# -------------------------------
# PostgreSQL recovery config file
# -------------------------------
#
# Edit this file to provide the parameters that PostgreSQL needs to
# perform an archive recovery of a database, or to act as a replication
# standby.
#
# If "recovery.conf" is present in the PostgreSQL data directory, it is
# read on postmaster startup. After successful recovery, it is renamed
# to "recovery.done" to ensure that we do not accidentally re-enter
# archive recovery or standby mode.
#
# This file consists of lines of the form:
#
# name = value
#
# Comments are introduced with '#'.
#
# The complete list of option names and allowed values can be found
# in the PostgreSQL documentation.
#
#---------------------------------------------------------------------------
# ARCHIVE RECOVERY PARAMETERS
#---------------------------------------------------------------------------
#
# restore_command
#
# specifies the shell command that is executed to copy log files
# back from archival storage. The command string may contain %f,
# which is replaced by the name of the desired log file, and %p,
# which is replaced by the absolute path to copy the log file to.
#
# This parameter is *required* for an archive recovery, but optional
# for streaming replication.
#
# It is important that the command return nonzero exit status on failure.
# The command *will* be asked for log files that are not present in the
# archive; it must return nonzero when so asked.
#
# NOTE that the basename of %p will be different from %f; do not
# expect them to be interchangeable.
#
#restore_command = '' # e.g. 'cp /mnt/server/archivedir/%f %p'
#
#
# archive_cleanup_command
#
# specifies an optional shell command to execute at every restartpoint.
# This can be useful for cleaning up the archive of a standby server.
#
#archive_cleanup_command = ''
#
# recovery_end_command
#
# specifies an optional shell command to execute at completion of recovery.
# This can be useful for cleaning up after the restore_command.
#
#recovery_end_command = ''
#
#---------------------------------------------------------------------------
# RECOVERY TARGET PARAMETERS
#---------------------------------------------------------------------------
#
# By default, recovery will rollforward to the end of the WAL log.
# If you want to stop rollforward at a specific point, you
# must set a recovery target.
#
# You may set a recovery target either by transactionId, by name, by
# timestamp or by WAL location (LSN). Recovery may either include or
# exclude the transaction(s) with the recovery target value (i.e.,
# stop either just after or just before the given target,
# respectively).
#
#
#recovery_target_name = '' # e.g. 'daily backup 2011-01-26'
#
#recovery_target_time = '' # e.g. '2004-07-14 22:39:00 EST'
#
#recovery_target_xid = ''
#
#recovery_target_lsn = '' # e.g. '0/70006B8'
#
#recovery_target_inclusive = true
#
#
# Alternatively, you can request stopping as soon as a consistent state
# is reached, by uncommenting this option.
#
#recovery_target = 'immediate'
#
#
# If you want to recover into a timeline other than the "main line" shown in
# pg_control, specify the timeline number here, or write 'latest' to get
# the latest branch for which there's a history file.
#
#recovery_target_timeline = 'latest'
#
#
# If recovery_target_action = 'pause', recovery will pause when the
# recovery target is reached. The pause state will continue until
# pg_wal_replay_resume() is called. This setting has no effect if
# no recovery target is set. If hot_standby is not enabled then the
# server will shutdown instead, though you may request this in
# any case by specifying 'shutdown'.
#
#recovery_target_action = 'pause'
#
#---------------------------------------------------------------------------
# STANDBY SERVER PARAMETERS
#---------------------------------------------------------------------------
#
# standby_mode
#
# When standby_mode is enabled, the PostgreSQL server will work as a
# standby. It will continuously wait for the additional XLOG records, using
# restore_command and/or primary_conninfo.
#
#standby_mode = off
#
# primary_conninfo
#
# If set, the PostgreSQL server will try to connect to the primary using this
# connection string and receive XLOG records continuously.
#
#primary_conninfo = '' # e.g. 'host=localhost port=5432'
#
# If set, the PostgreSQL server will use the specified replication slot when
# connecting to the primary via streaming replication to control resource
# removal on the upstream node. This setting has no effect if primary_conninfo
# is not set.
#
#primary_slot_name = ''
#
# By default, a standby server keeps restoring XLOG records from the
# primary indefinitely. If you want to stop the standby mode, finish recovery
# and open the system in read/write mode, specify a path to a trigger file.
# The server will poll the trigger file path periodically and start as a
# primary server when it's found.
#
#trigger_file = ''
#
# By default, a standby server restores XLOG records from the primary as
# soon as possible. If you want to explicitly delay the replay of committed
# transactions from the master, specify a minimum apply delay. For example,
# if you set this parameter to 5min, the standby will replay each transaction
# commit only when the system time on the standby is at least five minutes
# past the commit time reported by the master.
#
#recovery_min_apply_delay = 0
#
#---------------------------------------------------------------------------
# HOT STANDBY PARAMETERS
#---------------------------------------------------------------------------
#
# Hot Standby related parameters are listed in postgresql.conf
#
#---------------------------------------------------------------------------
This diff is collapsed.
...@@ -66,7 +66,7 @@ RestoreArchivedFile(char *path, const char *xlogfname, ...@@ -66,7 +66,7 @@ RestoreArchivedFile(char *path, const char *xlogfname,
TimeLineID restartTli; TimeLineID restartTli;
/* In standby mode, restore_command might not be supplied */ /* In standby mode, restore_command might not be supplied */
if (recoveryRestoreCommand == NULL) if (recoveryRestoreCommand == NULL || strcmp(recoveryRestoreCommand, "") == 0)
goto not_available; goto not_available;
/* /*
...@@ -410,7 +410,7 @@ ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOn ...@@ -410,7 +410,7 @@ ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOn
ereport((signaled && failOnSignal) ? FATAL : WARNING, ereport((signaled && failOnSignal) ? FATAL : WARNING,
/*------ /*------
translator: First %s represents a recovery.conf parameter name like translator: First %s represents a postgresql.conf parameter name like
"recovery_end_command", the 2nd is the value of that parameter, the "recovery_end_command", the 2nd is the value of that parameter, the
third an already translated error message. */ third an already translated error message. */
(errmsg("%s \"%s\": %s", commandName, (errmsg("%s \"%s\": %s", commandName,
......
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
* dependent objects can be associated with it. An extension is created by * dependent objects can be associated with it. An extension is created by
* populating the pg_extension catalog from a "control" file. * populating the pg_extension catalog from a "control" file.
* The extension control file is parsed with the same parser we use for * The extension control file is parsed with the same parser we use for
* postgresql.conf and recovery.conf. An extension also has an installation * postgresql.conf. An extension also has an installation script file,
* script file, containing SQL commands to create the extension's objects. * containing SQL commands to create the extension's objects.
* *
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
......
This diff is collapsed.
...@@ -228,6 +228,45 @@ ...@@ -228,6 +228,45 @@
#archive_timeout = 0 # force a logfile segment switch after this #archive_timeout = 0 # force a logfile segment switch after this
# number of seconds; 0 disables # number of seconds; 0 disables
# - Archive Recovery -
# These are only used in recovery mode.
#restore_command = '' # command to use to restore an archived logfile segment
# placeholders: %p = path of file to restore
# %f = file name only
# e.g. 'cp /mnt/server/archivedir/%f %p'
# (change requires restart)
#archive_cleanup_command = '' # command to execute at every restartpoint
# (change requires restart)
#recovery_end_command = '' # command to execute at completion of recovery
# (change requires restart)
# - Recovery Target -
# Set these only when performing a targeted recovery.
#recovery_target = '' # 'immediate' to end recovery as soon as a
# consistent state is reached
# (change requires restart)
#recovery_target_name = '' # the named restore point to which recovery will proceed
# (change requires restart)
#recovery_target_time = '' # the time stamp up to which recovery will proceed
# (change requires restart)
#recovery_target_xid = '' # the transaction ID up to which recovery will proceed
# (change requires restart)
#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed
# (change requires restart)
#recovery_target_inclusive = on # Specifies whether to stop:
# just after the specified recovery target (on)
# just before the recovery target (off)
# (change requires restart)
#recovery_target_timeline = '' # unset means read from control file (default),
# or set to 'latest' or timeline ID
# (change requires restart)
#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown'
# (change requires restart)
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# REPLICATION # REPLICATION
...@@ -261,6 +300,12 @@ ...@@ -261,6 +300,12 @@
# These settings are ignored on a master server. # These settings are ignored on a master server.
#primary_conninfo = '' # connection string to sending server
# (change requires restart)
#primary_slot_name = '' # replication slot on sending server
# (change requires restart)
#promote_trigger_file = '' # file name whose presence ends recovery
# (change requires restart)
#hot_standby = on # "off" disallows queries during recovery #hot_standby = on # "off" disallows queries during recovery
# (change requires restart) # (change requires restart)
#max_standby_archive_delay = 30s # max delay before canceling queries #max_standby_archive_delay = 30s # max delay before canceling queries
...@@ -278,6 +323,8 @@ ...@@ -278,6 +323,8 @@
# in milliseconds; 0 disables # in milliseconds; 0 disables
#wal_retrieve_retry_interval = 5s # time to wait before retrying to #wal_retrieve_retry_interval = 5s # time to wait before retrying to
# retrieve WAL after a failed attempt # retrieve WAL after a failed attempt
#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery
# (change requires restart)
# - Subscribers - # - Subscribers -
......
...@@ -265,7 +265,7 @@ usage(void) ...@@ -265,7 +265,7 @@ usage(void)
printf(_(" -x EXT clean up files if they have this extension\n")); printf(_(" -x EXT clean up files if they have this extension\n"));
printf(_(" -?, --help show this help, then exit\n")); printf(_(" -?, --help show this help, then exit\n"));
printf(_("\n" printf(_("\n"
"For use as archive_cleanup_command in recovery.conf when standby_mode = on:\n" "For use as archive_cleanup_command in postgresql.conf:\n"
" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n" " archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
"e.g.\n" "e.g.\n"
" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n")); " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"));
......
...@@ -131,7 +131,7 @@ static int has_xlogendptr = 0; ...@@ -131,7 +131,7 @@ static int has_xlogendptr = 0;
static volatile LONG has_xlogendptr = 0; static volatile LONG has_xlogendptr = 0;
#endif #endif
/* Contents of recovery.conf to be generated */ /* Contents of configuration file to be generated */
static PQExpBuffer recoveryconfcontents = NULL; static PQExpBuffer recoveryconfcontents = NULL;
/* Function headers */ /* Function headers */
...@@ -346,7 +346,7 @@ usage(void) ...@@ -346,7 +346,7 @@ usage(void)
printf(_(" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" printf(_(" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
" (in kB/s, or use suffix \"k\" or \"M\")\n")); " (in kB/s, or use suffix \"k\" or \"M\")\n"));
printf(_(" -R, --write-recovery-conf\n" printf(_(" -R, --write-recovery-conf\n"
" write recovery.conf for replication\n")); " write configuration for replication\n"));
printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
" relocate tablespace in OLDDIR to NEWDIR\n")); " relocate tablespace in OLDDIR to NEWDIR\n"));
printf(_(" --waldir=WALDIR location for the write-ahead log directory\n")); printf(_(" --waldir=WALDIR location for the write-ahead log directory\n"));
...@@ -974,6 +974,9 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -974,6 +974,9 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
bool basetablespace = PQgetisnull(res, rownum, 0); bool basetablespace = PQgetisnull(res, rownum, 0);
bool in_tarhdr = true; bool in_tarhdr = true;
bool skip_file = false; bool skip_file = false;
bool is_postgresql_auto_conf = false;
bool found_postgresql_auto_conf = false;
int file_padding_len = 0;
size_t tarhdrsz = 0; size_t tarhdrsz = 0;
pgoff_t filesz = 0; pgoff_t filesz = 0;
...@@ -1113,8 +1116,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -1113,8 +1116,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
{ {
/* /*
* End of chunk. If requested, and this is the base tablespace, * End of chunk. If requested, and this is the base tablespace,
* write recovery.conf into the tarfile. When done, close the file * write configuration file into the tarfile. When done, close the
* (but not stdout). * file (but not stdout).
* *
* Also, write two completely empty blocks at the end of the tar * Also, write two completely empty blocks at the end of the tar
* file, as required by some tar programs. * file, as required by some tar programs.
...@@ -1126,19 +1129,31 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -1126,19 +1129,31 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
if (basetablespace && writerecoveryconf) if (basetablespace && writerecoveryconf)
{ {
char header[512]; char header[512];
int padding;
tarCreateHeader(header, "recovery.conf", NULL, if (!found_postgresql_auto_conf)
recoveryconfcontents->len, {
int padding;
tarCreateHeader(header, "postgresql.auto.conf", NULL,
recoveryconfcontents->len,
pg_file_create_mode, 04000, 02000,
time(NULL));
padding = ((recoveryconfcontents->len + 511) & ~511) - recoveryconfcontents->len;
WRITE_TAR_DATA(header, sizeof(header));
WRITE_TAR_DATA(recoveryconfcontents->data, recoveryconfcontents->len);
if (padding)
WRITE_TAR_DATA(zerobuf, padding);
}
tarCreateHeader(header, "standby.signal", NULL,
0, /* zero-length file */
pg_file_create_mode, 04000, 02000, pg_file_create_mode, 04000, 02000,
time(NULL)); time(NULL));
padding = ((recoveryconfcontents->len + 511) & ~511) - recoveryconfcontents->len;
WRITE_TAR_DATA(header, sizeof(header)); WRITE_TAR_DATA(header, sizeof(header));
WRITE_TAR_DATA(recoveryconfcontents->data, recoveryconfcontents->len); WRITE_TAR_DATA(zerobuf, 511);
if (padding)
WRITE_TAR_DATA(zerobuf, padding);
} }
/* 2 * 512 bytes empty data at end of file */ /* 2 * 512 bytes empty data at end of file */
...@@ -1182,8 +1197,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -1182,8 +1197,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
if (!writerecoveryconf || !basetablespace) if (!writerecoveryconf || !basetablespace)
{ {
/* /*
* When not writing recovery.conf, or when not working on the base * When not writing config file, or when not working on the base
* tablespace, we never have to look for an existing recovery.conf * tablespace, we never have to look for an existing configuration
* file in the stream. * file in the stream.
*/ */
WRITE_TAR_DATA(copybuf, r); WRITE_TAR_DATA(copybuf, r);
...@@ -1191,7 +1206,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -1191,7 +1206,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
else else
{ {
/* /*
* Look for a recovery.conf in the existing tar stream. If it's * Look for a config file in the existing tar stream. If it's
* there, we must skip it so we can later overwrite it with our * there, we must skip it so we can later overwrite it with our
* own version of the file. * own version of the file.
* *
...@@ -1235,29 +1250,46 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -1235,29 +1250,46 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
{ {
/* /*
* We have the complete header structure in tarhdr, * We have the complete header structure in tarhdr,
* look at the file metadata: - the subsequent file * look at the file metadata: we may want append
* contents have to be skipped if the filename is * recovery info into postgresql.auto.conf and skip
* recovery.conf - find out the size of the file * standby.signal file. In both cases we must
* padded to the next multiple of 512 * calculate tar padding
*/ */
int padding; skip_file = (strcmp(&tarhdr[0], "standby.signal") == 0);
is_postgresql_auto_conf = (strcmp(&tarhdr[0], "postgresql.auto.conf") == 0);
skip_file = (strcmp(&tarhdr[0], "recovery.conf") == 0);
filesz = read_tar_number(&tarhdr[124], 12); filesz = read_tar_number(&tarhdr[124], 12);
file_padding_len = ((filesz + 511) & ~511) - filesz;
if (is_postgresql_auto_conf && writerecoveryconf)
{
/* replace tar header */
char header[512];
padding = ((filesz + 511) & ~511) - filesz; tarCreateHeader(header, "postgresql.auto.conf", NULL,
filesz += padding; filesz + recoveryconfcontents->len,
pg_file_create_mode, 04000, 02000,
time(NULL));
WRITE_TAR_DATA(header, sizeof(header));
}
else
{
/* copy stream with padding */
filesz += file_padding_len;
if (!skip_file)
{
/*
* If we're not skipping the file, write the
* tar header unmodified.
*/
WRITE_TAR_DATA(tarhdr, 512);
}
}
/* Next part is the file, not the header */ /* Next part is the file, not the header */
in_tarhdr = false; in_tarhdr = false;
/*
* If we're not skipping the file, write the tar
* header unmodified.
*/
if (!skip_file)
WRITE_TAR_DATA(tarhdr, 512);
} }
} }
else else
...@@ -1281,6 +1313,32 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -1281,6 +1313,32 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
pos += bytes2write; pos += bytes2write;
filesz -= bytes2write; filesz -= bytes2write;
} }
else if (is_postgresql_auto_conf && writerecoveryconf)
{
/* append recovery config to postgresql.auto.conf */
int padding;
int tailsize;
tailsize = (512 - file_padding_len) + recoveryconfcontents->len;
padding = ((tailsize + 511) & ~511) - tailsize;
WRITE_TAR_DATA(recoveryconfcontents->data, recoveryconfcontents->len);
if (padding)
{
char zerobuf[512];
MemSet(zerobuf, 0, sizeof(zerobuf));
WRITE_TAR_DATA(zerobuf, padding);
}
/* skip original file padding */
is_postgresql_auto_conf = false;
skip_file = true;
filesz += file_padding_len;
found_postgresql_auto_conf = true;
}
else else
{ {
/* /*
...@@ -1289,6 +1347,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) ...@@ -1289,6 +1347,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
*/ */
in_tarhdr = true; in_tarhdr = true;
skip_file = false; skip_file = false;
is_postgresql_auto_conf = false;
tarhdrsz = 0; tarhdrsz = 0;
filesz = 0; filesz = 0;
} }
...@@ -1614,7 +1673,7 @@ escape_quotes(const char *src) ...@@ -1614,7 +1673,7 @@ escape_quotes(const char *src)
} }
/* /*
* Create a recovery.conf file in memory using a PQExpBuffer * Create a configuration file in memory using a PQExpBuffer
*/ */
static void static void
GenerateRecoveryConf(PGconn *conn) GenerateRecoveryConf(PGconn *conn)
...@@ -1638,8 +1697,6 @@ GenerateRecoveryConf(PGconn *conn) ...@@ -1638,8 +1697,6 @@ GenerateRecoveryConf(PGconn *conn)
disconnect_and_exit(1); disconnect_and_exit(1);
} }
appendPQExpBufferStr(recoveryconfcontents, "standby_mode = 'on'\n");
initPQExpBuffer(&conninfo_buf); initPQExpBuffer(&conninfo_buf);
for (option = connOptions; option && option->keyword; option++) for (option = connOptions; option && option->keyword; option++)
{ {
...@@ -1698,8 +1755,9 @@ GenerateRecoveryConf(PGconn *conn) ...@@ -1698,8 +1755,9 @@ GenerateRecoveryConf(PGconn *conn)
/* /*
* Write a recovery.conf file into the directory specified in basedir, * Write the configuration file into the directory specified in basedir,
* with the contents already collected in memory. * with the contents already collected in memory.
* Then write the signal file into the basedir also.
*/ */
static void static void
WriteRecoveryConf(void) WriteRecoveryConf(void)
...@@ -1707,12 +1765,12 @@ WriteRecoveryConf(void) ...@@ -1707,12 +1765,12 @@ WriteRecoveryConf(void)
char filename[MAXPGPATH]; char filename[MAXPGPATH];
FILE *cf; FILE *cf;
sprintf(filename, "%s/recovery.conf", basedir); snprintf(filename, MAXPGPATH, "%s/%s", basedir, "postgresql.auto.conf");
cf = fopen(filename, "w"); cf = fopen(filename, "a");
if (cf == NULL) if (cf == NULL)
{ {
fprintf(stderr, _("%s: could not create file \"%s\": %s\n"), progname, filename, strerror(errno)); fprintf(stderr, _("%s: could not open file \"%s\": %s\n"), progname, filename, strerror(errno));
disconnect_and_exit(1); disconnect_and_exit(1);
} }
...@@ -1725,6 +1783,16 @@ WriteRecoveryConf(void) ...@@ -1725,6 +1783,16 @@ WriteRecoveryConf(void)
} }
fclose(cf); fclose(cf);
snprintf(filename, MAXPGPATH, "%s/%s", basedir, "standby.signal");
cf = fopen(filename, "w");
if (cf == NULL)
{
fprintf(stderr, _("%s: could not create file \"%s\": %s\n"), progname, filename, strerror(errno));
disconnect_and_exit(1);
}
fclose(cf);
} }
...@@ -1780,7 +1848,7 @@ BaseBackup(void) ...@@ -1780,7 +1848,7 @@ BaseBackup(void)
} }
/* /*
* Build contents of recovery.conf if requested * Build contents of configuration file if requested
*/ */
if (writerecoveryconf) if (writerecoveryconf)
GenerateRecoveryConf(conn); GenerateRecoveryConf(conn);
...@@ -2094,7 +2162,7 @@ BaseBackup(void) ...@@ -2094,7 +2162,7 @@ BaseBackup(void)
#endif #endif
} }
/* Free the recovery.conf contents */ /* Free the configuration file contents */
destroyPQExpBuffer(recoveryconfcontents); destroyPQExpBuffer(recoveryconfcontents);
/* /*
......
...@@ -358,19 +358,16 @@ SKIP: ...@@ -358,19 +358,16 @@ SKIP:
$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backupR", '-R' ], $node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backupR", '-R' ],
'pg_basebackup -R runs'); 'pg_basebackup -R runs');
ok(-f "$tempdir/backupR/recovery.conf", 'recovery.conf was created'); ok(-f "$tempdir/backupR/postgresql.auto.conf", 'postgresql.auto.conf exists');
my $recovery_conf = slurp_file "$tempdir/backupR/recovery.conf"; ok(-f "$tempdir/backupR/standby.signal", 'standby.signal was created');
my $recovery_conf = slurp_file "$tempdir/backupR/postgresql.auto.conf";
rmtree("$tempdir/backupR"); rmtree("$tempdir/backupR");
my $port = $node->port; my $port = $node->port;
like(
$recovery_conf,
qr/^standby_mode = 'on'\n/m,
'recovery.conf sets standby_mode');
like( like(
$recovery_conf, $recovery_conf,
qr/^primary_conninfo = '.*port=$port.*'\n/m, qr/^primary_conninfo = '.*port=$port.*'\n/m,
'recovery.conf sets primary_conninfo'); 'postgresql.auto.conf sets primary_conninfo');
$node->command_ok( $node->command_ok(
[ 'pg_basebackup', '-D', "$tempdir/backupxd" ], [ 'pg_basebackup', '-D', "$tempdir/backupxd" ],
...@@ -478,9 +475,9 @@ $node->command_ok( ...@@ -478,9 +475,9 @@ $node->command_ok(
], ],
'pg_basebackup with replication slot and -R runs'); 'pg_basebackup with replication slot and -R runs');
like( like(
slurp_file("$tempdir/backupxs_sl_R/recovery.conf"), slurp_file("$tempdir/backupxs_sl_R/postgresql.auto.conf"),
qr/^primary_slot_name = 'slot1'\n/m, qr/^primary_slot_name = 'slot1'\n/m,
'recovery.conf sets primary_slot_name'); 'recovery conf file sets primary_slot_name');
my $checksum = $node->safe_psql('postgres', 'SHOW data_checksums;'); my $checksum = $node->safe_psql('postgres', 'SHOW data_checksums;');
is($checksum, 'on', 'checksums are enabled'); is($checksum, 'on', 'checksums are enabled');
......
...@@ -159,12 +159,13 @@ sub create_standby ...@@ -159,12 +159,13 @@ sub create_standby
my $connstr_master = $node_master->connstr(); my $connstr_master = $node_master->connstr();
$node_standby->append_conf( $node_standby->append_conf(
"recovery.conf", qq( "postgresql.conf", qq(
primary_conninfo='$connstr_master application_name=rewind_standby' primary_conninfo='$connstr_master application_name=rewind_standby'
standby_mode=on
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$node_standby->set_standby_mode();
# Start standby # Start standby
$node_standby->start; $node_standby->start;
...@@ -270,12 +271,13 @@ sub run_pg_rewind ...@@ -270,12 +271,13 @@ sub run_pg_rewind
# Plug-in rewound node to the now-promoted standby node # Plug-in rewound node to the now-promoted standby node
my $port_standby = $node_standby->port; my $port_standby = $node_standby->port;
$node_master->append_conf( $node_master->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
primary_conninfo='port=$port_standby' primary_conninfo='port=$port_standby'
standby_mode=on
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$node_master->set_standby_mode();
# Restart the master to check that rewind went correctly # Restart the master to check that rewind went correctly
$node_master->start; $node_master->start;
......
...@@ -75,7 +75,7 @@ extern HotStandbyState standbyState; ...@@ -75,7 +75,7 @@ extern HotStandbyState standbyState;
/* /*
* Recovery target type. * Recovery target type.
* Only set during a Point in Time recovery, not when standby_mode = on * Only set during a Point in Time recovery, not when in standby mode.
*/ */
typedef enum typedef enum
{ {
...@@ -87,6 +87,16 @@ typedef enum ...@@ -87,6 +87,16 @@ typedef enum
RECOVERY_TARGET_IMMEDIATE RECOVERY_TARGET_IMMEDIATE
} RecoveryTargetType; } RecoveryTargetType;
/*
* Recovery target TimeLine goal
*/
typedef enum
{
RECOVERY_TARGET_TIMELINE_CONTROLFILE,
RECOVERY_TARGET_TIMELINE_LATEST,
RECOVERY_TARGET_TIMELINE_NUMERIC
} RecoveryTargetTimeLineGoal;
extern XLogRecPtr ProcLastRecPtr; extern XLogRecPtr ProcLastRecPtr;
extern XLogRecPtr XactLastRecEnd; extern XLogRecPtr XactLastRecEnd;
extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd; extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd;
...@@ -109,9 +119,32 @@ extern bool wal_compression; ...@@ -109,9 +119,32 @@ extern bool wal_compression;
extern bool *wal_consistency_checking; extern bool *wal_consistency_checking;
extern char *wal_consistency_checking_string; extern char *wal_consistency_checking_string;
extern bool log_checkpoints; extern bool log_checkpoints;
extern char *recoveryRestoreCommand;
extern char *recoveryEndCommand;
extern char *archiveCleanupCommand;
extern bool recoveryTargetInclusive;
extern int recoveryTargetAction;
extern int recovery_min_apply_delay;
extern char *PrimaryConnInfo;
extern char *PrimarySlotName;
/* indirectly set via GUC system */
extern TransactionId recoveryTargetXid;
extern TimestampTz recoveryTargetTime;
extern char *recoveryTargetName;
extern XLogRecPtr recoveryTargetLSN;
extern RecoveryTargetType recoveryTarget;
extern char *PromoteTriggerFile;
extern RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal;
extern TimeLineID recoveryTargetTLIRequested;
extern TimeLineID recoveryTargetTLI;
extern int CheckPointSegments; extern int CheckPointSegments;
/* option set locally in startup process only when signal files exist */
extern bool StandbyModeRequested;
extern bool StandbyMode;
/* Archive modes */ /* Archive modes */
typedef enum ArchiveMode typedef enum ArchiveMode
{ {
...@@ -319,8 +352,8 @@ extern void do_pg_abort_backup(void); ...@@ -319,8 +352,8 @@ extern void do_pg_abort_backup(void);
extern SessionBackupState get_backup_status(void); extern SessionBackupState get_backup_status(void);
/* File path names (all relative to $PGDATA) */ /* File path names (all relative to $PGDATA) */
#define RECOVERY_COMMAND_FILE "recovery.conf" #define RECOVERY_SIGNAL_FILE "recovery.signal"
#define RECOVERY_COMMAND_DONE "recovery.done" #define STANDBY_SIGNAL_FILE "standby.signal"
#define BACKUP_LABEL_FILE "backup_label" #define BACKUP_LABEL_FILE "backup_label"
#define BACKUP_LABEL_OLD "backup_label.old" #define BACKUP_LABEL_OLD "backup_label.old"
......
...@@ -69,6 +69,8 @@ enum config_group ...@@ -69,6 +69,8 @@ enum config_group
WAL_SETTINGS, WAL_SETTINGS,
WAL_CHECKPOINTS, WAL_CHECKPOINTS,
WAL_ARCHIVING, WAL_ARCHIVING,
WAL_ARCHIVE_RECOVERY,
WAL_RECOVERY_TARGET,
REPLICATION, REPLICATION,
REPLICATION_SENDING, REPLICATION_SENDING,
REPLICATION_MASTER, REPLICATION_MASTER,
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
* Escape (by doubling) any single quotes or backslashes in given string * Escape (by doubling) any single quotes or backslashes in given string
* *
* Note: this is used to process postgresql.conf entries and to quote * Note: this is used to process postgresql.conf entries and to quote
* string literals in pg_basebackup for creating recovery.conf. * string literals in pg_basebackup for writing the recovery configuration.
* Since postgresql.conf strings are defined to treat backslashes as escapes, * Since postgresql.conf strings are defined to treat backslashes as escapes,
* we have to double backslashes here. * we have to double backslashes here.
* *
......
...@@ -635,8 +635,6 @@ of a backup previously created on that node with $node->backup. ...@@ -635,8 +635,6 @@ of a backup previously created on that node with $node->backup.
Does not start the node after initializing it. Does not start the node after initializing it.
A recovery.conf is not created.
Streaming replication can be enabled on this node by passing the keyword Streaming replication can be enabled on this node by passing the keyword
parameter has_streaming => 1. This is disabled by default. parameter has_streaming => 1. This is disabled by default.
...@@ -834,10 +832,10 @@ sub enable_streaming ...@@ -834,10 +832,10 @@ sub enable_streaming
print "### Enabling streaming replication for node \"$name\"\n"; print "### Enabling streaming replication for node \"$name\"\n";
$self->append_conf( $self->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
primary_conninfo='$root_connstr application_name=$name' primary_conninfo='$root_connstr application_name=$name'
standby_mode=on
)); ));
$self->set_standby_mode();
return; return;
} }
...@@ -863,10 +861,26 @@ sub enable_restoring ...@@ -863,10 +861,26 @@ sub enable_restoring
: qq{cp "$path/%f" "%p"}; : qq{cp "$path/%f" "%p"};
$self->append_conf( $self->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
restore_command = '$copy_command' restore_command = '$copy_command'
standby_mode = on
)); ));
$self->set_standby_mode();
return;
}
=pod
=item $node->set_standby_mode()
Place standby.signal file.
=cut
sub set_standby_mode
{
my ($self) = @_;
$self->append_conf('standby.signal', '');
return; return;
} }
......
...@@ -131,7 +131,7 @@ is( $node_master->psql( ...@@ -131,7 +131,7 @@ is( $node_master->psql(
qq[SELECT pg_create_physical_replication_slot('$slotname_1');]), qq[SELECT pg_create_physical_replication_slot('$slotname_1');]),
0, 0,
'physical slot created on master'); 'physical slot created on master');
$node_standby_1->append_conf('recovery.conf', $node_standby_1->append_conf('postgresql.conf',
"primary_slot_name = $slotname_1"); "primary_slot_name = $slotname_1");
$node_standby_1->append_conf('postgresql.conf', $node_standby_1->append_conf('postgresql.conf',
"wal_receiver_status_interval = 1"); "wal_receiver_status_interval = 1");
...@@ -142,7 +142,7 @@ is( $node_standby_1->psql( ...@@ -142,7 +142,7 @@ is( $node_standby_1->psql(
qq[SELECT pg_create_physical_replication_slot('$slotname_2');]), qq[SELECT pg_create_physical_replication_slot('$slotname_2');]),
0, 0,
'physical slot created on intermediate replica'); 'physical slot created on intermediate replica');
$node_standby_2->append_conf('recovery.conf', $node_standby_2->append_conf('postgresql.conf',
"primary_slot_name = $slotname_2"); "primary_slot_name = $slotname_2");
$node_standby_2->append_conf('postgresql.conf', $node_standby_2->append_conf('postgresql.conf',
"wal_receiver_status_interval = 1"); "wal_receiver_status_interval = 1");
......
...@@ -23,7 +23,7 @@ sub test_recovery_standby ...@@ -23,7 +23,7 @@ sub test_recovery_standby
foreach my $param_item (@$recovery_params) foreach my $param_item (@$recovery_params)
{ {
$node_standby->append_conf('recovery.conf', qq($param_item)); $node_standby->append_conf('postgresql.conf', qq($param_item));
} }
$node_standby->start; $node_standby->start;
......
...@@ -47,12 +47,10 @@ $node_standby_1->psql('postgres', "SELECT pg_promote(wait_seconds => 300)", ...@@ -47,12 +47,10 @@ $node_standby_1->psql('postgres', "SELECT pg_promote(wait_seconds => 300)",
is($psql_out, 't', "promotion of standby with pg_promote"); is($psql_out, 't', "promotion of standby with pg_promote");
# Switch standby 2 to replay from standby 1 # Switch standby 2 to replay from standby 1
rmtree($node_standby_2->data_dir . '/recovery.conf');
my $connstr_1 = $node_standby_1->connstr; my $connstr_1 = $node_standby_1->connstr;
$node_standby_2->append_conf( $node_standby_2->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
primary_conninfo='$connstr_1 application_name=@{[$node_standby_2->name]}' primary_conninfo='$connstr_1 application_name=@{[$node_standby_2->name]}'
standby_mode=on
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$node_standby_2->restart; $node_standby_2->restart;
......
...@@ -25,7 +25,7 @@ my $delay = 3; ...@@ -25,7 +25,7 @@ my $delay = 3;
$node_standby->init_from_backup($node_master, $backup_name, $node_standby->init_from_backup($node_master, $backup_name,
has_streaming => 1); has_streaming => 1);
$node_standby->append_conf( $node_standby->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
recovery_min_apply_delay = '${delay}s' recovery_min_apply_delay = '${delay}s'
)); ));
$node_standby->start; $node_standby->start;
......
...@@ -230,7 +230,7 @@ is($psql_rc, '0', "Restore of prepared transaction on promoted standby"); ...@@ -230,7 +230,7 @@ is($psql_rc, '0', "Restore of prepared transaction on promoted standby");
# restart old master as new standby # restart old master as new standby
$cur_standby->enable_streaming($cur_master); $cur_standby->enable_streaming($cur_master);
$cur_standby->append_conf( $cur_standby->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$cur_standby->start; $cur_standby->start;
...@@ -268,7 +268,7 @@ is($psql_out, '1', ...@@ -268,7 +268,7 @@ is($psql_out, '1',
# restart old master as new standby # restart old master as new standby
$cur_standby->enable_streaming($cur_master); $cur_standby->enable_streaming($cur_master);
$cur_standby->append_conf( $cur_standby->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$cur_standby->start; $cur_standby->start;
...@@ -308,7 +308,7 @@ is($psql_out, '1', ...@@ -308,7 +308,7 @@ is($psql_out, '1',
# restart old master as new standby # restart old master as new standby
$cur_standby->enable_streaming($cur_master); $cur_standby->enable_streaming($cur_master);
$cur_standby->append_conf( $cur_standby->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$cur_standby->start; $cur_standby->start;
......
...@@ -76,7 +76,7 @@ $node_replica->init_from_backup( ...@@ -76,7 +76,7 @@ $node_replica->init_from_backup(
$node_master, $backup_name, $node_master, $backup_name,
has_streaming => 1, has_streaming => 1,
has_restoring => 1); has_restoring => 1);
$node_replica->append_conf('recovery.conf', $node_replica->append_conf('postgresql.conf',
q[primary_slot_name = 'phys_slot']); q[primary_slot_name = 'phys_slot']);
$node_replica->start; $node_replica->start;
......
...@@ -120,7 +120,7 @@ is($psql_out, '8128', "Visible"); ...@@ -120,7 +120,7 @@ is($psql_out, '8128', "Visible");
($node_master, $node_standby) = ($node_standby, $node_master); ($node_master, $node_standby) = ($node_standby, $node_master);
$node_standby->enable_streaming($node_master); $node_standby->enable_streaming($node_master);
$node_standby->append_conf( $node_standby->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$node_standby->start; $node_standby->start;
...@@ -171,7 +171,7 @@ is($psql_out, '-1', "Not visible"); ...@@ -171,7 +171,7 @@ is($psql_out, '-1', "Not visible");
($node_master, $node_standby) = ($node_standby, $node_master); ($node_master, $node_standby) = ($node_standby, $node_master);
$node_standby->enable_streaming($node_master); $node_standby->enable_streaming($node_master);
$node_standby->append_conf( $node_standby->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$node_standby->start; $node_standby->start;
...@@ -212,7 +212,7 @@ is($psql_out, '-1', "Not visible"); ...@@ -212,7 +212,7 @@ is($psql_out, '-1', "Not visible");
($node_master, $node_standby) = ($node_standby, $node_master); ($node_master, $node_standby) = ($node_standby, $node_master);
$node_standby->enable_streaming($node_master); $node_standby->enable_streaming($node_master);
$node_standby->append_conf( $node_standby->append_conf(
'recovery.conf', qq( 'postgresql.conf', qq(
recovery_target_timeline='latest' recovery_target_timeline='latest'
)); ));
$node_standby->start; $node_standby->start;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment