mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +03:00
Backpatch pg_upgrade fixes to 9.0:
In pg_upgrade, prevent psql AUTOCOMMIT=off by not loading .psqlrc. In pg_upgrade, report /bin directory checks independent of /data checks. Remove incorrect email address for pg_upgrade bug reports. On Win32, pg_upgrade cannot sent any server log output to the log file because of file access limitations on that platform.
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
$PostgreSQL: pgsql/contrib/pg_upgrade/TESTING,v 1.2.2.1 2010/07/09 16:51:29 momjian Exp $
|
||||
$PostgreSQL: pgsql/contrib/pg_upgrade/TESTING,v 1.2.2.2 2010/07/13 20:15:51 momjian Exp $
|
||||
|
||||
The most effective way to test pg_upgrade, aside from testing on user
|
||||
data, is by upgrading the PostgreSQL regression database.
|
||||
|
@ -4,7 +4,7 @@
|
||||
* server checks and output routines
|
||||
*
|
||||
* Copyright (c) 2010, PostgreSQL Global Development Group
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/check.c,v 1.11 2010/07/06 19:18:55 momjian Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/check.c,v 1.11.2.1 2010/07/13 20:15:51 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "pg_upgrade.h"
|
||||
@ -152,9 +152,9 @@ issue_warnings(migratorContext *ctx, char *sequence_script_file_name)
|
||||
{
|
||||
prep_status(ctx, "Adjusting sequences");
|
||||
exec_prog(ctx, true,
|
||||
SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on --port %d "
|
||||
"--username \"%s\" -f \"%s\" --dbname template1 >> \"%s\""
|
||||
SYSTEMQUOTE,
|
||||
SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on "
|
||||
"--no-psqlrc --port %d --username \"%s\" "
|
||||
"-f \"%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
|
||||
ctx->new.bindir, ctx->new.port, ctx->user,
|
||||
sequence_script_file_name, ctx->logfile);
|
||||
unlink(sequence_script_file_name);
|
||||
|
@ -4,7 +4,7 @@
|
||||
* execution functions
|
||||
*
|
||||
* Copyright (c) 2010, PostgreSQL Global Development Group
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/exec.c,v 1.8 2010/07/06 19:18:55 momjian Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/exec.c,v 1.8.2.1 2010/07/13 20:15:51 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "pg_upgrade.h"
|
||||
@ -13,10 +13,10 @@
|
||||
#include <grp.h>
|
||||
|
||||
|
||||
static void checkBinDir(migratorContext *ctx, ClusterInfo *cluster);
|
||||
static void check_data_dir(migratorContext *ctx, const char *pg_data);
|
||||
static void check_bin_dir(migratorContext *ctx, ClusterInfo *cluster);
|
||||
static int check_exec(migratorContext *ctx, const char *dir, const char *cmdName);
|
||||
static const char *validate_exec(const char *path);
|
||||
static int check_data_dir(migratorContext *ctx, const char *pg_data);
|
||||
|
||||
|
||||
/*
|
||||
@ -55,49 +55,6 @@ exec_prog(migratorContext *ctx, bool throw_error, const char *fmt,...)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* verify_directories()
|
||||
*
|
||||
* does all the hectic work of verifying directories and executables
|
||||
* of old and new server.
|
||||
*
|
||||
* NOTE: May update the values of all parameters
|
||||
*/
|
||||
void
|
||||
verify_directories(migratorContext *ctx)
|
||||
{
|
||||
prep_status(ctx, "Checking old data directory (%s)", ctx->old.pgdata);
|
||||
if (check_data_dir(ctx, ctx->old.pgdata) != 0)
|
||||
pg_log(ctx, PG_FATAL, "Failed\n");
|
||||
checkBinDir(ctx, &ctx->old);
|
||||
check_ok(ctx);
|
||||
|
||||
prep_status(ctx, "Checking new data directory (%s)", ctx->new.pgdata);
|
||||
if (check_data_dir(ctx, ctx->new.pgdata) != 0)
|
||||
pg_log(ctx, PG_FATAL, "Failed\n");
|
||||
checkBinDir(ctx, &ctx->new);
|
||||
check_ok(ctx);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* checkBinDir()
|
||||
*
|
||||
* This function searches for the executables that we expect to find
|
||||
* in the binaries directory. If we find that a required executable
|
||||
* is missing (or secured against us), we display an error message and
|
||||
* exit().
|
||||
*/
|
||||
static void
|
||||
checkBinDir(migratorContext *ctx, ClusterInfo *cluster)
|
||||
{
|
||||
check_exec(ctx, cluster->bindir, "postgres");
|
||||
check_exec(ctx, cluster->bindir, "psql");
|
||||
check_exec(ctx, cluster->bindir, "pg_ctl");
|
||||
check_exec(ctx, cluster->bindir, "pg_dumpall");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* is_server_running()
|
||||
*
|
||||
@ -126,6 +83,90 @@ is_server_running(migratorContext *ctx, const char *datadir)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* verify_directories()
|
||||
*
|
||||
* does all the hectic work of verifying directories and executables
|
||||
* of old and new server.
|
||||
*
|
||||
* NOTE: May update the values of all parameters
|
||||
*/
|
||||
void
|
||||
verify_directories(migratorContext *ctx)
|
||||
{
|
||||
prep_status(ctx, "Checking old data directory (%s)", ctx->old.pgdata);
|
||||
check_data_dir(ctx, ctx->old.pgdata);
|
||||
check_ok(ctx);
|
||||
|
||||
prep_status(ctx, "Checking old bin directory (%s)", ctx->old.bindir);
|
||||
check_bin_dir(ctx, &ctx->old);
|
||||
check_ok(ctx);
|
||||
|
||||
prep_status(ctx, "Checking new data directory (%s)", ctx->new.pgdata);
|
||||
check_data_dir(ctx, ctx->new.pgdata);
|
||||
check_ok(ctx);
|
||||
|
||||
prep_status(ctx, "Checking new bin directory (%s)", ctx->new.bindir);
|
||||
check_bin_dir(ctx, &ctx->new);
|
||||
check_ok(ctx);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* check_data_dir()
|
||||
*
|
||||
* This function validates the given cluster directory - we search for a
|
||||
* small set of subdirectories that we expect to find in a valid $PGDATA
|
||||
* directory. If any of the subdirectories are missing (or secured against
|
||||
* us) we display an error message and exit()
|
||||
*
|
||||
*/
|
||||
static void
|
||||
check_data_dir(migratorContext *ctx, const char *pg_data)
|
||||
{
|
||||
char subDirName[MAXPGPATH];
|
||||
int subdirnum;
|
||||
const char *requiredSubdirs[] = {"base", "global", "pg_clog",
|
||||
"pg_multixact", "pg_subtrans", "pg_tblspc", "pg_twophase",
|
||||
"pg_xlog"};
|
||||
|
||||
for (subdirnum = 0;
|
||||
subdirnum < sizeof(requiredSubdirs) / sizeof(requiredSubdirs[0]);
|
||||
++subdirnum)
|
||||
{
|
||||
struct stat statBuf;
|
||||
|
||||
snprintf(subDirName, sizeof(subDirName), "%s/%s", pg_data,
|
||||
requiredSubdirs[subdirnum]);
|
||||
|
||||
if (stat(subDirName, &statBuf) != 0)
|
||||
report_status(ctx, PG_FATAL, "check for %s failed: %s",
|
||||
requiredSubdirs[subdirnum], getErrorText(errno));
|
||||
else if (!S_ISDIR(statBuf.st_mode))
|
||||
report_status(ctx, PG_FATAL, "%s is not a directory",
|
||||
requiredSubdirs[subdirnum]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* check_bin_dir()
|
||||
*
|
||||
* This function searches for the executables that we expect to find
|
||||
* in the binaries directory. If we find that a required executable
|
||||
* is missing (or secured against us), we display an error message and
|
||||
* exit().
|
||||
*/
|
||||
static void
|
||||
check_bin_dir(migratorContext *ctx, ClusterInfo *cluster)
|
||||
{
|
||||
check_exec(ctx, cluster->bindir, "postgres");
|
||||
check_exec(ctx, cluster->bindir, "psql");
|
||||
check_exec(ctx, cluster->bindir, "pg_ctl");
|
||||
check_exec(ctx, cluster->bindir, "pg_dumpall");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* check_exec()
|
||||
*
|
||||
@ -264,50 +305,3 @@ validate_exec(const char *path)
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* check_data_dir()
|
||||
*
|
||||
* This function validates the given cluster directory - we search for a
|
||||
* small set of subdirectories that we expect to find in a valid $PGDATA
|
||||
* directory. If any of the subdirectories are missing (or secured against
|
||||
* us) we display an error message and exit()
|
||||
*
|
||||
*/
|
||||
static int
|
||||
check_data_dir(migratorContext *ctx, const char *pg_data)
|
||||
{
|
||||
char subDirName[MAXPGPATH];
|
||||
const char *requiredSubdirs[] = {"base", "global", "pg_clog",
|
||||
"pg_multixact", "pg_subtrans",
|
||||
"pg_tblspc", "pg_twophase", "pg_xlog"};
|
||||
bool fail = false;
|
||||
int subdirnum;
|
||||
|
||||
for (subdirnum = 0; subdirnum < sizeof(requiredSubdirs) / sizeof(requiredSubdirs[0]); ++subdirnum)
|
||||
{
|
||||
struct stat statBuf;
|
||||
|
||||
snprintf(subDirName, sizeof(subDirName), "%s/%s", pg_data,
|
||||
requiredSubdirs[subdirnum]);
|
||||
|
||||
if ((stat(subDirName, &statBuf)) != 0)
|
||||
{
|
||||
report_status(ctx, PG_WARNING, "check for %s warning: %s",
|
||||
requiredSubdirs[subdirnum], getErrorText(errno));
|
||||
fail = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!S_ISDIR(statBuf.st_mode))
|
||||
{
|
||||
report_status(ctx, PG_WARNING, "%s is not a directory",
|
||||
requiredSubdirs[subdirnum]);
|
||||
fail = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (fail) ? -1 : 0;
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
* file system operations
|
||||
*
|
||||
* Copyright (c) 2010, PostgreSQL Global Development Group
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/file.c,v 1.13.2.1 2010/07/09 16:51:29 momjian Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/file.c,v 1.13.2.2 2010/07/13 20:15:51 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "pg_upgrade.h"
|
||||
|
@ -4,7 +4,7 @@
|
||||
* options functions
|
||||
*
|
||||
* Copyright (c) 2010, PostgreSQL Global Development Group
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/option.c,v 1.12 2010/07/06 19:18:55 momjian Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/option.c,v 1.12.2.1 2010/07/13 20:15:51 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "pg_upgrade.h"
|
||||
@ -259,10 +259,6 @@ or\n"), ctx->old.port, ctx->new.port, ctx->user);
|
||||
C:\\> set NEWBINDIR=newCluster/bin\n\
|
||||
C:\\> pg_upgrade\n"));
|
||||
#endif
|
||||
printf(_("\n\
|
||||
You may find it useful to save the preceding 5 commands in a shell script\n\
|
||||
\n\
|
||||
Report bugs to <pg-migrator-general@lists.pgfoundry.org>\n"));
|
||||
}
|
||||
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
* main source file
|
||||
*
|
||||
* Copyright (c) 2010, PostgreSQL Global Development Group
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/pg_upgrade.c,v 1.10 2010/07/06 19:18:55 momjian Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/pg_upgrade.c,v 1.10.2.1 2010/07/13 20:15:51 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "pg_upgrade.h"
|
||||
@ -202,9 +202,10 @@ prepare_new_databases(migratorContext *ctx)
|
||||
*/
|
||||
prep_status(ctx, "Creating databases in the new cluster");
|
||||
exec_prog(ctx, true,
|
||||
SYSTEMQUOTE "\"%s/psql\" --port %d --username \"%s\" "
|
||||
"--set ON_ERROR_STOP=on -f \"%s/%s\" --dbname template1 >> \"%s\""
|
||||
SYSTEMQUOTE,
|
||||
SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on "
|
||||
/* --no-psqlrc prevents AUTOCOMMIT=off */
|
||||
"--no-psqlrc --port %d --username \"%s\" "
|
||||
"-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
|
||||
ctx->new.bindir, ctx->new.port, ctx->user, ctx->cwd,
|
||||
GLOBALS_DUMP_FILE, ctx->logfile);
|
||||
check_ok(ctx);
|
||||
@ -225,9 +226,9 @@ create_new_objects(migratorContext *ctx)
|
||||
|
||||
prep_status(ctx, "Restoring database schema to new cluster");
|
||||
exec_prog(ctx, true,
|
||||
SYSTEMQUOTE "\"%s/psql\" --port %d --username \"%s\" "
|
||||
"--set ON_ERROR_STOP=on -f \"%s/%s\" --dbname template1 >> \"%s\""
|
||||
SYSTEMQUOTE,
|
||||
SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on "
|
||||
"--no-psqlrc --port %d --username \"%s\" "
|
||||
"-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
|
||||
ctx->new.bindir, ctx->new.port, ctx->user, ctx->cwd,
|
||||
DB_DUMP_FILE, ctx->logfile);
|
||||
check_ok(ctx);
|
||||
|
@ -4,7 +4,7 @@
|
||||
* database server functions
|
||||
*
|
||||
* Copyright (c) 2010, PostgreSQL Global Development Group
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/server.c,v 1.8 2010/07/06 19:18:55 momjian Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pg_upgrade/server.c,v 1.8.2.1 2010/07/13 20:15:51 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "pg_upgrade.h"
|
||||
@ -181,9 +181,9 @@ start_postmaster(migratorContext *ctx, Cluster whichCluster, bool quiet)
|
||||
}
|
||||
|
||||
/*
|
||||
* On Win32, we can't send both server output and pg_ctl output to the
|
||||
* On Win32, we can't send both pg_upgrade output and pg_ctl output to the
|
||||
* same file because we get the error: "The process cannot access the file
|
||||
* because it is being used by another process." so we have to send pg_ctl
|
||||
* because it is being used by another process." so we have to send all other
|
||||
* output to 'nul'.
|
||||
*/
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
@ -191,11 +191,11 @@ start_postmaster(migratorContext *ctx, Cluster whichCluster, bool quiet)
|
||||
"-o \"-p %d -c autovacuum=off "
|
||||
"-c autovacuum_freeze_max_age=2000000000\" "
|
||||
"start >> \"%s\" 2>&1" SYSTEMQUOTE,
|
||||
bindir, ctx->logfile, datadir, port,
|
||||
bindir,
|
||||
#ifndef WIN32
|
||||
ctx->logfile);
|
||||
ctx->logfile, datadir, port, ctx->logfile);
|
||||
#else
|
||||
DEVNULL);
|
||||
DEVNULL, datadir, port, DEVNULL);
|
||||
#endif
|
||||
exec_prog(ctx, true, "%s", cmd);
|
||||
|
||||
@ -235,11 +235,11 @@ stop_postmaster(migratorContext *ctx, bool fast, bool quiet)
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" %s stop >> "
|
||||
"\"%s\" 2>&1" SYSTEMQUOTE,
|
||||
bindir, ctx->logfile, datadir, fast ? "-m fast" : "",
|
||||
bindir,
|
||||
#ifndef WIN32
|
||||
ctx->logfile);
|
||||
ctx->logfile, datadir, fast ? "-m fast" : "", ctx->logfile);
|
||||
#else
|
||||
DEVNULL);
|
||||
DEVNULL, datadir, fast ? "-m fast" : "", DEVNULL);
|
||||
#endif
|
||||
exec_prog(ctx, fast ? false : true, "%s", cmd);
|
||||
|
||||
|
Reference in New Issue
Block a user