Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 4bd371f

Browse files
committed
Fix pg_dumpall to work for databases flagged as read-only.
pg_dumpall's charter is to be able to recreate a database cluster's contents in a virgin installation, but it was failing to honor that contract if the cluster had any ALTER DATABASE SET default_transaction_read_only settings. By including a SET command for the connection for each connection opened by pg_dumpall output, errors are avoided and the source cluster is successfully recreated. There was discussion of whether to also set this for the connection applying pg_dump output, but it was felt that it was both less appropriate in that context, and far easier to work around. Backpatch to all supported branches.
1 parent 34fa72e commit 4bd371f

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

src/bin/pg_dump/pg_dumpall.c

+14
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,9 @@ main(int argc, char *argv[])
452452
* database we're connected to at the moment is fine.
453453
*/
454454

455+
/* Restore will need to write to the target cluster */
456+
fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
457+
455458
/* Replicate encoding and std_strings in output */
456459
fprintf(OPF, "SET client_encoding = '%s';\n",
457460
pg_encoding_to_char(encoding));
@@ -1598,6 +1601,17 @@ dumpDatabases(PGconn *conn)
15981601

15991602
fprintf(OPF, "\\connect %s\n\n", fmtId(dbname));
16001603

1604+
/*
1605+
* Restore will need to write to the target cluster. This connection
1606+
* setting is emitted for pg_dumpall rather than in the code also used
1607+
* by pg_dump, so that a cluster with databases or users which have
1608+
* this flag turned on can still be replicated through pg_dumpall
1609+
* without editing the file or stream. With pg_dump there are many
1610+
* other ways to allow the file to be used, and leaving it out allows
1611+
* users to protect databases from being accidental restore targets.
1612+
*/
1613+
fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
1614+
16011615
if (filename)
16021616
fclose(OPF);
16031617

0 commit comments

Comments
 (0)