]> granicus.if.org Git - postgresql/commitdiff
Add --xlogdir option to pg_basebackup, for specifying the pg_xlog directory.
authorFujii Masao <fujii@postgresql.org>
Wed, 27 Nov 2013 05:00:16 +0000 (14:00 +0900)
committerFujii Masao <fujii@postgresql.org>
Wed, 27 Nov 2013 05:00:16 +0000 (14:00 +0900)
Haribabu kommi, slightly modified by me.

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

index eb0c1d6f36e50af3f0018c1ebcc1f7acded69bfa..c379df546c61a616e137777214408b2c32c24543 100644 (file)
@@ -202,6 +202,18 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--xlogdir=<replaceable class="parameter">xlogdir</replaceable></option></term>
+      <listitem>
+       <para>
+        Specifies the location for the transaction log directory. 
+        <replaceable>xlogdir</replaceable> must be an absolute path.
+        The transaction log directory can only be specified when
+        the backup is in plain mode.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>-x</option></term>
       <term><option>--xlog</option></term>
index a1e12a8aaa331c400529acbd9cbce66d3c5e6396..6706c0c7a90b701586d7eca8a4e7354aac9074df 100644 (file)
@@ -35,6 +35,7 @@
 
 /* Global options */
 char      *basedir = NULL;
+static char *xlog_dir = "";
 char           format = 'p';           /* p(lain)/t(ar) */
 char      *label = "pg_basebackup base backup";
 bool           showprogress = false;
@@ -115,6 +116,7 @@ usage(void)
        printf(_("  -x, --xlog             include required WAL files in backup (fetch mode)\n"));
        printf(_("  -X, --xlog-method=fetch|stream\n"
                         "                         include required WAL files with specified method\n"));
+       printf(_("      --xlogdir=XLOGDIR  location for the transaction log directory\n"));
        printf(_("  -z, --gzip             compress tar output\n"));
        printf(_("  -Z, --compress=0-9     compress tar output with given compression level\n"));
        printf(_("\nGeneral options:\n"));
@@ -980,10 +982,14 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
                                        {
                                                /*
                                                 * When streaming WAL, pg_xlog will have been created
-                                                * by the wal receiver process, so just ignore failure
-                                                * on that.
+                                                * by the wal receiver process. Also, when transaction
+                                                * log directory location was specified, pg_xlog has
+                                                * already been created as a symbolic link before
+                                                * starting the actual backup. So just ignore failure
+                                                * on them.
                                                 */
-                                               if (!streamwal || strcmp(filename + strlen(filename) - 8, "/pg_xlog") != 0)
+                                               if ((!streamwal && (strcmp(xlog_dir, "") == 0))
+                                                       || strcmp(filename + strlen(filename) - 8, "/pg_xlog") != 0)
                                                {
                                                        fprintf(stderr,
                                                        _("%s: could not create directory \"%s\": %s\n"),
@@ -1666,6 +1672,7 @@ main(int argc, char **argv)
                {"status-interval", required_argument, NULL, 's'},
                {"verbose", no_argument, NULL, 'v'},
                {"progress", no_argument, NULL, 'P'},
+               {"xlogdir", required_argument, NULL, 1},
                {NULL, 0, NULL, 0}
        };
        int                     c;
@@ -1750,6 +1757,9 @@ main(int argc, char **argv)
                                        exit(1);
                                }
                                break;
+                       case 1:
+                               xlog_dir = pg_strdup(optarg);
+                               break;
                        case 'l':
                                label = pg_strdup(optarg);
                                break;
@@ -1872,6 +1882,30 @@ main(int argc, char **argv)
                exit(1);
        }
 
+       if (strcmp(xlog_dir, "") != 0)
+       {
+               if (format != 'p')
+               {
+                       fprintf(stderr,
+                                       _("%s: transaction log directory location can only be specified in plain mode\n"),
+                                       progname);
+                       fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+                                       progname);
+                       exit(1);
+               }
+
+               /* clean up xlog directory name, check it's absolute */
+               canonicalize_path(xlog_dir);
+               if (!is_absolute_path(xlog_dir))
+               {
+                       fprintf(stderr, _("%s: transaction log directory location must be "
+                                                         "an absolute path\n"), progname);
+                       fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+                                       progname);
+                       exit(1);
+               }
+       }
+
 #ifndef HAVE_LIBZ
        if (compresslevel != 0)
        {
@@ -1890,6 +1924,30 @@ main(int argc, char **argv)
        if (format == 'p' || strcmp(basedir, "-") != 0)
                verify_dir_is_empty_or_create(basedir);
 
+       /* Create transaction log symlink, if required */
+       if (strcmp(xlog_dir, "") != 0)
+       {
+               char       *linkloc;
+
+               verify_dir_is_empty_or_create(xlog_dir);
+
+               /* form name of the place where the symlink must go */
+               linkloc = psprintf("%s/pg_xlog", basedir);
+
+#ifdef HAVE_SYMLINK
+               if (symlink(xlog_dir, linkloc) != 0)
+               {
+                       fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"),
+                                       progname, linkloc, strerror(errno));
+                       exit(1);
+               }
+#else
+               fprintf(stderr, _("%s: symlinks are not supported on this platform"));
+               exit(1);
+#endif
+               free(linkloc);
+       }
+
        BaseBackup();
 
        return 0;