Change default of recovery_target_timeline to 'latest'
authorPeter Eisentraut <peter@eisentraut.org>
Fri, 11 Jan 2019 09:36:10 +0000 (10:36 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Sun, 13 Jan 2019 09:01:05 +0000 (10:01 +0100)
This is what one usually wants for recovery and almost always wants
for a standby.

Discussion: https://www.postgresql.org/message-id/flat/6dd2c23a-4162-8469-410f-bfe146e28c0c@2ndquadrant.com/
Reviewed-by: David Steele <david@pgmasters.net>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
doc/src/sgml/config.sgml
doc/src/sgml/high-availability.sgml
src/backend/access/transam/xlog.c
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample
src/bin/pg_rewind/RewindTest.pm
src/test/recovery/t/004_timeline_switch.pl
src/test/recovery/t/009_twophase.pl
src/test/recovery/t/012_subtransactions.pl

index f64402adbe11a8b3493365fd92bc09b1911b323d..b6f5822b847dd4e4a0ff32359d913bd4058c97da 100644 (file)
@@ -3353,10 +3353,14 @@ restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"'  # Windows
         Specifies recovering into a particular timeline.  The value can be a
         numeric timeline ID or a special value.  The value
         <literal>current</literal> recovers along the same timeline that was
-        current when the base backup was taken.  That is the default.  The
+        current when the base backup was taken.  The
         value <literal>latest</literal> recovers
         to the latest timeline found in the archive, which is useful in
-        a standby server. Other than that you only need to set this parameter
+        a standby server.  <literal>latest</literal> is the default.
+       </para>
+
+       <para>
+        You usually only need to set this parameter
         in complex re-recovery situations, where you need to return to
         a state that itself was reached after a point-in-time recovery.
         See <xref linkend="backup-timelines"/> for discussion.
index d8fd195da092dfff40a148f3ed951cc660b2bf51..4882b20828a3d6967e6ae714f737f7a43eeb9ede 100644 (file)
@@ -690,8 +690,8 @@ protocol to make nodes agree on a serializable transactional order.
     <filename>standby.signal</filename> in the standby's cluster data
     directory. Set <xref linkend="guc-restore-command"/> to a simple command to copy files from
     the WAL archive. If you plan to have multiple standby servers for high
-    availability purposes, set <varname>recovery_target_timeline</varname> to
-    <literal>latest</literal>, to make the standby server follow the timeline change
+    availability purposes, make sure that <varname>recovery_target_timeline</varname> is set to
+    <literal>latest</literal> (the default), to make the standby server follow the timeline change
     that occurs at failover to another standby.
    </para>
 
@@ -1024,7 +1024,7 @@ primary_slot_name = 'node_a_slot'
    <para>
     If an upstream standby server is promoted to become new master, downstream
     servers will continue to stream from the new master if
-    <varname>recovery_target_timeline</varname> is set to <literal>'latest'</literal>.
+    <varname>recovery_target_timeline</varname> is set to <literal>'latest'</literal> (the default).
    </para>
 
    <para>
index 9823b757676be5f7be2259cc1099760b324d3166..2ab7d804f032a60f1f23bdcdb1ad991aecd5b3a7 100644 (file)
@@ -324,7 +324,7 @@ static bool recoveryStopAfter;
  * file was created.)  During a sequential scan we do not allow this value
  * to decrease.
  */
-RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal = RECOVERY_TARGET_TIMELINE_CONTROLFILE;
+RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal = RECOVERY_TARGET_TIMELINE_LATEST;
 TimeLineID recoveryTargetTLIRequested = 0;
 TimeLineID recoveryTargetTLI = 0;
 static List *expectedTLEs;
index 7eda7fdef9afd313c368f087fe236783b5906f31..ae925c16509f25889640ff73fafa6dc41aaa70af 100644 (file)
@@ -3387,7 +3387,7 @@ static struct config_string ConfigureNamesString[] =
            NULL
        },
        &recovery_target_timeline_string,
-       "current",
+       "latest",
        check_recovery_target_timeline, assign_recovery_target_timeline, NULL
    },
 
@@ -11028,7 +11028,7 @@ show_data_directory_mode(void)
 static bool
 check_recovery_target_timeline(char **newval, void **extra, GucSource source)
 {
-   RecoveryTargetTimeLineGoal rttg = RECOVERY_TARGET_TIMELINE_CONTROLFILE;
+   RecoveryTargetTimeLineGoal rttg;
    RecoveryTargetTimeLineGoal *myextra;
 
    if (strcmp(*newval, "current") == 0)
@@ -11037,6 +11037,8 @@ check_recovery_target_timeline(char **newval, void **extra, GucSource source)
        rttg = RECOVERY_TARGET_TIMELINE_LATEST;
    else
    {
+       rttg = RECOVERY_TARGET_TIMELINE_NUMERIC;
+
        errno = 0;
        strtoul(*newval, NULL, 0);
        if (errno == EINVAL || errno == ERANGE)
@@ -11044,7 +11046,6 @@ check_recovery_target_timeline(char **newval, void **extra, GucSource source)
            GUC_check_errdetail("recovery_target_timeline is not a valid number.");
            return false;
        }
-       rttg = RECOVERY_TARGET_TIMELINE_NUMERIC;
    }
 
    myextra = (RecoveryTargetTimeLineGoal *) guc_malloc(ERROR, sizeof(RecoveryTargetTimeLineGoal));
