From fbd9fa407c04799ad4401d3ba5c6b67a0d922631 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 31 Oct 2023 10:14:01 +0900 Subject: [PATCH] Force crash recovery with backup_label and no .signal files --- src/backend/access/transam/xlogrecovery.c | 29 ++++++++++++++++---- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 3 +- doc/src/sgml/backup.sgml | 4 ++- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index c61566666a..de5787d7e8 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -133,6 +133,8 @@ static TimeLineID curFileTLI; * currently performing crash recovery using only XLOG files in pg_wal, but * will switch to using offline XLOG archives as soon as we reach the end of * WAL in pg_wal. + * + * InArchiveRecovery should never be set without ArchiveRecoveryRequested. */ bool ArchiveRecoveryRequested = false; bool InArchiveRecovery = false; @@ -595,13 +597,22 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, List *tablespaces = NIL; /* - * Archive recovery was requested, and thanks to the backup label - * file, we know how far we need to replay to reach consistency. Enter - * archive recovery directly. + * If archive recovery was requested, and we know how far we need to + * replay to reach consistency thanks to the backup label file, then + * enter archive recovery directly in this case. + * + * If archive recovery was not requested, then do crash recovery and + * replay all the local WAL. This still checks that all the WAL up + * to backupEndRequired has been replayed. This case is useful when + * restoring from a standalone base backup, taken with pg_basebackup + * --wal-method=stream, for example. */ - InArchiveRecovery = true; - if (StandbyModeRequested) - EnableStandbyMode(); + if (ArchiveRecoveryRequested) + { + InArchiveRecovery = true; + if (StandbyModeRequested) + EnableStandbyMode(); + } /* * When a backup_label file is present, we want to roll forward from @@ -1591,6 +1602,12 @@ ShutdownWalRecovery(void) */ if (ArchiveRecoveryRequested) DisownLatch(&XLogRecoveryCtl->recoveryWakeupLatch); + + /* + * InArchiveRecovery should never have been set without + * ArchiveRecoveryRequested. + */ + Assert(ArchiveRecoveryRequested || !InArchiveRecovery); } /* diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index b9f5e1266b..b9e54f4562 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -392,7 +392,8 @@ SKIP: my $node2 = PostgreSQL::Test::Cluster->new('replica'); # Recover main data directory - $node2->init_from_backup($node, 'tarbackup2', tar_program => $tar); + $node2->init_from_backup($node, 'tarbackup2', tar_program => $tar, + has_restoring => 1); # Recover tablespace into a new directory (not where it was!) my $repTsDir = "$tempdir/tblspc1replica"; diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index 8cb24d6ae5..5ba7a284cf 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -1380,7 +1380,9 @@ restore_command = 'cp /mnt/server/archivedir/%f %p' tool. If you include the -X parameter when calling it, all the write-ahead log required to use the backup will be included in the backup automatically, and no special action is - required to restore the backup. + required to restore the backup. Restoring a standalone backup is + equivalent to crash recovery, replaying all the WAL stored in + pg_wal up to its end. -- 2.42.0