On 12 October 2010 23:28, Fujii Masao <masao.fu...@gmail.com> wrote:
> On Sat, Oct 9, 2010 at 10:04 AM, Brendan Jurd <dire...@gmail.com> wrote:
>> I have just set up HS+SR for the first time, and for the most part,
>> the docs were excellent.  The one exception for me was the discussion
>> of archive_cleanup_command.  This is a pretty important part of
>> constructing a healthy standby server, and IMO the docs don't give it
>> the treatment it deserves.
...

> Agreed.
>
> And, ISTM that we should mention that we must not just specify
> pg_archivecleanup in archive_cleanup_command when there are multiple
> standby servers. This is because, in that case, we must calculate
> the oldest restart point in those standbys and delete the archived
> WAL files according to that point.

As promised, here is a patch to try to address $SUBJECT.

Summary of changes:

In 25.2.4. "Setting Up a Standby Server":

 * Get rid of the extraneous short paragraph,
 * move the full-size paragraph up to where the now-extinct short para was,
 * add an archive_cleanup_command to the example recovery.conf,
 * flesh out the wording,
 * add links to 26.1 and F.22.

In 26.1. "Archive recovery settings":

 * Add detail to the description of how it works,
 * add an example recovery.conf snippet,
 * per Fujii-san's comment, indicate that multi-standby setups require
more finesse,
 * link to F.22.

In F.22. "pg_archivecleanup":

 * Edit and clarify wording,
 * standardise label for the <archivelocation> argument,
 * again indicate the multi-standby issue,
 * link to 25.2.

I'll drop this onto the next open commitfest.  If it passes muster, it
sure wouldn't hurt to backpatch it to 9.0.

Cheers,
BJ
*** a/doc/src/sgml/high-availability.sgml
--- b/doc/src/sgml/high-availability.sgml
***************
*** 681,691 **** protocol to make nodes agree on a serializable transactional 
order.
     </para>
  
     <para>
-     You can use <varname>archive_cleanup_command</> to prune the archive of
-     files no longer needed by the standby.
-    </para>
- 
-    <para>
      If you're setting up the standby server for high availability purposes,
      set up WAL archiving, connections and authentication like the primary
      server, because the standby server will work as a primary server after
--- 681,686 ----
***************
*** 697,708 **** protocol to make nodes agree on a serializable transactional 
order.
--- 692,716 ----
     </para>
  
     <para>
+     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
+     longer required by the standby server.
+     The <application>pg_archivecleanup</> utility is designed specifically to
+     be used with <varname>archive_cleanup_command</> in typical single-standby
+     configurations, see <xref linkend="pgarchivecleanup">.
+     Note however, that if you're using the archive for backup purposes, you
+     need to retain files needed to recover from at least the latest base
+     backup, even if they're no longer needed by the standby.
+    </para>
+ 
+    <para>
      A simple example of a <filename>recovery.conf</> is:
  <programlisting>
  standby_mode = 'on'
  primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'
  restore_command = 'cp /path/to/archive/%f %p'
  trigger_file = '/path/to/trigger_file'
+ archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r'
  </programlisting>
     </para>
  
***************
*** 712,725 **** trigger_file = '/path/to/trigger_file'
      the primary to allow them to be connected simultaneously.
     </para>
  
-    <para>
-     If you're using a WAL archive, its size can be minimized using
-     the <varname>archive_cleanup_command</> option to remove files that are
-     no longer required by the standby server. Note however, that if you're
-     using the archive for backup purposes, you need to retain files needed
-     to recover from at least the latest base backup, even if they're no
-     longer needed by the standby.
-    </para>
    </sect2>
  
    <sect2 id="streaming-replication">
--- 720,725 ----
*** a/doc/src/sgml/pgarchivecleanup.sgml
--- b/doc/src/sgml/pgarchivecleanup.sgml
***************
*** 8,17 ****
   </indexterm>
  
   <para>
!   <application>pg_archivecleanup</> is designed to cleanup an archive when 
used
!   as an <literal>archive_cleanup_command</literal> when running with
!   <literal>standby_mode = on</literal>. <application>pg_archivecleanup</> can
!   also be used as a standalone program to clean WAL file archives.
   </para>
  
   <para>
--- 8,18 ----
   </indexterm>
  
   <para>
!   <application>pg_archivecleanup</> is designed to be used as an
!   <literal>archive_cleanup_command</literal> to clean up WAL file archives 
when
!   running as a standby server (see <xref linkend="warm-standby">).
!   <application>pg_archivecleanup</> can also be used as a standalone program 
to
!   clean WAL file archives.
   </para>
  
   <para>
***************
*** 39,58 ****
     server to use <application>pg_archivecleanup</>, put this into its
     <filename>recovery.conf</filename> configuration file:
  <programlisting>
! archive_cleanup_command = 'pg_archivecleanup <replaceable>archiveDir</> %r'
  </programlisting>
!    where <replaceable>archiveDir</> is the directory from which WAL segment
!    files should be restored.
    </para>
    <para>
!    When used within <literal>archive_cleanup_command</literal>,
!    all WAL files logically preceding the value of the <literal>%r</>
!    will be removed <replaceable>archivelocation</>. 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</> is a transient staging area for this
!    particular standby server, but <emphasis>not</> when the
!    <replaceable>archivelocation</> is intended as a long-term WAL archive 
area.
    </para>
    <para>
     The full syntax of <application>pg_archivecleanup</>'s command line is
--- 40,60 ----
     server to use <application>pg_archivecleanup</>, put this into its
     <filename>recovery.conf</filename> configuration file:
  <programlisting>
! archive_cleanup_command = 'pg_archivecleanup <replaceable>archivelocation</> 
%r'
  </programlisting>
!    where <replaceable>archivelocation</> is the directory from which WAL 
segment
!    files should be removed.
    </para>
    <para>
!    When used within <xref linkend="archive-cleanup-command">, all WAL files
!    logically preceding the value of the <literal>%r</> argument will be 
removed
!    from <replaceable>archivelocation</>. 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</> is a
!    transient staging area for this particular standby server, but
!    <emphasis>not</> when the <replaceable>archivelocation</> is intended as a
!    long-term WAL archive area, or when multiple standby servers are recovering
!    from the same archive location.
    </para>
    <para>
     The full syntax of <application>pg_archivecleanup</>'s command line is
*** a/doc/src/sgml/recovery-config.sgml
--- b/doc/src/sgml/recovery-config.sgml
***************
*** 80,99 **** restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"'  # 
Windows
        </indexterm>
        <listitem>
         <para>
!         This parameter specifies a shell command that will be executed at
!         every restartpoint. This parameter is optional. The purpose of the
!         <varname>archive_cleanup_command</> is to provide a mechanism for 
cleaning
!         up old archived WAL files that are no longer needed by the standby
!         server.
!         Any <literal>%r</> is replaced by the name of the file
!         containing the last valid restart point. That is the earliest file 
that
!         must be kept to allow a restore to be restartable, so this information
!         can be used to truncate the archive to just the minimum required to
!         support restart from the current restore. <literal>%r</> would
!         typically be used in a warm-standby configuration
!         (see <xref linkend="warm-standby">).
!         Write <literal>%%</> to embed an actual <literal>%</> character
!         in the command.
         </para>
         <para>
          If the command returns a non-zero exit status then a WARNING log
--- 80,109 ----
        </indexterm>
        <listitem>
         <para>
!         This optional parameter specifies a shell command that will be 
executed
!         at every restartpoint.  The purpose of
!         <varname>archive_cleanup_command</> is to provide a mechanism for
!         cleaning up old archived WAL files that are no longer needed by the
!         standby server.
!         Any <literal>%r</> is replaced by the name of the file containing the
!         last valid restart point.
!         That is the earliest file that must be <emphasis>kept</> to allow a
!         restore to be restartable, and so all files earlier than 
<literal>%r</>
!         may be safely removed.
!         This information can be used to truncate the archive to just the
!         minimum required to support restart from the current restore.
!         The <application>pg_archivecleanup</> utility provided in
!         <literal>contrib</> (see <xref linkend="pgarchivecleanup">) serves as 
a
!         convenient target for <varname>archive_cleanup_command</> in typical
!         single-standby configurations, for example:
! <programlisting> archive_cleanup_command = 'pg_archivecleanup 
/mnt/server/archivedir %r' </programlisting>
!         Note however that if multiple standby servers are restoring from the
!         same archive directory, you will need to ensure that you do not delete
!         WAL files until they are no longer needed by any of the servers.
!         <varname>archive_cleanup_command</> would typically be used in a
!         warm-standby configuration (see <xref linkend="warm-standby">).
!         Write <literal>%%</> to embed an actual <literal>%</> character in the
!         command.
         </para>
         <para>
          If the command returns a non-zero exit status then a WARNING log
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to