diff options
| author | Fujii Masao | 2013-11-27 05:00:16 +0000 |
|---|---|---|
| committer | Fujii Masao | 2013-11-27 05:00:16 +0000 |
| commit | d1b88f6b3660753771895a4441b6bb4ccc9bcaac (patch) | |
| tree | b3a3d2b2f7fb4a58ee8327fe779f00110fdf236a /src/bin | |
| parent | 551c78281b47b8ab12cfc142b8da68db8473e591 (diff) | |
Add --xlogdir option to pg_basebackup, for specifying the pg_xlog directory.
Haribabu kommi, slightly modified by me.
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/pg_basebackup/pg_basebackup.c | 64 |
1 files changed, 61 insertions, 3 deletions
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; |
