Adjust error checks in pg_start_backup and pg_stop_backup to make it possible

to perform a backup without archive_mode being enabled.  This gives up some
user-error protection in order to improve usefulness for streaming-replication
scenarios.  Per discussion.
This commit is contained in:
Tom Lane 2010-04-29 21:49:03 +00:00
parent f0488bd57c
commit 69f7a4d8e3
2 changed files with 27 additions and 19 deletions

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/backup.sgml,v 2.153 2010/04/28 16:10:39 heikki Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/backup.sgml,v 2.154 2010/04/29 21:49:03 tgl Exp $ -->
<chapter id="backup"> <chapter id="backup">
<title>Backup and Restore</title> <title>Backup and Restore</title>
@ -779,6 +779,7 @@ SELECT pg_stop_backup();
Once the WAL segment files active during the backup are archived, you are Once the WAL segment files active during the backup are archived, you are
done. The file identified by <function>pg_stop_backup</>'s result is done. The file identified by <function>pg_stop_backup</>'s result is
the last segment that is required to form a complete set of backup files. the last segment that is required to form a complete set of backup files.
If <varname>archive_mode</> is enabled,
<function>pg_stop_backup</> does not return until the last segment has <function>pg_stop_backup</> does not return until the last segment has
been archived. been archived.
Archiving of these files happens automatically since you have Archiving of these files happens automatically since you have

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.406 2010/04/29 21:36:19 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.407 2010/04/29 21:49:03 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -8205,18 +8205,11 @@ pg_start_backup(PG_FUNCTION_ARGS)
errmsg("recovery is in progress"), errmsg("recovery is in progress"),
errhint("WAL control functions cannot be executed during recovery."))); errhint("WAL control functions cannot be executed during recovery.")));
if (!XLogArchivingActive()) if (!XLogIsNeeded())
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("WAL archiving is not active"), errmsg("WAL level not sufficient for making an online backup"),
errhint("archive_mode must be enabled at server start."))); errhint("wal_level must be set to \"archive\" or \"hot_standby\" at server start.")));
if (!XLogArchiveCommandSet())
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("WAL archiving is not active"),
errhint("archive_command must be defined before "
"online backups can be made safely.")));
backupidstr = text_to_cstring(backupid); backupidstr = text_to_cstring(backupid);
@ -8404,11 +8397,11 @@ pg_stop_backup(PG_FUNCTION_ARGS)
errmsg("recovery is in progress"), errmsg("recovery is in progress"),
errhint("WAL control functions cannot be executed during recovery."))); errhint("WAL control functions cannot be executed during recovery.")));
if (!XLogArchivingActive()) if (!XLogIsNeeded())
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("WAL archiving is not active"), errmsg("WAL level not sufficient for making an online backup"),
errhint("archive_mode must be enabled at server start."))); errhint("wal_level must be set to \"archive\" or \"hot_standby\" at server start.")));
/* /*
* OK to clear forcePageWrites * OK to clear forcePageWrites
@ -8516,16 +8509,26 @@ pg_stop_backup(PG_FUNCTION_ARGS)
CleanupBackupHistory(); CleanupBackupHistory();
/* /*
* Wait until both the last WAL file filled during backup and the history * If archiving is enabled, wait for all the required WAL files to be
* file have been archived. We assume that the alphabetic sorting * archived before returning. If archiving isn't enabled, the required
* property of the WAL files ensures any earlier WAL files are safely * WAL needs to be transported via streaming replication (hopefully
* archived as well. * with wal_keep_segments set high enough), or some more exotic
* mechanism like polling and copying files from pg_xlog with script.
* We have no knowledge of those mechanisms, so it's up to the user to
* ensure that he gets all the required WAL.
*
* We wait until both the last WAL file filled during backup and the
* history file have been archived, and assume that the alphabetic
* sorting property of the WAL files ensures any earlier WAL files are
* safely archived as well.
* *
* We wait forever, since archive_command is supposed to work and we * We wait forever, since archive_command is supposed to work and we
* assume the admin wanted his backup to work completely. If you don't * assume the admin wanted his backup to work completely. If you don't
* wish to wait, you can set statement_timeout. Also, some notices are * wish to wait, you can set statement_timeout. Also, some notices are
* issued to clue in anyone who might be doing this interactively. * issued to clue in anyone who might be doing this interactively.
*/ */
if (XLogArchivingActive())
{
XLByteToPrevSeg(stoppoint, _logId, _logSeg); XLByteToPrevSeg(stoppoint, _logId, _logSeg);
XLogFileName(lastxlogfilename, ThisTimeLineID, _logId, _logSeg); XLogFileName(lastxlogfilename, ThisTimeLineID, _logId, _logSeg);
@ -8564,6 +8567,10 @@ pg_stop_backup(PG_FUNCTION_ARGS)
ereport(NOTICE, ereport(NOTICE,
(errmsg("pg_stop_backup complete, all required WAL segments have been archived"))); (errmsg("pg_stop_backup complete, all required WAL segments have been archived")));
}
else
ereport(NOTICE,
(errmsg("WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup")));
/* /*
* We're done. As a convenience, return the ending WAL location. * We're done. As a convenience, return the ending WAL location.