Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nA8Nl-0007W6-4n for pgsql-hackers@arkaria.postgresql.org; Wed, 19 Jan 2022 10:40:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nA8Nj-0001cM-Vo for pgsql-hackers@arkaria.postgresql.org; Wed, 19 Jan 2022 10:39:59 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nA8Ni-0001c7-6k for pgsql-hackers@lists.postgresql.org; Wed, 19 Jan 2022 10:39:59 +0000 Received: from out5-smtp.messagingengine.com ([66.111.4.29]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nA8NZ-0008MQ-Az for pgsql-hackers@lists.postgresql.org; Wed, 19 Jan 2022 10:39:57 +0000 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 56BEA5C12CC; Wed, 19 Jan 2022 05:39:47 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Wed, 19 Jan 2022 05:39:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paquier.xyz; h= date:from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=fm3; bh=aVL2+9tkmjHp3ikCa3pGRNFXYU3 fGrPFQI8l34BJtbk=; b=JZ3gLWO9TsAgCHzgI8A4bb/lsnJA0qR6kKS5Tf/Zs90 6Ez0Eru9nsnBjLN6tyTXUgNd7eFcZLnuMRSX6Kan5/roUWAltz+kxJs3s/kCGEip LPrEusPdyW/DuYJemzTcpWUUFZ1UHU9oXqtflBoc8h6/p6Qp7avPF/Gac/UEIlJ3 O7vmAzUamnBGH+Xas5uDp3H+1f+pFRcnVZG3FkJS7iUuL4MqA9QcSzQYYaSu8vi1 SV51FgawHo/o1I2tGDN6p+P50cvt8EYwjGm0+iKiFrMVHkchkCaTXTlO/O4bHzG5 8SU6csSmoghxqxK83n2wR6Nbp8EDohpuPuxCQUtDy4A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=aVL2+9 tkmjHp3ikCa3pGRNFXYU3fGrPFQI8l34BJtbk=; b=WHvn05lcyU7+fJORaHaSsT rUv1R4eb42syXzl+25bEI5X+17u4eLzHST/DcFOtYWGnCEo3IRIL7oVAsG6j9jsC RK1OhJ5tV8DpqjCATX9ZWTd71/Y+Yqh+A6TzJ5HDccU/vgjZB9C5+0h/I4ZjE2RH olr+mqTTmabLGVB5EtGfep6xPEsExRjwbnKhFvmgv4KQtLDTU2F+HSVDefBb7F3r iyS//2Tx5aUD1OpJp7U9k00nlaGONQLyCl4TV6x6BosR9O9FDS7Tj/PqHft16oNo XSXaAJ1k7wzeZSdJkox8lhh73bSV1EkL/OJ8rEY8nJc/9S4rbS4yks2abqvHDZCg == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrudehgddulecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenfg hrlhcuvffnffculdejtddmnecujfgurhepfffhvffukfhfgggtuggjsehgtderredttddv necuhfhrohhmpefoihgthhgrvghlucfrrghquhhivghruceomhhitghhrggvlhesphgrqh huihgvrhdrgiihiieqnecuggftrfgrthhtvghrnhepvdegudeuhfdtueeltedtveejheeh ieevueeigeelteegleejleeiueeiheegvefhnecuvehluhhsthgvrhfuihiivgeptdenuc frrghrrghmpehmrghilhhfrhhomhepmhhitghhrggvlhesphgrqhhuihgvrhdrgiihii X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 19 Jan 2022 05:39:44 -0500 (EST) Date: Wed, 19 Jan 2022 19:39:41 +0900 From: Michael Paquier To: Justin Pryzby Cc: Tom Lane , Daniel Gustafsson , Peter Eisentraut , Andrew Dunstan , Bruce Momjian , pgsql-hackers@lists.postgresql.org Subject: Re: pg_upgrade should truncate/remove its logs before running Message-ID: References: <20211221033926.GX17618@telsasoft.com> <238201.1640184746@sss.pgh.pa.us> <20211222163611.GC17618@telsasoft.com> <20220108184857.GI14051@telsasoft.com> <20220111200307.GA14051@telsasoft.com> <20220112040813.GD14051@telsasoft.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="XJDgoflNGyzD7Be2" Content-Disposition: inline In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --XJDgoflNGyzD7Be2 Content-Type: multipart/mixed; boundary="YkMatCk9hsWrtR7K" Content-Disposition: inline --YkMatCk9hsWrtR7K Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Jan 19, 2022 at 05:13:18PM +0900, Michael Paquier wrote: > I have noticed a couple of incorrect things in the docs, and some > other things. It is a bit late here, so I may have missed a couple of > things but I'll look at this stuff once again in a couple of days. And the docs failed to build.. -- Michael --YkMatCk9hsWrtR7K Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0001-pg_upgrade-write-log-files-and-dumps-in-subdir.patch" Content-Transfer-Encoding: quoted-printable =46rom b5a22e5e641930a46c74622bbf42a00b0abdeb8b Mon Sep 17 00:00:00 2001 =46rom: Michael Paquier Date: Wed, 19 Jan 2022 19:38:24 +0900 Subject: [PATCH v3] pg_upgrade: write log files and dumps in subdir.. The subdir must not exist when pg_upgrade is started. This avoids appending to logfiles which have pre-existing errors in them. And allows more easily cleaning up after pg_upgrade. --- src/bin/pg_upgrade/.gitignore | 2 - src/bin/pg_upgrade/Makefile | 4 +- src/bin/pg_upgrade/check.c | 12 ++-- src/bin/pg_upgrade/dump.c | 6 +- src/bin/pg_upgrade/exec.c | 5 +- src/bin/pg_upgrade/function.c | 3 +- src/bin/pg_upgrade/option.c | 29 +++------ src/bin/pg_upgrade/pg_upgrade.c | 105 ++++++++++++++++++++++++-------- src/bin/pg_upgrade/pg_upgrade.h | 8 ++- src/bin/pg_upgrade/server.c | 6 +- doc/src/sgml/ref/pgupgrade.sgml | 17 +++++- 11 files changed, 130 insertions(+), 67 deletions(-) diff --git a/src/bin/pg_upgrade/.gitignore b/src/bin/pg_upgrade/.gitignore index 2d3bfeaa50..939e50db6c 100644 --- a/src/bin/pg_upgrade/.gitignore +++ b/src/bin/pg_upgrade/.gitignore @@ -1,9 +1,7 @@ /pg_upgrade # Generated by test suite -/pg_upgrade_internal.log /delete_old_cluster.sh /delete_old_cluster.bat /reindex_hash.sql -/loadable_libraries.txt /log/ /tmp_check/ diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile index 44d06be5a6..e833a1c5f0 100644 --- a/src/bin/pg_upgrade/Makefile +++ b/src/bin/pg_upgrade/Makefile @@ -45,9 +45,7 @@ uninstall: clean distclean maintainer-clean: rm -f pg_upgrade$(X) $(OBJS) rm -rf delete_old_cluster.sh log/ tmp_check/ \ - loadable_libraries.txt reindex_hash.sql \ - pg_upgrade_dump_globals.sql \ - pg_upgrade_dump_*.custom pg_upgrade_*.log + reindex_hash.sql pg_upgrade_output.d/ =20 # When $(MAKE) is present, make automatically infers that this is a # recursive make. which is not actually what we want here, as that diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 3d218c2ad2..019bcb6c7b 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -783,7 +783,8 @@ check_for_isn_and_int8_passing_mismatch(ClusterInfo *cl= uster) return; } =20 - snprintf(output_path, sizeof(output_path), + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, "contrib_isn_and_int8_pass_by_value.txt"); =20 for (dbnum =3D 0; dbnum < cluster->dbarr.ndbs; dbnum++) @@ -860,7 +861,8 @@ check_for_user_defined_postfix_ops(ClusterInfo *cluster) =20 prep_status("Checking for user-defined postfix operators"); =20 - snprintf(output_path, sizeof(output_path), + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, "postfix_ops.txt"); =20 /* Find any user defined postfix operators */ @@ -959,7 +961,8 @@ check_for_tables_with_oids(ClusterInfo *cluster) =20 prep_status("Checking for tables WITH OIDS"); =20 - snprintf(output_path, sizeof(output_path), + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, "tables_with_oids.txt"); =20 /* Find any tables declared WITH OIDS */ @@ -1214,7 +1217,8 @@ check_for_user_defined_encoding_conversions(ClusterIn= fo *cluster) =20 prep_status("Checking for user-defined encoding conversions"); =20 - snprintf(output_path, sizeof(output_path), + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, "encoding_conversions.txt"); =20 /* Find any user defined encoding conversions */ diff --git a/src/bin/pg_upgrade/dump.c b/src/bin/pg_upgrade/dump.c index 953873fa01..b69b4f9569 100644 --- a/src/bin/pg_upgrade/dump.c +++ b/src/bin/pg_upgrade/dump.c @@ -22,9 +22,10 @@ generate_old_dump(void) /* run new pg_dumpall binary for globals */ exec_prog(UTILITY_LOG_FILE, NULL, true, true, "\"%s/pg_dumpall\" %s --globals-only --quote-all-identifiers " - "--binary-upgrade %s -f %s", + "--binary-upgrade %s -f \"%s/%s\"", new_cluster.bindir, cluster_conn_opts(&old_cluster), log_opts.verbose ? "--verbose" : "", + log_opts.dumpdir, GLOBALS_DUMP_FILE); check_ok(); =20 @@ -52,9 +53,10 @@ generate_old_dump(void) =20 parallel_exec_prog(log_file_name, NULL, "\"%s/pg_dump\" %s --schema-only --quote-all-identifiers " - "--binary-upgrade --format=3Dcustom %s --file=3D\"%s\" %s", + "--binary-upgrade --format=3Dcustom %s --file=3D\"%s/%s\" %s", new_cluster.bindir, cluster_conn_opts(&old_cluster), log_opts.verbose ? "--verbose" : "", + log_opts.dumpdir, sql_file_name, escaped_connstr.data); =20 termPQExpBuffer(&escaped_connstr); diff --git a/src/bin/pg_upgrade/exec.c b/src/bin/pg_upgrade/exec.c index c0cbb1bec7..fadeea12ca 100644 --- a/src/bin/pg_upgrade/exec.c +++ b/src/bin/pg_upgrade/exec.c @@ -78,11 +78,12 @@ get_bin_version(ClusterInfo *cluster) * The code requires it be called first from the primary thread on Windows. */ bool -exec_prog(const char *log_file, const char *opt_log_file, +exec_prog(const char *log_filename, const char *opt_log_file, bool report_error, bool exit_on_error, const char *fmt,...) { int result =3D 0; int written; + char log_file[MAXPGPATH]; =20 #define MAXCMDLEN (2 * MAXPGPATH) char cmd[MAXCMDLEN]; @@ -97,6 +98,8 @@ exec_prog(const char *log_file, const char *opt_log_file, mainThreadId =3D GetCurrentThreadId(); #endif =20 + snprintf(log_file, MAXPGPATH, "%s/%s", log_opts.logdir, log_filename); + written =3D 0; va_start(ap, fmt); written +=3D vsnprintf(cmd + written, MAXCMDLEN - written, fmt, ap); diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c index e73a309070..acc97fafef 100644 --- a/src/bin/pg_upgrade/function.c +++ b/src/bin/pg_upgrade/function.c @@ -128,7 +128,8 @@ check_loadable_libraries(void) =20 prep_status("Checking for presence of required libraries"); =20 - snprintf(output_path, sizeof(output_path), "loadable_libraries.txt"); + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, "loadable_libraries.txt"); =20 /* * Now we want to sort the library names into order. This avoids multiple diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c index c894fdd685..54dff9691e 100644 --- a/src/bin/pg_upgrade/option.c +++ b/src/bin/pg_upgrade/option.c @@ -9,7 +9,6 @@ =20 #include "postgres_fe.h" =20 -#include #ifdef WIN32 #include #endif @@ -57,16 +56,15 @@ parseCommandLine(int argc, char *argv[]) {"socketdir", required_argument, NULL, 's'}, {"verbose", no_argument, NULL, 'v'}, {"clone", no_argument, NULL, 1}, + {"outputdir", required_argument, NULL, 2}, =20 {NULL, 0, NULL, 0} }; int option; /* Command line option */ int optindex =3D 0; /* used by getopt_long */ int os_user_effective_id; - FILE *fp; - char **filename; - time_t run_time =3D time(NULL); =20 + log_opts.basedir =3D DEFAULT_OUTPUTDIR; user_opts.do_sync =3D true; user_opts.transfer_mode =3D TRANSFER_MODE_COPY; =20 @@ -198,6 +196,10 @@ parseCommandLine(int argc, char *argv[]) user_opts.transfer_mode =3D TRANSFER_MODE_CLONE; break; =20 + case 2: + log_opts.basedir =3D pg_strdup(optarg); + break; + default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), os_info.progname); @@ -208,27 +210,9 @@ parseCommandLine(int argc, char *argv[]) if (optind < argc) pg_fatal("too many command-line arguments (first is \"%s\")\n", argv[opt= ind]); =20 - if ((log_opts.internal =3D fopen_priv(INTERNAL_LOG_FILE, "a")) =3D=3D NUL= L) - pg_fatal("could not open log file \"%s\": %m\n", INTERNAL_LOG_FILE); - if (log_opts.verbose) pg_log(PG_REPORT, "Running in verbose mode\n"); =20 - /* label start of upgrade in logfiles */ - for (filename =3D output_files; *filename !=3D NULL; filename++) - { - if ((fp =3D fopen_priv(*filename, "a")) =3D=3D NULL) - pg_fatal("could not write to log file \"%s\": %m\n", *filename); - - /* Start with newline because we might be appending to a file. */ - fprintf(fp, "\n" - "-----------------------------------------------------------------\n" - " pg_upgrade run on %s" - "-----------------------------------------------------------------\n\n= ", - ctime(&run_time)); - fclose(fp); - } - /* Turn off read-only mode; add prefix to PGOPTIONS? */ if (getenv("PGOPTIONS")) { @@ -303,6 +287,7 @@ usage(void) printf(_(" -v, --verbose enable verbose internal logging= \n")); printf(_(" -V, --version display version information, th= en exit\n")); printf(_(" --clone clone instead of copying files = to new cluster\n")); + printf(_(" --outputdir=3DDIR directory to store internal f= iles (logs, etc.)\n")); printf(_(" -?, --help show this help, then exit\n")); printf(_("\n" "Before running pg_upgrade you must:\n" diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrad= e.c index 07defacd67..52858f9dba 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -38,6 +38,8 @@ =20 #include "postgres_fe.h" =20 +#include + #ifdef HAVE_LANGINFO_H #include #endif @@ -54,6 +56,7 @@ static void prepare_new_globals(void); static void create_new_objects(void); static void copy_xact_xlog_xid(void); static void set_frozenxids(bool minmxid_only); +static void make_outputdirs(void); static void setup(char *argv0, bool *live_check); static void cleanup(void); =20 @@ -89,6 +92,8 @@ main(int argc, char **argv) =20 get_restricted_token(); =20 + make_outputdirs(); + adjust_data_dir(&old_cluster); adjust_data_dir(&new_cluster); =20 @@ -197,6 +202,72 @@ main(int argc, char **argv) return 0; } =20 +/* + * Create and assign proper permissions to the set of output directories + * used to store any data generated internally, filling in log_opts in + * the process. + */ +static void +make_outputdirs(void) +{ + FILE *fp; + char **filename; + time_t run_time =3D time(NULL); + char filename_path[MAXPGPATH]; + char *outputpath; + char cwd[MAXPGPATH]; + + /* + * Check that the output directory is a sane location. It should not + * include any references to the parent, and if a relative path, this had + * better not be a direct parent. + */ + outputpath =3D make_absolute_path(log_opts.basedir); + if (path_contains_parent_reference(outputpath)) + pg_fatal("reference to parent directory not allowed\n"); + if (!getcwd(cwd, MAXPGPATH)) + pg_fatal("could not determine current directory\n"); + if (path_is_prefix_of_path(outputpath, cwd)) + pg_fatal("output directory cannot be below current working directory\n"); + + /* save the sanitized and absolute path, and just use it */ + log_opts.basedir =3D outputpath; + + log_opts.dumpdir =3D (char *) pg_malloc(MAXPGPATH); + snprintf(log_opts.dumpdir, MAXPGPATH, "%s/dump", log_opts.basedir); + log_opts.logdir =3D (char *) pg_malloc(MAXPGPATH); + snprintf(log_opts.logdir, MAXPGPATH, "%s/log", log_opts.basedir); + + if (mkdir(log_opts.basedir, S_IRWXU | S_IRWXG | S_IRWXO)) + pg_fatal("could not create directory \"%s\": %m\n", filename_path); + if (mkdir(log_opts.dumpdir, S_IRWXU | S_IRWXG | S_IRWXO)) + pg_fatal("could not create directory \"%s\": %m\n", filename_path); + if (mkdir(log_opts.logdir, S_IRWXU | S_IRWXG | S_IRWXO)) + pg_fatal("could not create directory \"%s\": %m\n", filename_path); + + snprintf(filename_path, sizeof(filename_path), "%s/%s", log_opts.logdir, + INTERNAL_LOG_FILE); + if ((log_opts.internal =3D fopen_priv(filename_path, "a")) =3D=3D NULL) + pg_fatal("could not open log file \"%s\": %m\n", filename_path); + + /* label start of upgrade in logfiles */ + for (filename =3D output_files; *filename !=3D NULL; filename++) + { + snprintf(filename_path, sizeof(filename_path), "%s/%s", + log_opts.logdir, *filename); + if ((fp =3D fopen_priv(filename_path, "a")) =3D=3D NULL) + pg_fatal("could not write to log file \"%s\": %m\n", filename_path); + + /* Start with newline because we might be appending to a file. */ + fprintf(fp, "\n" + "-----------------------------------------------------------------\n" + " pg_upgrade run on %s" + "-----------------------------------------------------------------\n\n= ", + ctime(&run_time)); + fclose(fp); + } +} + =20 static void setup(char *argv0, bool *live_check) @@ -306,8 +377,9 @@ prepare_new_globals(void) prep_status("Restoring global objects in the new cluster"); =20 exec_prog(UTILITY_LOG_FILE, NULL, true, true, - "\"%s/psql\" " EXEC_PSQL_ARGS " %s -f \"%s\"", + "\"%s/psql\" " EXEC_PSQL_ARGS " %s -f \"%s/%s\"", new_cluster.bindir, cluster_conn_opts(&new_cluster), + log_opts.dumpdir, GLOBALS_DUMP_FILE); check_ok(); } @@ -352,10 +424,11 @@ create_new_objects(void) true, true, "\"%s/pg_restore\" %s %s --exit-on-error --verbose " - "--dbname postgres \"%s\"", + "--dbname postgres \"%s/%s\"", new_cluster.bindir, cluster_conn_opts(&new_cluster), create_opts, + log_opts.dumpdir, sql_file_name); =20 break; /* done once we've processed template1 */ @@ -389,10 +462,11 @@ create_new_objects(void) parallel_exec_prog(log_file_name, NULL, "\"%s/pg_restore\" %s %s --exit-on-error --verbose " - "--dbname template1 \"%s\"", + "--dbname template1 \"%s/%s\"", new_cluster.bindir, cluster_conn_opts(&new_cluster), create_opts, + log_opts.dumpdir, sql_file_name); } =20 @@ -689,28 +763,5 @@ cleanup(void) =20 /* Remove dump and log files? */ if (!log_opts.retain) - { - int dbnum; - char **filename; - - for (filename =3D output_files; *filename !=3D NULL; filename++) - unlink(*filename); - - /* remove dump files */ - unlink(GLOBALS_DUMP_FILE); - - if (old_cluster.dbarr.dbs) - for (dbnum =3D 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) - { - char sql_file_name[MAXPGPATH], - log_file_name[MAXPGPATH]; - DbInfo *old_db =3D &old_cluster.dbarr.dbs[dbnum]; - - snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_= db->db_oid); - unlink(sql_file_name); - - snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, = old_db->db_oid); - unlink(log_file_name); - } - } + rmtree(log_opts.basedir, true); } diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrad= e.h index da6770d0f8..7410ab6c44 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -26,11 +26,13 @@ #define GLOBALS_DUMP_FILE "pg_upgrade_dump_globals.sql" #define DB_DUMP_FILE_MASK "pg_upgrade_dump_%u.custom" =20 +/* Default path to include all the files generated internally */ +#define DEFAULT_OUTPUTDIR "pg_upgrade_output.d" + #define DB_DUMP_LOG_FILE_MASK "pg_upgrade_dump_%u.log" #define SERVER_LOG_FILE "pg_upgrade_server.log" #define UTILITY_LOG_FILE "pg_upgrade_utility.log" #define INTERNAL_LOG_FILE "pg_upgrade_internal.log" - extern char *output_files[]; =20 /* @@ -263,6 +265,10 @@ typedef struct FILE *internal; /* internal log FILE */ bool verbose; /* true -> be verbose in messages */ bool retain; /* retain log files on success */ + /* Set of internal directories for output files */ + char *basedir; /* Base output directory */ + char *dumpdir; /* Dumps */ + char *logdir; /* Log files */ } LogOpts; =20 =20 diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c index f5d4656dec..7878d233de 100644 --- a/src/bin/pg_upgrade/server.c +++ b/src/bin/pg_upgrade/server.c @@ -238,8 +238,10 @@ start_postmaster(ClusterInfo *cluster, bool report_and= _exit_on_error) * vacuumdb --freeze actually freezes the tuples. */ snprintf(cmd, sizeof(cmd), - "\"%s/pg_ctl\" -w -l \"%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start", - cluster->bindir, SERVER_LOG_FILE, cluster->pgconfig, cluster->port, + "\"%s/pg_ctl\" -w -l \"%s/%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start", + cluster->bindir, + log_opts.logdir, + SERVER_LOG_FILE, cluster->pgconfig, cluster->port, (cluster =3D=3D &new_cluster) ? " -c synchronous_commit=3Doff -c fsync=3Doff -c full_page_writes=3Doff= -c vacuum_defer_cleanup_age=3D0" : "", cluster->pgopts ? cluster->pgopts : "", socket_string); diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.s= gml index c5ce732ee9..b0cfacbf9c 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -231,6 +231,18 @@ PostgreSQL documentation =20 + + path= + Directory where any output file internal to + pg_upgrade is generated. This includes SQL and log + files. The directory is created when starting + pg_upgrade, and is be removed after a successful + upgrade unless is specified. The default v= alue + is pg_upgrade_output.d in the current working + directory. + + + @@ -768,8 +780,9 @@ psql --username=3Dpostgres --file=3Dscript.sql postgres =20 pg_upgrade creates various working files, su= ch - as schema dumps, in the current working directory. For security, be su= re - that that directory is not readable or writable by any other users. + as schema dumps, stored within pg_upgrade_output.d in + the current working directory. The location can be controlled with + =20 --=20 2.34.1 --YkMatCk9hsWrtR7K-- --XJDgoflNGyzD7Be2 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEG72nH6vTowiyblFKnvQgOdbyQH0FAmHn6m0ACgkQnvQgOdby QH1GLBAAoimBnmARoJg6ehYXa353sdjAxt1JS3UulDG0F5BZcXBPM5OESWLB6fr0 Z5LKTK6dDY4ov+0APHnckMWnnOomFBIl32w0KnBDuVcXWLMk2NceVJSiA4lOVYMn j0TC9Ye7MjpA4/hk0vd7jmL1znnrrVOB51P+VS9MVuJlqGWQPgUUGJbihoKZFYOx kQLN87xJRbTn84o0cTNX+/hq8Rw0NDQo2yMNTJe25DDfwl00d+hvqlxzttWW93rw A7BqHc/LEadX4iPfGSFTocdRwxTQr1oPTWoIVIO9tE6r81uEau/H7+AEWtEp7+n0 ju6VFoThufO6raD8Mq/Otq0dtbBTcuEyC8PR102xNOabbV8RuiRmdHjwNW/AXc0C N4JTIIJhnBxbOYUEQOQYjGRuKikD2mZ2RZDkfPUmGVxzlUe9lnYYqkzrvIxqFw36 DL3aBvgWh1CTfZ0FLYibOSB5YzR60P+TFPnXKJCtdRfTNKjZn45XrgemQKog6wTG 3pTZFCHzsnhqv2JlfNsAn+/+R7nmu/JtVGI1SuwluYLFqy338xH1LY/6w5+x/giC v/uqPZOBaSzY7IvwxkuSkZyTrSJoGTS6cvaUdWiJzCbqW4B9B6asB75P+YVAkd+v VpDf2u5Em1jZf1N57ZqmO+zCCkigu91JJFxb2ZWSYdIidEq46eU= =3Yej -----END PGP SIGNATURE----- --XJDgoflNGyzD7Be2--