Skip to content

Commit 673a30f

Browse files
committed
Add a pg_dump option --lock-wait-timeout to allow failing the dump if unable
to acquire shared table locks within a specified amount of time. David Gould
1 parent b133ceb commit 673a30f

File tree

2 files changed

+88
-47
lines changed

2 files changed

+88
-47
lines changed

doc/src/sgml/ref/pg_dump.sgml

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!--
2-
$PostgreSQL: pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.102 2008/04/13 03:49:21 tgl Exp $
2+
$PostgreSQL: pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.103 2008/07/20 18:43:30 tgl Exp $
33
PostgreSQL documentation
44
-->
55

@@ -415,23 +415,6 @@ PostgreSQL documentation
415415
</listitem>
416416
</varlistentry>
417417

418-
<varlistentry>
419-
<term><option>--no-tablespaces</option></term>
420-
<listitem>
421-
<para>
422-
Do not output commands to select tablespaces.
423-
With this option, all objects will be created in whichever
424-
tablespace is the default during restore.
425-
</para>
426-
427-
<para>
428-
This option is only meaningful for the plain-text format. For
429-
the archive formats, you can specify the option when you
430-
call <command>pg_restore</command>.
431-
</para>
432-
</listitem>
433-
</varlistentry>
434-
435418
<varlistentry>
436419
<term><option>-s</option></term>
437420
<term><option>--schema-only</option></term>
@@ -550,15 +533,27 @@ PostgreSQL documentation
550533
</listitem>
551534
</varlistentry>
552535

536+
<varlistentry>
537+
<term><option>-Z <replaceable class="parameter">0..9</replaceable></option></term>
538+
<term><option>--compress=<replaceable class="parameter">0..9</replaceable></option></term>
539+
<listitem>
540+
<para>
541+
Specify the compression level to use in archive formats that
542+
support compression. (Currently only the custom archive
543+
format supports compression.)
544+
</para>
545+
</listitem>
546+
</varlistentry>
547+
553548
<varlistentry>
554549
<term><option>--disable-dollar-quoting</></term>
555550
<listitem>
556551
<para>
557552
This option disables the use of dollar quoting for function bodies,
558553
and forces them to be quoted using SQL standard string syntax.
559554
</para>
560-
</listitem>
561-
</varlistentry>
555+
</listitem>
556+
</varlistentry>
562557

563558
<varlistentry>
564559
<term><option>--disable-triggers</></term>
@@ -587,6 +582,39 @@ PostgreSQL documentation
587582
</listitem>
588583
</varlistentry>
589584

585+
<varlistentry>
586+
<term><option>--lock-wait-timeout=<replaceable class="parameter">timeout</replaceable></option></term>
587+
<listitem>
588+
<para>
589+
Do not wait forever to acquire shared table locks at the beginning of
590+
the dump. Instead fail if unable to lock a table within the specified
591+
<replaceable class="parameter">timeout</>. The timeout may be
592+
specified in any of the formats accepted by <command>SET
593+
statement_timeout</>. (Allowed values vary depending on the server
594+
version you are dumping from, but an integer number of milliseconds
595+
is accepted by all versions since 7.3. This option is ignored when
596+
dumping from a pre-7.3 server.)
597+
</para>
598+
</listitem>
599+
</varlistentry>
600+
601+
<varlistentry>
602+
<term><option>--no-tablespaces</option></term>
603+
<listitem>
604+
<para>
605+
Do not output commands to select tablespaces.
606+
With this option, all objects will be created in whichever
607+
tablespace is the default during restore.
608+
</para>
609+
610+
<para>
611+
This option is only meaningful for the plain-text format. For
612+
the archive formats, you can specify the option when you
613+
call <command>pg_restore</command>.
614+
</para>
615+
</listitem>
616+
</varlistentry>
617+
590618
<varlistentry>
591619
<term><option>--use-set-session-authorization</></term>
592620
<listitem>
@@ -601,18 +629,6 @@ PostgreSQL documentation
601629
</para>
602630
</listitem>
603631
</varlistentry>
604-
605-
<varlistentry>
606-
<term><option>-Z <replaceable class="parameter">0..9</replaceable></option></term>
607-
<term><option>--compress=<replaceable class="parameter">0..9</replaceable></option></term>
608-
<listitem>
609-
<para>
610-
Specify the compression level to use in archive formats that
611-
support compression. (Currently only the custom archive
612-
format supports compression.)
613-
</para>
614-
</listitem>
615-
</varlistentry>
616632
</variablelist>
617633
</para>
618634

@@ -663,7 +679,7 @@ PostgreSQL documentation
663679
<listitem>
664680
<para>
665681
Force <application>pg_dump</application> to prompt for a
666-
password before connecting to a database.
682+
password before connecting to a database.
667683
</para>
668684

669685
<para>

src/bin/pg_dump/pg_dump.c

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* by PostgreSQL
1313
*
1414
* IDENTIFICATION
15-
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.496 2008/07/18 03:32:52 tgl Exp $
15+
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.497 2008/07/20 18:43:30 tgl Exp $
1616
*
1717
*-------------------------------------------------------------------------
1818
*/
@@ -71,6 +71,7 @@ bool attrNames; /* put attr names into insert strings */
7171
bool schemaOnly;
7272
bool dataOnly;
7373
bool aclsSkip;
74+
const char *lockWaitTimeout;
7475

