<entry>query rewrite rules</entry>
</row>
+ <row>
+ <entry><link linkend="catalog-pg-replication-slots"><structname>pg_replication_slots</structname></link></entry>
+ <entry>replication slot information</entry>
+ </row>
+
<row>
<entry><link linkend="catalog-pg-seclabel"><structname>pg_seclabel</structname></link></entry>
<entry>security labels on database objects</entry>
</sect1>
+ <sect1 id="catalog-pg-replication-slots">
+ <title><structname>pg_replication_slots</structname></title>
+
+ <indexterm zone="catalog-pg-replication-slots">
+ <primary>pg_replication_slots</primary>
+ </indexterm>
+
+ <para>
+ The <structname>pg_replication_slots</structname> view provides a listing
+ of all replication slots that currently exist on the database cluster,
+ along with their current state.
+ </para>
+
+ <para>
+ For more on replication slots,
+ see <xref linkend="streaming-replication-slots">.
+ </para>
+
+ <table>
+
+ <title><structname>pg_replication_slots</structname> Columns</title>
+
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Name</entry>
+ <entry>Type</entry>
+ <entry>References</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><structfield>slot_name</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>A unique, cluster-wide identifier for the replication slot</entry>
+ </row>
+
+ <row>
+ <entry><structfield>slot_type</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>The slot type - <literal>physical</> or <literal>logical</></entry>
+ </row>
+
+ <row>
+ <entry><structfield>datoid</structfield></entry>
+ <entry><type>oid</type></entry>
+ <entry><literal><link linkend="catalog-pg-database"><structname>pg_database</structname></link>.oid</literal></entry>
+ <entry>The oid of the database this slot is associated with, or
+ null. Only logical slots have an associated database.</entry>
+ </row>
+
+ <row>
+ <entry><structfield>database</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry><literal><link linkend="catalog-pg-database"><structname>pg_database</structname></link>.datname</literal></entry>
+ <entry>The name of the database this slot is associated with, or
+ null. Only logical slots have an associated database.</entry>
+ </row>
+
+ <row>
+ <entry><structfield>active</structfield></entry>
+ <entry><type>boolean</type></entry>
+ <entry></entry>
+ <entry>True if this slot is currently actively being used</entry>
+ </row>
+
+ <row>
+ <entry><structfield>data_xmin</structfield></entry>
+ <entry><type>xid</type></entry>
+ <entry></entry>
+ <entry>The <literal>xmin</literal>, or oldest transaction ID, of
+ user data that this slot forces to be retained in the database.
+ <literal>VACUUM</literal> cannot remove tuples whose
+ <literal>xmax</literal> is greater than this.
+ </entry>
+ </row>
+
+ <row>
+ <entry><structfield>restart_lsn</structfield></entry>
+ <entry><type>text</type></entry>
+ <entry></entry>
+ <entry>The address (<literal>LSN</literal>) of oldest WAL which still
+ might be required by the consumer of this slot and thus won't be
+ automaticall removed during checkpoints.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+
<sect1 id="catalog-pg-seclabel">
<title><structname>pg_seclabel</structname></title>
</listitem>
</varlistentry>
+ <varlistentry id="guc-max-replication-slots" xreflabel="max_replication_slots">
+ <term><varname>max_replication_slots</varname> (<type>integer</type>)</term>
+ <indexterm>
+ <primary><varname>max_replication_slots</> configuration parameter</primary>
+ </indexterm>
+ <listitem>
+ <para>
+ Specifies the maximum number of replication slots
+ (see <xref linkend="streaming-replication-slots"> that can exist at the
+ same time. The default is zero. This parameter can only be set at
+ server start.
+ <varname>wal_level</varname> must be set
+ to <literal>archive</literal> or higher to allow replication slots to
+ be used. Setting it to a lower value than the number of currently
+ existing replication slots will prevent the server from starting.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="guc-wal-keep-segments" xreflabel="wal_keep_segments">
<term><varname>wal_keep_segments</varname> (<type>integer</type>)</term>
<indexterm>
</para>
</sect2>
+ <sect2 id="functions-replication">
+ <title>Replication Functions</title>
+
+ <para>
+ PostgreSQL exposes a number of functions for controlling and interacting
+ with replication features. See <xref linkend="streaming-replication">
+ and <xref linkend="streaming-replication-slots">.
+ </para>
+
+ <para>
+ Many of these functions have equivalent commands in the replication
+ protocol; see <xref linkend="protocol-replication">.
+ </para>
+
+ <para>
+ The sections <xref linkend="functions-snapshot-synchronization">, <xref
+ linkend="functions-recovery-control"> and <xref
+ linkend="functions-admin-backup"> are also relevant for replication.
+ </para>
+
+ <table id="functions-replication-table">
+ <title>Replication <acronym>SQL</acronym> Functions</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Function</entry>
+ <entry>Return Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <indexterm>
+ <primary>create_physical_replication_slot</primary>
+ </indexterm>
+ <literal><function>create_physical_replication_slot(<parameter>slotname</parameter> <type>text</type>, <parameter>plugin</parameter> <type>text</type>)</function></literal>
+ </entry>
+ <entry>
+ (<parameter>slotname</parameter> <type>text</type>, <parameter>xlog_position</parameter> <type>text</type>)
+ </entry>
+ <entry>
+ Creates a new physical replication slot named
+ <parameter>slotname</parameter>. Streaming changes from a physical slot
+ is only possible with the walsender protocol - see <xref
+ linkend="protocol-replication">. Corresponds to the walsender protocol
+ command <literal>CREATE_REPLICATION_SLOT ... PHYSICAL</literal>.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <indexterm>
+ <primary>drop_replication_slot</primary>
+ </indexterm>
+ <literal><function>drop_replication_slot(<parameter>slotname</parameter> <type>text</type>)</function></literal>
+ </entry>
+ <entry>
+ (<parameter>slotname</parameter> <type>text</type>)
+ </entry>
+ <entry>
+ Drops the physical or logical replication slot
+ named <parameter>slotname</parameter>. Same as walsender protocol
+ command <literal>DROP_REPLICATION_SLOT</>.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
<sect2 id="functions-admin-dbobject">
<title>Database Object Management Functions</title>
entries in <filename>pg_hba.conf</> with the database field set to
<literal>replication</>. Also ensure <varname>max_wal_senders</> is set
to a sufficiently large value in the configuration file of the primary
- server.
+ server. If replication slots will be used,
+ ensure <varname>max_replication_slots</varname> is set sufficiently high
+ as well.
</para>
<para>
</para>
<para>
- If you use streaming replication without file-based continuous
- archiving, you have to set <varname>wal_keep_segments</> in the master
- to a value high enough to ensure that old WAL segments are not recycled
- too early, while the standby might still need them to catch up. If the
- standby falls behind too much, it needs to be reinitialized from a new
- base backup. If you set up a WAL archive that's accessible from the
- standby, <varname>wal_keep_segments</> is not required as the standby can always
- use the archive to catch up.
+ If streaming replication is used without file-based continuous archiving,
+ either <varname>wal_keep_segments</> has to be set to a value high enough,
+ or replication slots have to be used, to ensure that old WAL segments are
+ not recycled too early, while the standby might still need them to catch
+ up. If the standby falls behind too much, it needs to be reinitialized
+ from a new base backup. If you set up a WAL archive that's accessible from
+ the standby, <varname>wal_keep_segments</> is not required as the standby
+ can always use the archive to catch up provided it retains enough
+ segments.
</para>
<para>
</sect3>
</sect2>
+ <sect2 id="streaming-replication-slots">
+ <title>Replication Slots</title>
+ <indexterm zone="high-availability">
+ <primary>Replication Slots</primary>
+ </indexterm>
+ <para>
+ A consumer of streaming replication requires the sender to retain
+ resources it requires: WAL segments that haven't been received by a
+ downstream node may not be removed lest the standby will either unable to
+ catch up, or needs to rely on externally maintained data via
+ <link linkend="restore-command"><literal>restore_command</literal></link>
+ (see <xref linkend="standby-server-operation">). In many scenarios the
+ standby also relies on the primary not to remove rows it still needs
+ (see <xref linkend="hot-standby-conflict">).
+ </para>
+ <para>
+ <varname>wal_keep_segments</varname> provides protection against required
+ WAL being removed, but it's a simple, imprecise method to retain enough
+ data, as it will often set to high values to retain enough WAL in case of
+ outages.
+ </para>
+ <para>
+ <varname>hot_standby_feedback</varname>
+ and <varname>vacuum_defer_cleanup_age</varname> provide protection against
+ relevant rows being removed by vacuum, but the former looses it's
+ protection during a connection loss of the replication connection and the
+ latter needs to be set to high values to provide safety.
+ </para>
+ <para>
+ The alternative is to use replication slots which provide a way to
+ register a standby's state on the primary (or one node up in
+ a <link linkend="cascading-replication">cascading replication</link>
+ setup) preventing it from removing resources that are required. When a
+ replication slot is used the upstream node will not remove required WAL
+ and if <varname>hot_standby_feedback</varname> is enable, the slot will
+ also be used to enforce that the relevant rows won't be removed.
+ </para>
+ <sect3 id="streaming-replication-slots-manipulation">
+ <title>Querying and manipulating replication slots</title>
+ <para>
+ A replication slot is identified by a single, cluster wide, name
+ consisting only out of lower case alphanumeric characters and the
+ underscore character.
+ </para>
+ <para>
+ Existing replication slots and their state can be seen in the
+ <link linkend="catalog-pg-replication-slots"><structname>pg_replication_slots</structname></link>
+ view.
+ </para>
+ <para>
+ They can be created and dropped either via the streaming replication
+ protocol (see <xref linkend="protocol-replication">) or by SQL accessible
+ functions (see <xref linkend="functions-replication">).
+ </para>
+ </sect3>
+ <sect3 id="streaming-replication-slots-config">
+ <title>Configuration Example</title>
+ <para>
+ To use streaming replication with a replication slot one first has to be
+ created:
+<programlisting>
+postgres=# SELECT * FROM create_physical_replication_slot('node_a_slot');
+ slotname | xlog_position
+-------------+---------------
+ node_a_slot |
+
+postgres=# SELECT * FROM pg_replication_slots;
+ slot_name | slot_type | datoid | database | active | data_xmin | restart_lsn
+-------------+-----------+--------+----------+--------+-----------+-------------
+ node_a_slot | physical | 0 | | f | 0 | 0/0
+(1 row)
+</programlisting>
+ After that the standby's recovery.conf needs to be changed to
+ specify <varname>primary_slotname</varname>. A simple example of such
+ a <filename>recovery.conf</> is:
+<programlisting>
+standby_mode = 'on'
+primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'
+primary_slotname = 'node_a_slot'
+</programlisting>
+ </para>
+ </sect3>
+ </sect2>
+
<sect2 id="cascading-replication">
<title>Cascading Replication</title>
</varlistentry>
<varlistentry>
- <term>START_REPLICATION <replaceable class="parameter">XXX/XXX</> TIMELINE <replaceable class="parameter">tli</></term>
+ <term><literal>CREATE_REPLICATION_SLOT</literal> <literal>SLOT</literal> <replaceable class="parameter">slotname</> <literal>PHYSICAL</literal></term>
+ <indexterm><primary>CREATE_REPLICATION_SLOT</primary></indexterm>
<listitem>
<para>
- Instructs server to start streaming WAL, starting at
- WAL position <replaceable class="parameter">XXX/XXX</> on timeline
- <replaceable class="parameter">tli</>.
- The server can reply with an error, e.g. if the requested section of WAL
- has already been recycled. On success, server responds with a
- CopyBothResponse message, and then starts to stream WAL to the frontend.
+ Create a physical replication
+ slot. See <xref linkend="streaming-replication-slots"> for more about
+ replication slots.
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term><literal>SLOT</literal> <replaceable class="parameter">slotname</></term>
+ <listitem>
+ <para>
+ The name of the slot to create. Must be a valid replication slot
+ name (see <xref linkend="streaming-replication-slots-manipulation">).
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>START_REPLICATION</literal> [<literal>SLOT</literal> <replaceable class="parameter">slotname</>] [<literal>PHYSICAL</literal>] <replaceable class="parameter">XXX/XXX</> <literal>TIMELINE</literal> <replaceable class="parameter">tli</></term>
+ <listitem>
+ <para>
+ Instructs server to start streaming physical WAL records, starting at
+ WAL position <replaceable class="parameter">XXX/XXX</>. If specified,
+ streaming starts on timeline <replaceable class="parameter">tli</>, otherwise
+ the server's current timeline is selected. The server can reply with an
+ error, e.g. if the requested section of WAL has already been recycled. On
+ success, server responds with a CopyBothResponse message, and then starts
+ to stream WAL to the frontend.
</para>
<para>
client contains a message of one of the following formats:
</para>
+ <para>
+ If a slot's name is provided
+ via <replaceable class="parameter">slotname</>, it will be updated with
+ replication progress while START_REPLICATION is in progress ensuring
+ that no important resources are released.
+ </para>
+
<para>
<variablelist>
<varlistentry>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><literal>DROP_REPLICATION_SLOT</literal> <literal>SLOT</literal> <replaceable class="parameter">slotname</></term>
+ <listitem>
+ <para>
+ Drops a replication slot, freeing any reserved server-side resources. If
+ the slot is currently in use by an active connection this command fails.
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term><literal>SLOT</literal> <replaceable class="parameter">slotname</></term>
+ <listitem>
+ <para>
+ The name of the slot to drop.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term>BASE_BACKUP [<literal>LABEL</literal> <replaceable>'label'</replaceable>] [<literal>PROGRESS</literal>] [<literal>FAST</literal>] [<literal>WAL</literal>] [<literal>NOWAIT</literal>]</term>
<listitem>
</para>
</listitem>
</varlistentry>
+ <varlistentry id="primary-slotname" xreflabel="primary_slotname">
+ <term><varname>primary_slotname</varname> (<type>string</type>)</term>
+ <indexterm>
+ <primary><varname>primary_slotname</> recovery parameter</primary>
+ </indexterm>
+ <listitem>
+ <para>
+ Optionally specifies an existing replication slot to be used when
+ connecting to the primary via streaming replication to control
+ resource removal on the upstream node
+ (see <xref linkend="streaming-replication-slots">).
+ This setting has no effect if <varname>primary_conninfo</> is not
+ set.
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry id="trigger-file" xreflabel="trigger_file">
<term><varname>trigger_file</varname> (<type>string</type>)</term>
<indexterm>