diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 27683452ea..698434cc5e 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5323,14 +5323,29 @@ StartupXLOG(void) record = ReadCheckpointRecord(checkPointLoc, 0); if (record != NULL) { + memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); ereport(DEBUG1, (errmsg("checkpoint record is at %X/%X", checkPointLoc.xlogid, checkPointLoc.xrecoff))); InRecovery = true; /* force recovery even if SHUTDOWNED */ + + /* + * Make sure that REDO location exists. This may not be + * the case if there was a crash during an online backup, + * which left a backup_label around that references a WAL + * segment that's already been archived. + */ + if (XLByteLT(checkPoint.redo, checkPointLoc)) + { + if (!ReadRecord(&(checkPoint.redo), LOG)) + ereport(FATAL, + (errmsg("could not find redo location referenced by checkpoint record"), + errhint("If you are not restoring from a backup, try removing the file \"%s/backup_label\".", DataDir))); + } } else { - ereport(PANIC, + ereport(FATAL, (errmsg("could not locate required checkpoint record"), errhint("If you are not restoring from a backup, try removing the file \"%s/backup_label\".", DataDir))); } @@ -5366,10 +5381,10 @@ StartupXLOG(void) ereport(PANIC, (errmsg("could not locate a valid checkpoint record"))); } + memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); } LastRec = RecPtr = checkPointLoc; - memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); wasShutdown = (record->xl_info == XLOG_CHECKPOINT_SHUTDOWN); ereport(DEBUG1,