mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Make pg_basebackup work with pre-9.3 servers, and add server version check.
A new 'starttli' field was added to the response of BASE_BACKUP command. Make pg_basebackup tolerate the case that it's missing, so that it still works with older servers. Add an explicit check for the server version, so that you get a nicer error message if you try to use it with a pre-9.1 server. The streaming protocol message format changed in 9.3, so -X stream still won't work with pre-9.3 servers. I added a version check to ReceiveXLogStream() earlier, but write that slightly differently, so that in 9.4, it will still work with a 9.3 server. (In 9.4, the error message needs to be adjusted to "9.3 or above", though). Also, if the version check fails, don't retry.
This commit is contained in:
@@ -1223,12 +1223,16 @@ BaseBackup(void)
|
||||
{
|
||||
PGresult *res;
|
||||
char *sysidentifier;
|
||||
uint32 latesttli;
|
||||
uint32 starttli;
|
||||
char current_path[MAXPGPATH];
|
||||
char escaped_label[MAXPGPATH];
|
||||
int i;
|
||||
char xlogstart[64];
|
||||
char xlogend[64];
|
||||
int minServerMajor,
|
||||
maxServerMajor;
|
||||
int serverMajor;
|
||||
|
||||
/*
|
||||
* Connect in replication mode to the server
|
||||
@@ -1238,6 +1242,31 @@ BaseBackup(void)
|
||||
/* Error message already written in GetConnection() */
|
||||
exit(1);
|
||||
|
||||
/*
|
||||
* Check server version. BASE_BACKUP command was introduced in 9.1, so
|
||||
* we can't work with servers older than 9.1.
|
||||
*/
|
||||
minServerMajor = 901;
|
||||
maxServerMajor = PG_VERSION_NUM / 100;
|
||||
serverMajor = PQserverVersion(conn) / 100;
|
||||
if (serverMajor < minServerMajor || serverMajor > maxServerMajor)
|
||||
{
|
||||
const char *serverver = PQparameterStatus(conn, "server_version");
|
||||
fprintf(stderr, _("%s: incompatible server version %s\n"),
|
||||
progname, serverver ? serverver : "'unknown'");
|
||||
disconnect_and_exit(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* If WAL streaming was requested, also check that the server is new
|
||||
* enough for that.
|
||||
*/
|
||||
if (streamwal && !CheckServerVersionForStreaming(conn))
|
||||
{
|
||||
/* Error message already written in CheckServerVersionForStreaming() */
|
||||
disconnect_and_exit(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Build contents of recovery.conf if requested
|
||||
*/
|
||||
@@ -1262,6 +1291,7 @@ BaseBackup(void)
|
||||
disconnect_and_exit(1);
|
||||
}
|
||||
sysidentifier = pg_strdup(PQgetvalue(res, 0, 0));
|
||||
latesttli = atoi(PQgetvalue(res, 0, 1));
|
||||
PQclear(res);
|
||||
|
||||
/*
|
||||
@@ -1293,7 +1323,7 @@ BaseBackup(void)
|
||||
progname, PQerrorMessage(conn));
|
||||
disconnect_and_exit(1);
|
||||
}
|
||||
if (PQntuples(res) != 1 || PQnfields(res) < 2)
|
||||
if (PQntuples(res) != 1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("%s: server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields\n"),
|
||||
@@ -1302,8 +1332,14 @@ BaseBackup(void)
|
||||
}
|
||||
|
||||
strcpy(xlogstart, PQgetvalue(res, 0, 0));
|
||||
starttli = atoi(PQgetvalue(res, 0, 1));
|
||||
|
||||
/*
|
||||
* 9.3 and later sends the TLI of the starting point. With older servers,
|
||||
* assume it's the same as the latest timeline reported by IDENTIFY_SYSTEM.
|
||||
*/
|
||||
if (PQnfields(res) >= 2)
|
||||
starttli = atoi(PQgetvalue(res, 0, 1));
|
||||
else
|
||||
starttli = latesttli;
|
||||
PQclear(res);
|
||||
MemSet(xlogend, 0, sizeof(xlogend));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user