summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2009-04-07 00:31:26 +0000
committerTom Lane2009-04-07 00:31:26 +0000
commit40629f3ad3bd0d36fa94de9bfa2f9d220f27fbbc (patch)
tree8bf0ec55d97f9ef75d7520eec940e339f1e08a3c
parent67644c48066d6308b28fd6e93163b00d4387197e (diff)
Add an optional parameter to pg_start_backup() that specifies whether to do
the checkpoint in immediate or lazy mode. This is to address complaints that pg_start_backup() takes a long time even when there's no need to minimize its I/O consumption.
-rw-r--r--doc/src/sgml/backup.sgml20
-rw-r--r--doc/src/sgml/func.sgml19
-rw-r--r--src/backend/access/transam/xlog.c7
-rw-r--r--src/backend/catalog/system_views.sql19
-rw-r--r--src/include/catalog/catversion.h2
-rw-r--r--src/include/catalog/pg_proc.h2
6 files changed, 48 insertions, 21 deletions
diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml
index 02545f15af..062b872769 100644
--- a/doc/src/sgml/backup.sgml
+++ b/doc/src/sgml/backup.sgml
@@ -730,19 +730,19 @@ SELECT pg_start_backup('label');
</para>
<para>
- <function>pg_start_backup</> can take a long time to finish.
+ By default, <function>pg_start_backup</> can take a long time to finish.
This is because it performs a checkpoint, and the I/O
- required for a checkpoint will be spread out over a significant
+ required for the checkpoint will be spread out over a significant
period of time, by default half your inter-checkpoint interval
(see the configuration parameter
<xref linkend="guc-checkpoint-completion-target">). Usually
- this is what you want because it minimizes the impact on query
+ this is what you want, because it minimizes the impact on query
processing. If you just want to start the backup as soon as
- possible, execute a <command>CHECKPOINT</> command
- (which performs a checkpoint as quickly as possible) and then
- immediately execute <function>pg_start_backup</>. Then there
- will be very little for <function>pg_start_backup</>'s checkpoint
- to do, and it won't take long.
+ possible, use:
+<programlisting>
+SELECT pg_start_backup('label', true);
+</programlisting>
+ This forces the checkpoint to be done as quickly as possible.
</para>
</listitem>
<listitem>
@@ -769,9 +769,9 @@ SELECT pg_stop_backup();
<para>
Once the WAL segment files used during the backup are archived, you are
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.
<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
already configured <varname>archive_command</>. In most cases this
happens quickly, but you are advised to monitor your archive
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index ab34b844bf..3075d510bc 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -12880,10 +12880,10 @@ SELECT set_config('log_statement_stats', 'off', false);
<tbody>
<row>
<entry>
- <literal><function>pg_start_backup</function>(<parameter>label</> <type>text</>)</literal>
+ <literal><function>pg_start_backup</function>(<parameter>label</> <type>text</> <optional>, <parameter>fast</> <type>boolean</> </optional>)</literal>
</entry>
<entry><type>text</type></entry>
- <entry>Set up for performing on-line backup</entry>
+ <entry>Prepare for performing on-line backup</entry>
</row>
<row>
<entry>
@@ -12932,13 +12932,14 @@ SELECT set_config('log_statement_stats', 'off', false);
</table>
<para>
- <function>pg_start_backup</> accepts a single parameter which is an
+ <function>pg_start_backup</> accepts a text parameter which is an
arbitrary user-defined label for the backup. (Typically this would be
the name under which the backup dump file will be stored.) The function
writes a backup label file into the database cluster's data directory,
- and then returns the backup's starting transaction log location as text. The user
- need not pay any attention to this result value, but it is provided in
- case it is of use.
+ performs a checkpoint,
+ and then returns the backup's starting transaction log location as text.
+ The user need not pay any attention to this result value, but it is
+ provided in case it is of use.
<programlisting>
postgres=# select pg_start_backup('label_goes_here');
pg_start_backup
@@ -12946,6 +12947,10 @@ postgres=# select pg_start_backup('label_goes_here');
0/D4445B8
(1 row)
</programlisting>
+ There is an optional boolean second parameter. If <literal>true</>,
+ it specifies executing <function>pg_start_backup</> as quickly as
+ possible. This forces an immediate checkpoint which will cause a
+ spike in I/O operations, slowing any concurrently executing queries.
</para>
<para>
@@ -12961,7 +12966,7 @@ postgres=# select pg_start_backup('label_goes_here');
</para>
<para>
- <function>pg_switch_xlog</> moves to the next transaction log file, allowing the
+ <function>pg_switch_xlog</> moves to the next transaction log file, allowing the
current file to be archived (assuming you are using continuous archiving).
The result is the ending transaction log location + 1 within the just-completed transaction log file.
If there has been no transaction log activity since the last transaction log switch,
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index d1ea169d21..2fc935a1fb 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6914,6 +6914,7 @@ Datum
pg_start_backup(PG_FUNCTION_ARGS)
{
text *backupid = PG_GETARG_TEXT_P(0);
+ bool fast = PG_GETARG_BOOL(1);
char *backupidstr;
XLogRecPtr checkpointloc;
XLogRecPtr startpoint;
@@ -6983,9 +6984,11 @@ pg_start_backup(PG_FUNCTION_ARGS)
* have different checkpoint positions and hence different history
* file names, even if nothing happened in between.
*
- * We don't use CHECKPOINT_IMMEDIATE, hence this can take awhile.
+ * We use CHECKPOINT_IMMEDIATE only if requested by user (via
+ * passing fast = true). Otherwise this can take awhile.
*/
- RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT);
+ RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT |
+ (fast ? CHECKPOINT_IMMEDIATE : 0));
/*
* Now we need to fetch the checkpoint record location, and also its
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index bb6299b703..67188ded10 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -403,6 +403,12 @@ CREATE VIEW pg_user_mappings AS
REVOKE ALL on pg_user_mapping FROM public;
+--
+-- We have a few function definitions in here, too.
+-- At some point there might be enough to justify breaking them out into
+-- a separate "system_functions.sql" file.
+--
+
-- Tsearch debug function. Defined here because it'd be pretty unwieldy
-- to put it into pg_proc.h
@@ -464,3 +470,16 @@ LANGUAGE SQL STRICT STABLE;
COMMENT ON FUNCTION ts_debug(text) IS
'debug function for current text search configuration';
+
+--
+-- Redeclare built-in functions that need default values attached to their
+-- arguments. It's impractical to set those up directly in pg_proc.h because
+-- of the complexity and platform-dependency of the expression tree
+-- representation. (Note that internal functions still have to have entries
+-- in pg_proc.h; we are merely causing their proargnames and proargdefaults
+-- to get filled in.)
+--
+
+CREATE OR REPLACE FUNCTION
+ pg_start_backup(label text, fast boolean DEFAULT false)
+ RETURNS text STRICT VOLATILE LANGUAGE internal AS 'pg_start_backup';
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 05305b7dff..cd9f52bc5a 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 200904051
+#define CATALOG_VERSION_NO 200904061
#endif
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 1f4ecb038b..28d3a52804 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -3252,7 +3252,7 @@ DATA(insert OID = 2171 ( pg_cancel_backend PGNSP PGUID 12 1 0 0 f f f t f v 1 0
DESCR("cancel a server process' current query");
DATA(insert OID = 2096 ( pg_terminate_backend PGNSP PGUID 12 1 0 0 f f f t f v 1 0 16 "23" _null_ _null_ _null_ _null_ pg_terminate_backend _null_ _null_ _null_ ));
DESCR("terminate a server process");
-DATA(insert OID = 2172 ( pg_start_backup PGNSP PGUID 12 1 0 0 f f f t f v 1 0 25 "25" _null_ _null_ _null_ _null_ pg_start_backup _null_ _null_ _null_ ));
+DATA(insert OID = 2172 ( pg_start_backup PGNSP PGUID 12 1 0 0 f f f t f v 2 0 25 "25 16" _null_ _null_ _null_ _null_ pg_start_backup _null_ _null_ _null_ ));
DESCR("prepare for taking an online backup");
DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
DESCR("finish taking an online backup");