]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Add a pg_dump option --lock-wait-timeout to allow failing the dump if unable
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 20 Jul 2008 18:43:30 +0000 (18:43 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 20 Jul 2008 18:43:30 +0000 (18:43 +0000)
to acquire shared table locks within a specified amount of time.

David Gould

doc/src/sgml/ref/pg_dump.sgml
src/bin/pg_dump/pg_dump.c

index e7889f04625eac63234fe0ae071040e90277728c..c8aae47b6f043dd495f65112030a2300d1bab518 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.102 2008/04/13 03:49:21 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.103 2008/07/20 18:43:30 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -415,23 +415,6 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
-     <varlistentry>
-      <term><option>--no-tablespaces</option></term>
-      <listitem>
-       <para>
-        Do not output commands to select tablespaces.
-        With this option, all objects will be created in whichever
-        tablespace is the default during restore.
-       </para>
-
-       <para>
-        This option is only meaningful for the plain-text format.  For
-        the archive formats, you can specify the option when you
-        call <command>pg_restore</command>.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry>
       <term><option>-s</option></term>
       <term><option>--schema-only</option></term>
@@ -550,6 +533,18 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>-Z <replaceable class="parameter">0..9</replaceable></option></term>
+      <term><option>--compress=<replaceable class="parameter">0..9</replaceable></option></term>
+      <listitem>
+       <para>
+        Specify the compression level to use in archive formats that
+        support compression.  (Currently only the custom archive
+        format supports compression.)
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>--disable-dollar-quoting</></term>
       <listitem>
@@ -557,8 +552,8 @@ PostgreSQL documentation
         This option disables the use of dollar quoting for function bodies,
         and forces them to be quoted using SQL standard string syntax.
        </para>
-     </listitem>
-    </varlistentry>
+      </listitem>
+     </varlistentry>
 
      <varlistentry>
       <term><option>--disable-triggers</></term>
@@ -587,6 +582,39 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--lock-wait-timeout=<replaceable class="parameter">timeout</replaceable></option></term>
+      <listitem>
+       <para>
+        Do not wait forever to acquire shared table locks at the beginning of
+        the dump. Instead fail if unable to lock a table within the specified
+        <replaceable class="parameter">timeout</>. The timeout may be
+        specified in any of the formats accepted by <command>SET
+        statement_timeout</>.  (Allowed values vary depending on the server
+        version you are dumping from, but an integer number of milliseconds
+        is accepted by all versions since 7.3.  This option is ignored when
+        dumping from a pre-7.3 server.)
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term><option>--no-tablespaces</option></term>
+      <listitem>
+       <para>
+        Do not output commands to select tablespaces.
+        With this option, all objects will be created in whichever
+        tablespace is the default during restore.
+       </para>
+
+       <para>
+        This option is only meaningful for the plain-text format.  For
+        the archive formats, you can specify the option when you
+        call <command>pg_restore</command>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>--use-set-session-authorization</></term>
       <listitem>
@@ -601,18 +629,6 @@ PostgreSQL documentation
        </para>
       </listitem>
      </varlistentry>
-
-     <varlistentry>
-      <term><option>-Z <replaceable class="parameter">0..9</replaceable></option></term>
-      <term><option>--compress=<replaceable class="parameter">0..9</replaceable></option></term>
-      <listitem>
-       <para>
-        Specify the compression level to use in archive formats that
-        support compression.  (Currently only the custom archive
-        format supports compression.)
-       </para>
-      </listitem>
-     </varlistentry>
     </variablelist>
    </para>
 
@@ -663,7 +679,7 @@ PostgreSQL documentation
       <listitem>
        <para>
         Force <application>pg_dump</application> to prompt for a
-        password before connecting to a database.  
+        password before connecting to a database.
        </para>
 
        <para>
index 1f09df210996681610ef2c43899a7a32875bfad2..c4a01c55af914cf040d4b324d3f5d62297fef568 100644 (file)
@@ -12,7 +12,7 @@
  *     by PostgreSQL
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.496 2008/07/18 03:32:52 tgl Exp $
+ *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.497 2008/07/20 18:43:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -71,6 +71,7 @@ bool          attrNames;                      /* put attr names into insert strings */
 bool           schemaOnly;
 bool           dataOnly;
 bool           aclsSkip;
+const char *lockWaitTimeout;
 
 /* subquery used to convert user ID (eg, datdba) to user name */
 static const char *username_subquery;
@@ -264,6 +265,7 @@ main(int argc, char **argv)
                 */
                {"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1},
                {"disable-triggers", no_argument, &disable_triggers, 1},
+               {"lock-wait-timeout", required_argument, NULL, 2},
                {"no-tablespaces", no_argument, &outputNoTablespaces, 1},
                {"use-set-session-authorization", no_argument, &use_setsessauth, 1},
 
@@ -279,6 +281,7 @@ main(int argc, char **argv)
        strcpy(g_opaque_type, "opaque");
 
        dataOnly = schemaOnly = dumpInserts = attrNames = false;
+       lockWaitTimeout = NULL;
 
        progname = get_progname(argv[0]);
 
@@ -437,6 +440,11 @@ main(int argc, char **argv)
                                /* This covers the long options equivalent to -X xxx. */
                                break;
 
+                       case 2:
+                               /* lock-wait-timeout */
+                               lockWaitTimeout = optarg;
+                               break;
+
                        default:
                                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
                                exit(1);
@@ -754,12 +762,13 @@ help(const char *progname)
        printf(_("  %s [OPTION]... [DBNAME]\n"), progname);
 
        printf(_("\nGeneral options:\n"));
-       printf(_("  -f, --file=FILENAME      output file name\n"));
-       printf(_("  -F, --format=c|t|p       output file format (custom, tar, plain text)\n"));
-       printf(_("  -v, --verbose            verbose mode\n"));
-       printf(_("  -Z, --compress=0-9       compression level for compressed formats\n"));
-       printf(_("  --help                   show this help, then exit\n"));
-       printf(_("  --version                output version information, then exit\n"));
+       printf(_("  -f, --file=FILENAME         output file name\n"));
+       printf(_("  -F, --format=c|t|p          output file format (custom, tar, plain text)\n"));
+       printf(_("  -v, --verbose               verbose mode\n"));
+       printf(_("  -Z, --compress=0-9          compression level for compressed formats\n"));
+       printf(_("  --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"));
+       printf(_("  --help                      show this help, then exit\n"));
+       printf(_("  --version                   output version information, then exit\n"));
 
        printf(_("\nOptions controlling the output content:\n"));
        printf(_("  -a, --data-only             dump only the data, not the schema\n"));
@@ -2957,8 +2966,6 @@ getTables(int *numTables)
        int                     ntups;
        int                     i;
        PQExpBuffer query = createPQExpBuffer();
-       PQExpBuffer delqry = createPQExpBuffer();
-       PQExpBuffer lockquery = createPQExpBuffer();
        TableInfo  *tblinfo;
        int                     i_reltableoid;
        int                     i_reloid;
@@ -3192,6 +3199,21 @@ getTables(int *numTables)
        i_reltablespace = PQfnumber(res, "reltablespace");
        i_reloptions = PQfnumber(res, "reloptions");
 
+       if (lockWaitTimeout && g_fout->remoteVersion >= 70300)
+       {
+               /*
+                * Arrange to fail instead of waiting forever for a table lock.
+                *
+                * NB: this coding assumes that the only queries issued within
+                * the following loop are LOCK TABLEs; else the timeout may be
+                * undesirably applied to other things too.
+                */
+               resetPQExpBuffer(query);
+               appendPQExpBuffer(query, "SET statement_timeout = ");
+               appendStringLiteralConn(query, lockWaitTimeout, g_conn);
+               do_sql_command(g_conn, query->data);
+       }
+
        for (i = 0; i < ntups; i++)
        {
                tblinfo[i].dobj.objType = DO_TABLE;
@@ -3246,12 +3268,12 @@ getTables(int *numTables)
                 */
                if (tblinfo[i].dobj.dump && tblinfo[i].relkind == RELKIND_RELATION)
                {
-                       resetPQExpBuffer(lockquery);
-                       appendPQExpBuffer(lockquery,
+                       resetPQExpBuffer(query);
+                       appendPQExpBuffer(query,
                                                          "LOCK TABLE %s IN ACCESS SHARE MODE",
                                                 fmtQualifiedId(tblinfo[i].dobj.namespace->dobj.name,
                                                                                tblinfo[i].dobj.name));
-                       do_sql_command(g_conn, lockquery->data);
+                       do_sql_command(g_conn, query->data);
                }
 
                /* Emit notice if join for owner failed */
@@ -3260,6 +3282,11 @@ getTables(int *numTables)
                                          tblinfo[i].dobj.name);
        }
 
+       if (lockWaitTimeout && g_fout->remoteVersion >= 70300)
+       {
+               do_sql_command(g_conn, "SET statement_timeout = 0");
+       }
+
        PQclear(res);
 
        /*
@@ -3292,8 +3319,6 @@ getTables(int *numTables)
        }
 
        destroyPQExpBuffer(query);
-       destroyPQExpBuffer(delqry);
-       destroyPQExpBuffer(lockquery);
 
        return tblinfo;
 }