Hi. This is a followup to a 2014-02 discussion that led to pg_stats_temp being excluded from pg_basebackup. At the time, it was discussed to exclude pg_log as well, but nothing eventually came of that.
Recently, one of our customers has had a basebackup fail because pg_log contained files that were >8GB: FATAL: archive member "pg_log/postgresql-20150119.log" too large for tar format I think pg_basebackup should also skip pg_log entries, as it does for pg_stats_temp and pg_replslot, etc. I've attached a patch along those lines for discussion. -- Abhijit P.S. Aren't we leaking statrelpath?
>From 8db162c1385b1cdd2b0e666975b76aa814f09f35 Mon Sep 17 00:00:00 2001 From: Abhijit Menon-Sen <a...@2ndquadrant.com> Date: Mon, 27 Apr 2015 12:58:52 +0530 Subject: Skip files in pg_log during basebackup --- src/backend/replication/basebackup.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 1e86e4c..cc75a03 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -27,6 +27,7 @@ #include "nodes/pg_list.h" #include "pgtar.h" #include "pgstat.h" +#include "postmaster/syslogger.h" #include "replication/basebackup.h" #include "replication/walsender.h" #include "replication/walsender_private.h" @@ -72,6 +73,9 @@ static bool backup_started_in_recovery = false; /* Relative path of temporary statistics directory */ static char *statrelpath = NULL; +/* Relative path to log directory */ +static char logpath[MAXPGPATH]; + /* * Size of each block sent into the tar stream for larger files. */ @@ -157,6 +161,18 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir) else statrelpath = pgstat_stat_directory; + /* + * Do the same for the log_directory. + */ + + if (is_absolute_path(Log_directory) && + path_is_prefix_of_path(DataDir, Log_directory)) + snprintf(logpath, MAXPGPATH, "./%s", Log_directory + datadirpathlen + 1); + else if (strncmp(Log_directory, "./", 2) != 0) + snprintf(logpath, MAXPGPATH, "./%s", Log_directory); + else + strncpy(logpath, Log_directory, MAXPGPATH); + /* Add a node for the base directory at the end */ ti = palloc0(sizeof(tablespaceinfo)); ti->size = opt->progress ? sendDir(".", 1, true, tablespaces, true) : -1; @@ -965,6 +981,19 @@ sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces, } /* + * We can skip pg_log (or whatever log_directory is set to, if + * it's under the data directory), but include it as an empty + * directory anyway, so we get permissions right. + */ + if (strcmp(pathbuf, logpath) == 0) + { + if (!sizeonly) + _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf); + size += 512; + continue; + } + + /* * Skip pg_replslot, not useful to copy. But include it as an empty * directory anyway, so we get permissions right. */ -- 1.9.1
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers