In pg_upgrade, check that the binary and data directories are the same
major version. Backpatch to 9.1. Dan McGee
This commit is contained in:
parent
3b3c2cf180
commit
0b44818ead
@ -20,6 +20,7 @@ static void check_for_prepared_transactions(ClusterInfo *cluster);
|
|||||||
static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
|
static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
|
||||||
static void check_for_reg_data_type_usage(ClusterInfo *cluster);
|
static void check_for_reg_data_type_usage(ClusterInfo *cluster);
|
||||||
static void check_for_support_lib(ClusterInfo *cluster);
|
static void check_for_support_lib(ClusterInfo *cluster);
|
||||||
|
static void get_bin_version(ClusterInfo *cluster);
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -216,6 +217,8 @@ output_completion_banner(char *deletion_script_file_name)
|
|||||||
void
|
void
|
||||||
check_cluster_versions(void)
|
check_cluster_versions(void)
|
||||||
{
|
{
|
||||||
|
prep_status("Checking cluster versions");
|
||||||
|
|
||||||
/* get old and new cluster versions */
|
/* get old and new cluster versions */
|
||||||
old_cluster.major_version = get_major_server_version(&old_cluster);
|
old_cluster.major_version = get_major_server_version(&old_cluster);
|
||||||
new_cluster.major_version = get_major_server_version(&new_cluster);
|
new_cluster.major_version = get_major_server_version(&new_cluster);
|
||||||
@ -235,10 +238,26 @@ check_cluster_versions(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* We can't allow downgrading because we use the target pg_dumpall, and
|
* We can't allow downgrading because we use the target pg_dumpall, and
|
||||||
* pg_dumpall cannot operate on new datbase versions, only older versions.
|
* pg_dumpall cannot operate on new database versions, only older versions.
|
||||||
*/
|
*/
|
||||||
if (old_cluster.major_version > new_cluster.major_version)
|
if (old_cluster.major_version > new_cluster.major_version)
|
||||||
pg_log(PG_FATAL, "This utility cannot be used to downgrade to older major PostgreSQL versions.\n");
|
pg_log(PG_FATAL, "This utility cannot be used to downgrade to older major PostgreSQL versions.\n");
|
||||||
|
|
||||||
|
/* get old and new binary versions */
|
||||||
|
get_bin_version(&old_cluster);
|
||||||
|
get_bin_version(&new_cluster);
|
||||||
|
|
||||||
|
/* Ensure binaries match the designated data directories */
|
||||||
|
if (GET_MAJOR_VERSION(old_cluster.major_version) !=
|
||||||
|
GET_MAJOR_VERSION(old_cluster.bin_version))
|
||||||
|
pg_log(PG_FATAL,
|
||||||
|
"Old cluster data and binary directories are from different major versions.\n");
|
||||||
|
if (GET_MAJOR_VERSION(new_cluster.major_version) !=
|
||||||
|
GET_MAJOR_VERSION(new_cluster.bin_version))
|
||||||
|
pg_log(PG_FATAL,
|
||||||
|
"New cluster data and binary directories are from different major versions.\n");
|
||||||
|
|
||||||
|
check_ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -754,3 +773,32 @@ check_for_support_lib(ClusterInfo *cluster)
|
|||||||
|
|
||||||
fclose(lib_test);
|
fclose(lib_test);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_bin_version(ClusterInfo *cluster)
|
||||||
|
{
|
||||||
|
char cmd[MAXPGPATH], cmd_output[MAX_STRING];
|
||||||
|
FILE *output;
|
||||||
|
int pre_dot, post_dot;
|
||||||
|
|
||||||
|
snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
|
||||||
|
|
||||||
|
if ((output = popen(cmd, "r")) == NULL)
|
||||||
|
pg_log(PG_FATAL, "Could not get pg_ctl version data: %s\n",
|
||||||
|
getErrorText(errno));
|
||||||
|
|
||||||
|
fgets(cmd_output, sizeof(cmd_output), output);
|
||||||
|
|
||||||
|
pclose(output);
|
||||||
|
|
||||||
|
/* Remove trailing newline */
|
||||||
|
if (strchr(cmd_output, '\n') != NULL)
|
||||||
|
*strchr(cmd_output, '\n') = '\0';
|
||||||
|
|
||||||
|
if (sscanf(cmd_output, "%*s %*s %d.%d", &pre_dot, &post_dot) != 2)
|
||||||
|
pg_log(PG_FATAL, "could not get version from %s\n", cmd);
|
||||||
|
|
||||||
|
cluster->bin_version = (pre_dot * 100 + post_dot) * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -184,6 +184,7 @@ typedef struct
|
|||||||
unsigned short port; /* port number where postmaster is waiting */
|
unsigned short port; /* port number where postmaster is waiting */
|
||||||
uint32 major_version; /* PG_VERSION of cluster */
|
uint32 major_version; /* PG_VERSION of cluster */
|
||||||
char major_version_str[64]; /* string PG_VERSION of cluster */
|
char major_version_str[64]; /* string PG_VERSION of cluster */
|
||||||
|
uint32 bin_version; /* version returned from pg_ctl */
|
||||||
Oid pg_database_oid; /* OID of pg_database relation */
|
Oid pg_database_oid; /* OID of pg_database relation */
|
||||||
char *tablespace_suffix; /* directory specification */
|
char *tablespace_suffix; /* directory specification */
|
||||||
} ClusterInfo;
|
} ClusterInfo;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user