mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
In pg_dump, force reconnection after issuing ALTER DATABASE SET command(s).
The folly of not doing this was exposed by the buildfarm: in some cases, the GUC settings applied through ALTER DATABASE SET may be essential to interpreting the reloaded data correctly. Another argument why we can't really get away with the scheme proposed in commit b3f840120 is that it cannot work for parallel restore: even if the parent process manages to hang onto the previous GUC state, worker processes would see the state post-ALTER-DATABASE. (Perhaps we could have dodged that bullet by delaying DATABASE PROPERTIES restoration to the end of the run, but that does nothing for the data semantics problem.) This leaves us with no solution for the default_transaction_read_only issue that commit 4bd371f6f intended to work around, other than "you gotta remove such settings before dumping/upgrading". However, in view of the fact that parallel restore broke that hack years ago and no one has noticed, it's fair to question how many people care. I'm unexcited about adding a large dollop of new complexity to handle that corner case. This would be a one-liner fix, except it turns out that ReconnectToServer tries to optimize away "redundant" reconnections. While that may have been valuable when coded, a quick survey of current callers shows that there are no cases where that's actually useful, so just remove that check. While at it, remove the function's useless return value. Discussion: https://postgr.es/m/12453.1516655001@sss.pgh.pa.us
This commit is contained in:
parent
a541dbb6fa
commit
160a4f62ee
@ -833,8 +833,13 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we created a DB, connect to it... */
|
/*
|
||||||
if (strcmp(te->desc, "DATABASE") == 0)
|
* If we created a DB, connect to it. Also, if we changed DB
|
||||||
|
* properties, reconnect to ensure that relevant GUC settings are
|
||||||
|
* applied to our session.
|
||||||
|
*/
|
||||||
|
if (strcmp(te->desc, "DATABASE") == 0 ||
|
||||||
|
strcmp(te->desc, "DATABASE PROPERTIES") == 0)
|
||||||
{
|
{
|
||||||
PQExpBufferData connstr;
|
PQExpBufferData connstr;
|
||||||
|
|
||||||
|
@ -448,7 +448,7 @@ extern void InitArchiveFmt_Tar(ArchiveHandle *AH);
|
|||||||
|
|
||||||
extern bool isValidTarHeader(char *header);
|
extern bool isValidTarHeader(char *header);
|
||||||
|
|
||||||
extern int ReconnectToServer(ArchiveHandle *AH, const char *dbname, const char *newUser);
|
extern void ReconnectToServer(ArchiveHandle *AH, const char *dbname, const char *newUser);
|
||||||
extern void DropBlobIfExists(ArchiveHandle *AH, Oid oid);
|
extern void DropBlobIfExists(ArchiveHandle *AH, Oid oid);
|
||||||
|
|
||||||
void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH);
|
void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH);
|
||||||
|
@ -76,13 +76,9 @@ _check_database_version(ArchiveHandle *AH)
|
|||||||
/*
|
/*
|
||||||
* Reconnect to the server. If dbname is not NULL, use that database,
|
* Reconnect to the server. If dbname is not NULL, use that database,
|
||||||
* else the one associated with the archive handle. If username is
|
* else the one associated with the archive handle. If username is
|
||||||
* not NULL, use that user name, else the one from the handle. If
|
* not NULL, use that user name, else the one from the handle.
|
||||||
* both the database and the user match the existing connection already,
|
|
||||||
* nothing will be done.
|
|
||||||
*
|
|
||||||
* Returns 1 in any case.
|
|
||||||
*/
|
*/
|
||||||
int
|
void
|
||||||
ReconnectToServer(ArchiveHandle *AH, const char *dbname, const char *username)
|
ReconnectToServer(ArchiveHandle *AH, const char *dbname, const char *username)
|
||||||
{
|
{
|
||||||
PGconn *newConn;
|
PGconn *newConn;
|
||||||
@ -99,11 +95,6 @@ ReconnectToServer(ArchiveHandle *AH, const char *dbname, const char *username)
|
|||||||
else
|
else
|
||||||
newusername = username;
|
newusername = username;
|
||||||
|
|
||||||
/* Let's see if the request is already satisfied */
|
|
||||||
if (strcmp(newdbname, PQdb(AH->connection)) == 0 &&
|
|
||||||
strcmp(newusername, PQuser(AH->connection)) == 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
newConn = _connectDB(AH, newdbname, newusername);
|
newConn = _connectDB(AH, newdbname, newusername);
|
||||||
|
|
||||||
/* Update ArchiveHandle's connCancel before closing old connection */
|
/* Update ArchiveHandle's connCancel before closing old connection */
|
||||||
@ -111,8 +102,6 @@ ReconnectToServer(ArchiveHandle *AH, const char *dbname, const char *username)
|
|||||||
|
|
||||||
PQfinish(AH->connection);
|
PQfinish(AH->connection);
|
||||||
AH->connection = newConn;
|
AH->connection = newConn;
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2819,10 +2819,11 @@ dumpDatabase(Archive *fout)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Now construct a DATABASE PROPERTIES archive entry to restore any
|
* Now construct a DATABASE PROPERTIES archive entry to restore any
|
||||||
* non-default database-level properties. We want to do this after
|
* non-default database-level properties. (The reason this must be
|
||||||
* reconnecting so that these properties won't apply during the restore
|
* separate is that we cannot put any additional commands into the TOC
|
||||||
* session. In this way, restoring works even if there is, say, an ALTER
|
* entry that has CREATE DATABASE. pg_restore would execute such a group
|
||||||
* DATABASE SET that turns on default_transaction_read_only.
|
* in an implicit transaction block, and the backend won't allow CREATE
|
||||||
|
* DATABASE in that context.)
|
||||||
*/
|
*/
|
||||||
resetPQExpBuffer(creaQry);
|
resetPQExpBuffer(creaQry);
|
||||||
resetPQExpBuffer(delQry);
|
resetPQExpBuffer(delQry);
|
||||||
@ -2854,8 +2855,7 @@ dumpDatabase(Archive *fout)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* We stick this binary-upgrade query into the DATABASE PROPERTIES archive
|
* We stick this binary-upgrade query into the DATABASE PROPERTIES archive
|
||||||
* entry, too. It can't go into the DATABASE entry because that would
|
* entry, too, for lack of a better place.
|
||||||
* result in an implicit transaction block around the CREATE DATABASE.
|
|
||||||
*/
|
*/
|
||||||
if (dopt->binary_upgrade)
|
if (dopt->binary_upgrade)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user