1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-29 10:41:53 +03:00

Write a WAL record whenever we perform an operation without WAL-logging

that would've been WAL-logged if archiving was enabled. If we encounter
such records in archive recovery anyway, we know that some data is
missing from the log. A WARNING is emitted in that case.

Original patch by Fujii Masao, with changes by me.
This commit is contained in:
Heikki Linnakangas
2010-01-20 19:43:40 +00:00
parent 47ce95a7b9
commit 09b115f706
7 changed files with 100 additions and 7 deletions

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.358 2010/01/15 09:19:00 heikki Exp $
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.359 2010/01/20 19:43:40 heikki Exp $
*
*-------------------------------------------------------------------------
*/
@ -7561,6 +7561,31 @@ RequestXLogSwitch(void)
return RecPtr;
}
/*
* Write an XLOG UNLOGGED record, indicating that some operation was
* performed on data that we fsync()'d directly to disk, skipping
* WAL-logging.
*
* Such operations screw up archive recovery, so we complain if we see
* these records during archive recovery. That shouldn't happen in a
* correctly configured server, but you can induce it by temporarily
* disabling archiving and restarting, so it's good to at least get a
* warning of silent data loss in such cases. These records serve no
* other purpose and are simply ignored during crash recovery.
*/
void
XLogReportUnloggedStatement(char *reason)
{
XLogRecData rdata;
rdata.buffer = InvalidBuffer;
rdata.data = reason;
rdata.len = strlen(reason) + 1;
rdata.next = NULL;
XLogInsert(RM_XLOG_ID, XLOG_UNLOGGED, &rdata);
}
/*
* XLOG resource manager's routines
*
@ -7703,6 +7728,19 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
LWLockRelease(ControlFileLock);
}
}
else if (info == XLOG_UNLOGGED)
{
if (InArchiveRecovery)
{
/*
* Note: We don't print the reason string from the record,
* because that gets added as a line using xlog_desc()
*/
ereport(WARNING,
(errmsg("unlogged operation performed, data may be missing"),
errhint("This can happen if you temporarily disable archive_mode without taking a new base backup.")));
}
}
}
void
@ -7752,6 +7790,12 @@ xlog_desc(StringInfo buf, uint8 xl_info, char *rec)
appendStringInfo(buf, "backup end: %X/%X",
startpoint.xlogid, startpoint.xrecoff);
}
else if (info == XLOG_UNLOGGED)
{
char *reason = rec;
appendStringInfo(buf, "unlogged operation: %s", reason);
}
else
appendStringInfo(buf, "UNKNOWN");
}