diff options
Diffstat (limited to 'src/backend/access/transam/xlog.c')
| -rw-r--r-- | src/backend/access/transam/xlog.c | 27 | 
1 files changed, 22 insertions, 5 deletions
| diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index eac61c5727c..56f32f6ed8d 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6322,12 +6322,28 @@ StartupXLOG(void)  		(XLByteLT(EndOfLog, minRecoveryPoint) ||  		 !XLogRecPtrIsInvalid(ControlFile->backupStartPoint)))  	{ -		if (reachedStopPoint)	/* stopped because of stop request */ +		if (reachedStopPoint) +		{ +			/* stopped because of stop request */  			ereport(FATAL,  					(errmsg("requested recovery stop point is before consistent recovery point"))); -		else	/* ran off end of WAL */ -			ereport(FATAL, -					(errmsg("WAL ends before consistent recovery point"))); +		} +		else +		{ +			/* +			 * Ran off end of WAL before reaching end-of-backup WAL record, +			 * or minRecoveryPoint. That's usually a bad sign, indicating that +			 * you tried to recover from an online backup but never called +			 * pg_stop_backup(), or you didn't archive all the WAL up to that +			 * point. However, this also happens in crash recovery, if the +			 * system crashes while an online backup is in progress. We +			 * must not treat that as an error, or the database will refuse +			 * to start up. +			 */ +			if (InArchiveRecovery) +				ereport(FATAL, +						(errmsg("WAL ends before consistent recovery point"))); +		}  	}  	/* @@ -7910,7 +7926,8 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)  		 * record, the backup was cancelled and the end-of-backup record will  		 * never arrive.  		 */ -		if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint)) +		if (InArchiveRecovery && +			!XLogRecPtrIsInvalid(ControlFile->backupStartPoint))  			ereport(ERROR,  					(errmsg("online backup was cancelled, recovery cannot continue"))); | 