index f7c1dee240228de12c16084816f2374469b4c184..a21865a77faff69f9bd04c894c532b757e191e57 100644 (file)
                # just after the specified recovery target (on)
                # just before the recovery target (off)
                # (change requires restart)
-#recovery_target_timeline = 'current'  # 'current', 'latest', or timeline ID
+#recovery_target_timeline = 'latest'   # 'current', 'latest', or timeline ID
                # (change requires restart)
 #recovery_target_action = 'pause'  # 'pause', 'promote', 'shutdown'
                # (change requires restart)
index 3d07da5d949917e40d990f4aa997894bb7c6c5aa..85cae7e47b1dba2cbe21e733b87f7e3bf8d28fe7 100644 (file)
@@ -161,7 +161,6 @@ sub create_standby
    $node_standby->append_conf(
        "postgresql.conf", qq(
 primary_conninfo='$connstr_master application_name=rewind_standby'
-recovery_target_timeline='latest'
 ));
 
    $node_standby->set_standby_mode();
@@ -273,7 +272,6 @@ sub run_pg_rewind
    $node_master->append_conf(
        'postgresql.conf', qq(
 primary_conninfo='port=$port_standby'
-recovery_target_timeline='latest'
 ));
 
    $node_master->set_standby_mode();
index 79cbffb827b94108cfdbbc24e0115a2fb4ddf65e..2b315854bc592bf30bff6dc8c32a0885740d4a80 100644 (file)
@@ -51,7 +51,6 @@ my $connstr_1 = $node_standby_1->connstr;
 $node_standby_2->append_conf(
    'postgresql.conf', qq(
 primary_conninfo='$connstr_1 application_name=@{[$node_standby_2->name]}'
-recovery_target_timeline='latest'
 ));
 $node_standby_2->restart;
 
index dac2d4ec0d630506e74fb199db36d64d2d608707..2be1afcd8ba40f15b7f7fa86196506c20684307b 100644 (file)
@@ -229,10 +229,6 @@ is($psql_rc, '0', "Restore of prepared transaction on promoted standby");
 
 # restart old master as new standby
 $cur_standby->enable_streaming($cur_master);
-$cur_standby->append_conf(
-   'postgresql.conf', qq(
-recovery_target_timeline='latest'
-));
 $cur_standby->start;
 
 ###############################################################################
@@ -267,10 +263,6 @@ is($psql_out, '1',
 
 # restart old master as new standby
 $cur_standby->enable_streaming($cur_master);
-$cur_standby->append_conf(
-   'postgresql.conf', qq(
-recovery_target_timeline='latest'
-));
 $cur_standby->start;
 
 $cur_master->psql('postgres', "COMMIT PREPARED 'xact_009_11'");
@@ -307,10 +299,6 @@ is($psql_out, '1',
 
 # restart old master as new standby
 $cur_standby->enable_streaming($cur_master);
-$cur_standby->append_conf(
-   'postgresql.conf', qq(
-recovery_target_timeline='latest'
-));
 $cur_standby->start;
 
 $cur_master->psql('postgres', "COMMIT PREPARED 'xact_009_12'");
index e26cc9c2ce12022cb99324eee78f6ab1c4b5e826..c1845536942b0ded357a94372eb54cc32fc117ec 100644 (file)
@@ -119,10 +119,6 @@ is($psql_out, '8128', "Visible");
 # restore state
 ($node_master, $node_standby) = ($node_standby, $node_master);
 $node_standby->enable_streaming($node_master);
-$node_standby->append_conf(
-   'postgresql.conf', qq(
-recovery_target_timeline='latest'
-));
 $node_standby->start;
 $node_standby->psql(
    'postgres',
@@ -170,10 +166,6 @@ is($psql_out, '-1', "Not visible");
 # restore state
 ($node_master, $node_standby) = ($node_standby, $node_master);
 $node_standby->enable_streaming($node_master);
-$node_standby->append_conf(
-   'postgresql.conf', qq(
-recovery_target_timeline='latest'
-));
 $node_standby->start;
 $psql_rc = $node_master->psql('postgres', "COMMIT PREPARED 'xact_012_1'");
 is($psql_rc, '0',
@@ -211,10 +203,6 @@ is($psql_out, '-1', "Not visible");
 # restore state
 ($node_master, $node_standby) = ($node_standby, $node_master);
 $node_standby->enable_streaming($node_master);
-$node_standby->append_conf(
-   'postgresql.conf', qq(
-recovery_target_timeline='latest'
-));
 $node_standby->start;
 $psql_rc = $node_master->psql('postgres', "ROLLBACK PREPARED 'xact_012_1'");
 is($psql_rc, '0',