aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-04-29 21:49:03 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2010-04-29 21:49:03 +0000
commit69f7a4d8e322f7f93d1c6d91c7eabd9d5925a401 (patch)
tree535568f07481358e3377b2f608e9dba6707529e5 /src/backend/access/transam/xlog.c
parentf0488bd57c3745b5dbed80e884ee5452e77314c9 (diff)
downloadpostgresql-69f7a4d8e322f7f93d1c6d91c7eabd9d5925a401.tar.gz
postgresql-69f7a4d8e322f7f93d1c6d91c7eabd9d5925a401.zip
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.
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 95c3c3a7d0a..61dfb20117f 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -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.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"),
errhint("WAL control functions cannot be executed during recovery.")));
- if (!XLogArchivingActive())
- ereport(ERROR,
- (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
- errmsg("WAL archiving is not active"),
- errhint("archive_mode must be enabled at server start.")));
-
- if (!XLogArchiveCommandSet())
+ if (!XLogIsNeeded())
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.")));
+ errmsg("WAL level not sufficient for making an online backup"),
+ errhint("wal_level must be set to \"archive\" or \"hot_standby\" at server start.")));
backupidstr = text_to_cstring(backupid);
@@ -8404,11 +8397,11 @@ pg_stop_backup(PG_FUNCTION_ARGS)
errmsg("recovery is in progress"),
errhint("WAL control functions cannot be executed during recovery.")));
- if (!XLogArchivingActive())
+ if (!XLogIsNeeded())
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
- errmsg("WAL archiving is not active"),
- errhint("archive_mode must be enabled at server start.")));
+ errmsg("WAL level not sufficient for making an online backup"),
+ errhint("wal_level must be set to \"archive\" or \"hot_standby\" at server start.")));
/*
* OK to clear forcePageWrites
@@ -8516,16 +8509,26 @@ pg_stop_backup(PG_FUNCTION_ARGS)
CleanupBackupHistory();
/*
- * Wait until both the last WAL file filled during backup and the history
- * file have been archived. We assume that the alphabetic sorting
- * property of the WAL files ensures any earlier WAL files are safely
- * archived as well.
+ * If archiving is enabled, wait for all the required WAL files to be
+ * archived before returning. If archiving isn't enabled, the required
+ * WAL needs to be transported via streaming replication (hopefully
+ * 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
* 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
* issued to clue in anyone who might be doing this interactively.
*/
+ if (XLogArchivingActive())
+ {
XLByteToPrevSeg(stoppoint, _logId, _logSeg);
XLogFileName(lastxlogfilename, ThisTimeLineID, _logId, _logSeg);
@@ -8564,6 +8567,10 @@ pg_stop_backup(PG_FUNCTION_ARGS)
ereport(NOTICE,
(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.