7576
/* subquery used to convert user ID (eg, datdba) to user name */
7677
static const char *username_subquery;
@@ -264,6 +265,7 @@ main(int argc, char **argv)
264265
*/
265266
{"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1},
266267
{"disable-triggers", no_argument, &disable_triggers, 1},
268+
{"lock-wait-timeout", required_argument, NULL, 2},
267269
{"no-tablespaces", no_argument, &outputNoTablespaces, 1},
268270
{"use-set-session-authorization", no_argument, &use_setsessauth, 1},
269271

@@ -279,6 +281,7 @@ main(int argc, char **argv)
279281
strcpy(g_opaque_type, "opaque");
280282

281283
dataOnly = schemaOnly = dumpInserts = attrNames = false;
284+
lockWaitTimeout = NULL;
282285

283286
progname = get_progname(argv[0]);
284287

@@ -437,6 +440,11 @@ main(int argc, char **argv)
437440
/* This covers the long options equivalent to -X xxx. */
438441
break;
439442

443+
case 2:
444+
/* lock-wait-timeout */
445+
lockWaitTimeout = optarg;
446+
break;
447+
440448
default:
441449
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
442450
exit(1);
@@ -754,12 +762,13 @@ help(const char *progname)
754762
printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
755763

756764
printf(_("\nGeneral options:\n"));
757-
printf(_(" -f, --file=FILENAME output file name\n"));
758-
printf(_(" -F, --format=c|t|p output file format (custom, tar, plain text)\n"));
759-
printf(_(" -v, --verbose verbose mode\n"));
760-
printf(_(" -Z, --compress=0-9 compression level for compressed formats\n"));
761-
printf(_(" --help show this help, then exit\n"));
762-
printf(_(" --version output version information, then exit\n"));
765+
printf(_(" -f, --file=FILENAME output file name\n"));
766+
printf(_(" -F, --format=c|t|p output file format (custom, tar, plain text)\n"));
767+
printf(_(" -v, --verbose verbose mode\n"));
768+
printf(_(" -Z, --compress=0-9 compression level for compressed formats\n"));
769+
printf(_(" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"));
770+
printf(_(" --help show this help, then exit\n"));
771+
printf(_(" --version output version information, then exit\n"));
763772

764773
printf(_("\nOptions controlling the output content:\n"));
765774
printf(_(" -a, --data-only dump only the data, not the schema\n"));
@@ -2957,8 +2966,6 @@ getTables(int *numTables)
29572966
int ntups;
29582967
int i;
29592968
PQExpBuffer query = createPQExpBuffer();
2960-
PQExpBuffer delqry = createPQExpBuffer();
2961-
PQExpBuffer lockquery = createPQExpBuffer();
29622969
TableInfo *tblinfo;
29632970
int i_reltableoid;
29642971
int i_reloid;
@@ -3192,6 +3199,21 @@ getTables(int *numTables)
31923199
i_reltablespace = PQfnumber(res, "reltablespace");
31933200
i_reloptions = PQfnumber(res, "reloptions");
31943201

3202+
if (lockWaitTimeout && g_fout->remoteVersion >= 70300)
3203+
{
3204+
/*
3205+
* Arrange to fail instead of waiting forever for a table lock.
3206+
*
3207+
* NB: this coding assumes that the only queries issued within
3208+
* the following loop are LOCK TABLEs; else the timeout may be
3209+
* undesirably applied to other things too.
3210+
*/
3211+
resetPQExpBuffer(query);
3212+
appendPQExpBuffer(query, "SET statement_timeout = ");
3213+
appendStringLiteralConn(query, lockWaitTimeout, g_conn);
3214+
do_sql_command(g_conn, query->data);
3215+
}
3216+
31953217
for (i = 0; i < ntups; i++)
31963218
{
31973219
tblinfo[i].dobj.objType = DO_TABLE;
@@ -3246,12 +3268,12 @@ getTables(int *numTables)
32463268
*/
32473269
if (tblinfo[i].dobj.dump && tblinfo[i].relkind == RELKIND_RELATION)
32483270
{
3249-
resetPQExpBuffer(lockquery);
3250-
appendPQExpBuffer(lockquery,
3271+
resetPQExpBuffer(query);
3272+
appendPQExpBuffer(query,
32513273
"LOCK TABLE %s IN ACCESS SHARE MODE",
32523274
fmtQualifiedId(tblinfo[i].dobj.namespace->dobj.name,
32533275
tblinfo[i].dobj.name));
3254-
do_sql_command(g_conn, lockquery->data);
3276+
do_sql_command(g_conn, query->data);
32553277
}
32563278

32573279
/* Emit notice if join for owner failed */
@@ -3260,6 +3282,11 @@ getTables(int *numTables)
32603282
tblinfo[i].dobj.name);
32613283
}
32623284

3285+
if (lockWaitTimeout && g_fout->remoteVersion >= 70300)
3286+
{
3287+
do_sql_command(g_conn, "SET statement_timeout = 0");
3288+
}
3289+
32633290
PQclear(res);
32643291

32653292
/*
@@ -3292,8 +3319,6 @@ getTables(int *numTables)
32923319
}
32933320

32943321
destroyPQExpBuffer(query);
3295-
destroyPQExpBuffer(delqry);
3296-
destroyPQExpBuffer(lockquery);
32973322

32983323
return tblinfo;
32993324
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy