aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFujii Masao <fujii@postgresql.org>2013-11-27 14:00:16 +0900
committerFujii Masao <fujii@postgresql.org>2013-11-27 14:00:16 +0900
commitd1b88f6b3660753771895a4441b6bb4ccc9bcaac (patch)
treeb3a3d2b2f7fb4a58ee8327fe779f00110fdf236a
parent551c78281b47b8ab12cfc142b8da68db8473e591 (diff)
downloadpostgresql-d1b88f6b3660753771895a4441b6bb4ccc9bcaac.tar.gz
postgresql-d1b88f6b3660753771895a4441b6bb4ccc9bcaac.zip
Add --xlogdir option to pg_basebackup, for specifying the pg_xlog directory.
Haribabu kommi, slightly modified by me.
-rw-r--r--doc/src/sgml/ref/pg_basebackup.sgml12
-rw-r--r--src/bin/pg_basebackup/pg_basebackup.c64
2 files changed, 73 insertions, 3 deletions
diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml
index eb0c1d6f36e..c379df546c6 100644
--- a/doc/src/sgml/ref/pg_basebackup.sgml
+++ b/doc/src/sgml/ref/pg_basebackup.sgml
@@ -203,6 +203,18 @@ PostgreSQL documentation
</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>
<listitem>
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index a1e12a8aaa3..6706c0c7a90 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -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;