From 048d148fe63102fafb2336ab5439c950dea7f692 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Sun, 23 Jan 2011 12:21:23 +0100 Subject: Add pg_basebackup tool for streaming base backups This tool makes it possible to do the pg_start_backup/ copy files/pg_stop_backup step in a single command. There are still some steps to be done before this is a complete backup solution, such as the ability to stream the required WAL logs, but it's still usable, and could do with some buildfarm coverage. In passing, make the checkpoint request optionally fast instead of hardcoding it. Magnus Hagander, reviewed by Fujii Masao and Dimitri Fontaine --- src/backend/replication/basebackup.c | 19 +- src/backend/replication/repl_gram.y | 11 +- src/backend/replication/repl_scanner.l | 1 + src/backend/replication/walsender.c | 2 +- src/bin/Makefile | 2 +- src/bin/pg_basebackup/Makefile | 38 ++ src/bin/pg_basebackup/nls.mk | 5 + src/bin/pg_basebackup/pg_basebackup.c | 1035 ++++++++++++++++++++++++++++++++ src/include/replication/basebackup.h | 2 +- src/include/replication/replnodes.h | 1 + src/tools/msvc/Mkvcbuild.pm | 2 + 11 files changed, 1107 insertions(+), 11 deletions(-) create mode 100644 src/bin/pg_basebackup/Makefile create mode 100644 src/bin/pg_basebackup/nls.mk create mode 100644 src/bin/pg_basebackup/pg_basebackup.c (limited to 'src') diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index b4d5bbe412e..943d80470bf 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -40,7 +40,7 @@ static void send_int8_string(StringInfoData *buf, int64 intval); static void SendBackupHeader(List *tablespaces); static void SendBackupDirectory(char *location, char *spcoid); static void base_backup_cleanup(int code, Datum arg); -static void perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir); +static void perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir, bool fastcheckpoint); typedef struct { @@ -67,9 +67,9 @@ base_backup_cleanup(int code, Datum arg) * clobbered by longjmp" from stupider versions of gcc. */ static void -perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir) +perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir, bool fastcheckpoint) { - do_pg_start_backup(backup_label, true); + do_pg_start_backup(backup_label, fastcheckpoint); PG_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0); { @@ -135,7 +135,7 @@ perform_base_backup(const char *backup_label, bool progress, DIR *tblspcdir) * pg_stop_backup() for the user. */ void -SendBaseBackup(const char *backup_label, bool progress) +SendBaseBackup(const char *backup_label, bool progress, bool fastcheckpoint) { DIR *dir; MemoryContext backup_context; @@ -168,7 +168,7 @@ SendBaseBackup(const char *backup_label, bool progress) ereport(ERROR, (errmsg("unable to open directory pg_tblspc: %m"))); - perform_base_backup(backup_label, progress, dir); + perform_base_backup(backup_label, progress, dir, fastcheckpoint); FreeDir(dir); @@ -333,7 +333,16 @@ sendDir(char *path, int basepathlen, bool sizeonly) if (strcmp(pathbuf, "./pg_xlog") == 0) { if (!sizeonly) + { + /* If pg_xlog is a symlink, write it as a directory anyway */ +#ifndef WIN32 + if (S_ISLNK(statbuf.st_mode)) +#else + if (pgwin32_is_junction(pathbuf)) +#endif + statbuf.st_mode = S_IFDIR | S_IRWXU; _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf); + } size += 512; /* Size of the header just added */ continue; /* don't recurse into pg_xlog */ } diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y index 0ef33ddb4f9..e4f4c4742f6 100644 --- a/src/backend/replication/repl_gram.y +++ b/src/backend/replication/repl_gram.y @@ -66,11 +66,12 @@ Node *replication_parse_result; %token K_IDENTIFY_SYSTEM %token K_LABEL %token K_PROGRESS +%token K_FAST %token K_START_REPLICATION %type command %type base_backup start_replication identify_system -%type opt_progress +%type opt_progress opt_fast %type opt_label %% @@ -102,15 +103,16 @@ identify_system: ; /* - * BASE_BACKUP [LABEL