summaryrefslogtreecommitdiffstats
path: root/doc/src/sgml/pgstandby.sgml
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:19:15 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:19:15 +0000
commit6eb9c5a5657d1fe77b55cc261450f3538d35a94d (patch)
tree657d8194422a5daccecfd42d654b8a245ef7b4c8 /doc/src/sgml/pgstandby.sgml
parentInitial commit. (diff)
downloadpostgresql-13-upstream.tar.xz
postgresql-13-upstream.zip
Adding upstream version 13.4.upstream/13.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'doc/src/sgml/pgstandby.sgml')
-rw-r--r--doc/src/sgml/pgstandby.sgml394
1 files changed, 394 insertions, 0 deletions
diff --git a/doc/src/sgml/pgstandby.sgml b/doc/src/sgml/pgstandby.sgml
new file mode 100644
index 0000000..d8aded4
--- /dev/null
+++ b/doc/src/sgml/pgstandby.sgml
@@ -0,0 +1,394 @@
+<!-- doc/src/sgml/pgstandby.sgml -->
+
+<refentry id="pgstandby">
+ <indexterm zone="pgstandby">
+ <primary>pg_standby</primary>
+ </indexterm>
+
+ <refmeta>
+ <refentrytitle><application>pg_standby</application></refentrytitle>
+ <manvolnum>1</manvolnum>
+ <refmiscinfo>Application</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname>pg_standby</refname>
+ <refpurpose>supports the creation of a <productname>PostgreSQL</productname> warm standby server</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>pg_standby</command>
+ <arg rep="repeat"><replaceable>option</replaceable></arg>
+ <arg choice="plain"><replaceable>archivelocation</replaceable></arg>
+ <arg choice="plain"><replaceable>nextwalfile</replaceable></arg>
+ <arg choice="plain"><replaceable>walfilepath</replaceable></arg>
+ <arg choice="opt"><replaceable>restartwalfile</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+
+ <para>
+ <application>pg_standby</application> supports creation of a <quote>warm standby</quote>
+ database server. It is designed to be a production-ready program, as well
+ as a customizable template should you require specific modifications.
+ </para>
+
+ <para>
+ <application>pg_standby</application> is designed to be a waiting
+ <varname>restore_command</varname>, which is needed to turn a standard
+ archive recovery into a warm standby operation. Other
+ configuration is required as well, all of which is described in the main
+ server manual (see <xref linkend="warm-standby"/>).
+ </para>
+
+ <para>
+ To configure a standby
+ server to use <application>pg_standby</application>, put this into its
+ <filename>postgresql.conf</filename> configuration file:
+<programlisting>
+restore_command = 'pg_standby <replaceable>archiveDir</replaceable> %f %p %r'
+</programlisting>
+ where <replaceable>archiveDir</replaceable> is the directory from which WAL segment
+ files should be restored.
+ </para>
+ <para>
+ If <replaceable>restartwalfile</replaceable> is specified, normally by using the
+ <literal>%r</literal> macro, then all WAL files logically preceding this
+ file will be removed from <replaceable>archivelocation</replaceable>. This minimizes
+ the number of files that need to be retained, while preserving
+ crash-restart capability. Use of this parameter is appropriate if the
+ <replaceable>archivelocation</replaceable> is a transient staging area for this
+ particular standby server, but <emphasis>not</emphasis> when the
+ <replaceable>archivelocation</replaceable> is intended as a long-term WAL archive area.
+ </para>
+ <para>
+ <application>pg_standby</application> assumes that
+ <replaceable>archivelocation</replaceable> is a directory readable by the
+ server-owning user. If <replaceable>restartwalfile</replaceable> (or <literal>-k</literal>)
+ is specified,
+ the <replaceable>archivelocation</replaceable> directory must be writable too.
+ </para>
+ <para>
+ There are two ways to fail over to a <quote>warm standby</quote> database server
+ when the master server fails:
+
+ <variablelist>
+ <varlistentry>
+ <term>Smart Failover</term>
+ <listitem>
+ <para>
+ In smart failover, the server is brought up after applying all WAL
+ files available in the archive. This results in zero data loss, even if
+ the standby server has fallen behind, but if there is a lot of
+ unapplied WAL it can be a long time before the standby server becomes
+ ready. To trigger a smart failover, create a trigger file containing
+ the word <literal>smart</literal>, or just create it and leave it empty.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Fast Failover</term>
+ <listitem>
+ <para>
+ In fast failover, the server is brought up immediately. Any WAL files
+ in the archive that have not yet been applied will be ignored, and
+ all transactions in those files are lost. To trigger a fast failover,
+ create a trigger file and write the word <literal>fast</literal> into it.
+ <application>pg_standby</application> can also be configured to execute a fast
+ failover automatically if no new WAL file appears within a defined
+ interval.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ </refsect1>
+
+ <refsect1>
+ <title>Options</title>
+
+ <para>
+ <application>pg_standby</application> accepts the following command-line arguments:
+
+ <variablelist>
+
+ <varlistentry>
+ <term><option>-c</option></term>
+ <listitem>
+ <para>
+ Use <literal>cp</literal> or <literal>copy</literal> command to restore WAL files
+ from archive. This is the only supported behavior so this option is useless.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-d</option></term>
+ <listitem>
+ <para>
+ Print lots of debug logging output on <filename>stderr</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-k</option></term>
+ <listitem>
+ <para>
+ Remove files from <replaceable>archivelocation</replaceable> so that
+ no more than this many WAL files before the current one are kept in the
+ archive. Zero (the default) means not to remove any files from
+ <replaceable>archivelocation</replaceable>.
+ This parameter will be silently ignored if
+ <replaceable>restartwalfile</replaceable> is specified, since that
+ specification method is more accurate in determining the correct
+ archive cut-off point.
+ Use of this parameter is <emphasis>deprecated</emphasis> as of
+ <productname>PostgreSQL</productname> 8.3; it is safer and more efficient to
+ specify a <replaceable>restartwalfile</replaceable> parameter. A too
+ small setting could result in removal of files that are still needed
+ for a restart of the standby server, while a too large setting wastes
+ archive space.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-r</option> <replaceable>maxretries</replaceable></term>
+ <listitem>
+ <para>
+ Set the maximum number of times to retry the copy command if
+ it fails (default 3). After each failure, we wait for
+ <replaceable>sleeptime</replaceable> * <replaceable>num_retries</replaceable>
+ so that the wait time increases progressively. So by default,
+ we will wait 5 secs, 10 secs, then 15 secs before reporting
+ the failure back to the standby server. This will be
+ interpreted as end of recovery and the standby will come
+ up fully as a result.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-s</option> <replaceable>sleeptime</replaceable></term>
+ <listitem>
+ <para>
+ Set the number of seconds (up to 60, default 5) to sleep between
+ tests to see if the WAL file to be restored is available in
+ the archive yet. The default setting is not necessarily
+ recommended; consult <xref linkend="warm-standby"/> for discussion.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-t</option> <replaceable>triggerfile</replaceable></term>
+ <listitem>
+ <para>
+ Specify a trigger file whose presence should cause failover.
+ It is recommended that you use a structured file name to
+ avoid confusion as to which server is being triggered
+ when multiple servers exist on the same system; for example
+ <filename>/tmp/pgsql.trigger.5432</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-V</option></term>
+ <term><option>--version</option></term>
+ <listitem>
+ <para>
+ Print the <application>pg_standby</application> version and exit.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-w</option> <replaceable>maxwaittime</replaceable></term>
+ <listitem>
+ <para>
+ Set the maximum number of seconds to wait for the next WAL file,
+ after which a fast failover will be performed.
+ A setting of zero (the default) means wait forever.
+ The default setting is not necessarily recommended;
+ consult <xref linkend="warm-standby"/> for discussion.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-?</option></term>
+ <term><option>--help</option></term>
+ <listitem>
+ <para>
+ Show help about <application>pg_standby</application> command line
+ arguments, and exit.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ </refsect1>
+
+ <refsect1>
+ <title>Notes</title>
+
+ <para>
+ <application>pg_standby</application> is designed to work with
+ <productname>PostgreSQL</productname> 8.2 and later.
+ </para>
+ <para>
+ <productname>PostgreSQL</productname> 8.3 provides the <literal>%r</literal> macro,
+ which is designed to let <application>pg_standby</application> know the
+ last file it needs to keep. With <productname>PostgreSQL</productname> 8.2, the
+ <literal>-k</literal> option must be used if archive cleanup is
+ required. This option remains available in 8.3, but its use is deprecated.
+ </para>
+ <para>
+ <productname>PostgreSQL</productname> 8.4 provides the
+ <varname>recovery_end_command</varname> option. Without this option
+ a leftover trigger file can be hazardous.
+ </para>
+
+ <para>
+ <application>pg_standby</application> is written in C and has an
+ easy-to-modify source code, with specifically designated sections to modify
+ for your own needs
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Examples</title>
+
+ <para>On Linux or Unix systems, you might use:
+
+<programlisting>
+archive_command = 'cp %p .../archive/%f'
+
+restore_command = 'pg_standby -d -s 2 -t /tmp/pgsql.trigger.5442 .../archive %f %p %r 2>>standby.log'
+
+recovery_end_command = 'rm -f /tmp/pgsql.trigger.5442'
+</programlisting>
+ where the archive directory is physically located on the standby server,
+ so that the <varname>archive_command</varname> is accessing it across NFS,
+ but the files are local to the standby (enabling use of <literal>ln</literal>).
+ This will:
+ <itemizedlist>
+ <listitem>
+ <para>
+ produce debugging output in <filename>standby.log</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ sleep for 2 seconds between checks for next WAL file availability
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ stop waiting only when a trigger file called
+ <filename>/tmp/pgsql.trigger.5442</filename> appears,
+ and perform failover according to its content
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ remove the trigger file when recovery ends
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ remove no-longer-needed files from the archive directory
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>On Windows, you might use:
+
+<programlisting>
+archive_command = 'copy %p ...\\archive\\%f'
+
+restore_command = 'pg_standby -d -s 5 -t C:\pgsql.trigger.5442 ...\archive %f %p %r 2>>standby.log'
+
+recovery_end_command = 'del C:\pgsql.trigger.5442'
+</programlisting>
+ Note that backslashes need to be doubled in the
+ <varname>archive_command</varname>, but <emphasis>not</emphasis> in the
+ <varname>restore_command</varname> or <varname>recovery_end_command</varname>.
+ This will:
+ <itemizedlist>
+ <listitem>
+ <para>
+ use the <literal>copy</literal> command to restore WAL files from archive
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ produce debugging output in <filename>standby.log</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ sleep for 5 seconds between checks for next WAL file availability
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ stop waiting only when a trigger file called
+ <filename>C:\pgsql.trigger.5442</filename> appears,
+ and perform failover according to its content
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ remove the trigger file when recovery ends
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ remove no-longer-needed files from the archive directory
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ The <literal>copy</literal> command on Windows sets the final file size
+ before the file is completely copied, which would ordinarily confuse
+ <application>pg_standby</application>. Therefore
+ <application>pg_standby</application> waits <replaceable>sleeptime</replaceable>
+ seconds once it sees the proper file size. GNUWin32's <literal>cp</literal>
+ sets the file size only after the file copy is complete.
+ </para>
+
+ <para>
+ Since the Windows example uses <literal>copy</literal> at both ends, either
+ or both servers might be accessing the archive directory across the
+ network.
+ </para>
+
+ </refsect1>
+
+ <refsect1>
+ <title>Author</title>
+
+ <para>
+ Simon Riggs <email>simon@2ndquadrant.com</email>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>See Also</title>
+
+ <simplelist type="inline">
+ <member><xref linkend="pgarchivecleanup"/></member>
+ </simplelist>
+ </refsect1>
+</refentry>