Commit 38706095 authored by Tom Lane's avatar Tom Lane

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.
parent 80df9c49
<!-- $PostgreSQL: pgsql/doc/src/sgml/backup.sgml,v 2.123 2009/03/05 19:50:03 tgl Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/backup.sgml,v 2.124 2009/04/07 00:31:25 tgl Exp $ -->
<chapter id="backup"> <chapter id="backup">
<title>Backup and Restore</title> <title>Backup and Restore</title>
...@@ -730,19 +730,19 @@ SELECT pg_start_backup('label'); ...@@ -730,19 +730,19 @@ SELECT pg_start_backup('label');
</para> </para>
<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 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 period of time, by default half your inter-checkpoint interval
(see the configuration parameter (see the configuration parameter
<xref linkend="guc-checkpoint-completion-target">). Usually <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 processing. If you just want to start the backup as soon as
possible, execute a <command>CHECKPOINT</> command possible, use:
(which performs a checkpoint as quickly as possible) and then <programlisting>
immediately execute <function>pg_start_backup</>. Then there SELECT pg_start_backup('label', true);
will be very little for <function>pg_start_backup</>'s checkpoint </programlisting>
to do, and it won't take long. This forces the checkpoint to be done as quickly as possible.
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
......
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.474 2009/04/01 03:32:29 tgl Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.475 2009/04/07 00:31:25 tgl Exp $ -->
<chapter id="functions"> <chapter id="functions">
<title>Functions and Operators</title> <title>Functions and Operators</title>
...@@ -12880,10 +12880,10 @@ SELECT set_config('log_statement_stats', 'off', false); ...@@ -12880,10 +12880,10 @@ SELECT set_config('log_statement_stats', 'off', false);
<tbody> <tbody>
<row> <row>
<entry> <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>
<entry><type>text</type></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>
<row> <row>
<entry> <entry>
...@@ -12932,13 +12932,14 @@ SELECT set_config('log_statement_stats', 'off', false); ...@@ -12932,13 +12932,14 @@ SELECT set_config('log_statement_stats', 'off', false);
</table> </table>
<para> <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 arbitrary user-defined label for the backup. (Typically this would be
the name under which the backup dump file will be stored.) The function 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, 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 performs a checkpoint,
need not pay any attention to this result value, but it is provided in and then returns the backup's starting transaction log location as text.
case it is of use. The user need not pay any attention to this result value, but it is
provided in case it is of use.
<programlisting> <programlisting>
postgres=# select pg_start_backup('label_goes_here'); postgres=# select pg_start_backup('label_goes_here');
pg_start_backup pg_start_backup
...@@ -12946,6 +12947,10 @@ postgres=# select pg_start_backup('label_goes_here'); ...@@ -12946,6 +12947,10 @@ postgres=# select pg_start_backup('label_goes_here');
0/D4445B8 0/D4445B8
(1 row) (1 row)
</programlisting> </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>
<para> <para>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2009, 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.334 2009/03/11 23:19:24 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.335 2009/04/07 00:31:26 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -6914,6 +6914,7 @@ Datum ...@@ -6914,6 +6914,7 @@ Datum
pg_start_backup(PG_FUNCTION_ARGS) pg_start_backup(PG_FUNCTION_ARGS)
{ {
text *backupid = PG_GETARG_TEXT_P(0); text *backupid = PG_GETARG_TEXT_P(0);
bool fast = PG_GETARG_BOOL(1);
char *backupidstr; char *backupidstr;
XLogRecPtr checkpointloc; XLogRecPtr checkpointloc;
XLogRecPtr startpoint; XLogRecPtr startpoint;
...@@ -6983,9 +6984,11 @@ pg_start_backup(PG_FUNCTION_ARGS) ...@@ -6983,9 +6984,11 @@ pg_start_backup(PG_FUNCTION_ARGS)
* have different checkpoint positions and hence different history * have different checkpoint positions and hence different history
* file names, even if nothing happened in between. * 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 * Now we need to fetch the checkpoint record location, and also its
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright (c) 1996-2009, PostgreSQL Global Development Group * Copyright (c) 1996-2009, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.59 2009/02/06 21:15:11 tgl Exp $ * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.60 2009/04/07 00:31:26 tgl Exp $
*/ */
CREATE VIEW pg_roles AS CREATE VIEW pg_roles AS
...@@ -403,6 +403,12 @@ CREATE VIEW pg_user_mappings AS ...@@ -403,6 +403,12 @@ CREATE VIEW pg_user_mappings AS
REVOKE ALL on pg_user_mapping FROM public; 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 -- Tsearch debug function. Defined here because it'd be pretty unwieldy
-- to put it into pg_proc.h -- to put it into pg_proc.h
...@@ -464,3 +470,16 @@ LANGUAGE SQL STRICT STABLE; ...@@ -464,3 +470,16 @@ LANGUAGE SQL STRICT STABLE;
COMMENT ON FUNCTION ts_debug(text) IS COMMENT ON FUNCTION ts_debug(text) IS
'debug function for current text search configuration'; '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';
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2009, 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/include/catalog/catversion.h,v 1.528 2009/04/05 22:28:59 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.529 2009/04/07 00:31:26 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200904051 #define CATALOG_VERSION_NO 200904061
#endif #endif
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2009, 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/include/catalog/pg_proc.h,v 1.540 2009/04/05 22:28:59 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.541 2009/04/07 00:31:26 tgl Exp $
* *
* NOTES * NOTES
* The script catalog/genbki.sh reads this file and generates .bki * The script catalog/genbki.sh reads this file and generates .bki
...@@ -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 ...@@ -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"); 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_ )); 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"); 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"); 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_ )); 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"); DESCR("finish taking an online backup");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment