diff options
author | Kevin Grittner <kgrittn@postgresql.org> | 2013-11-30 12:06:48 -0600 |
---|---|---|
committer | Kevin Grittner <kgrittn@postgresql.org> | 2013-11-30 12:06:48 -0600 |
commit | 4bdccd8427718f9c468e5e03286252f37ea771b5 (patch) | |
tree | 89c2126765c214ab880bb40d09d43aabe09adb9e | |
parent | 9f1e051adefb2f29e757cf426b03db20d3f8a26d (diff) | |
download | postgresql-4bdccd8427718f9c468e5e03286252f37ea771b5.tar.gz postgresql-4bdccd8427718f9c468e5e03286252f37ea771b5.zip |
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.
-rw-r--r-- | src/bin/pg_dump/pg_dumpall.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index d50561f88b2..d0f53e8cc62 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -441,6 +441,9 @@ main(int argc, char *argv[]) fprintf(OPF, "\\connect postgres\n\n"); + /* Restore will need to write to the target cluster */ + fprintf(OPF, "SET default_transaction_read_only = off;\n\n"); + /* Replicate encoding and std_strings in output */ fprintf(OPF, "SET client_encoding = '%s';\n", pg_encoding_to_char(encoding)); @@ -1550,6 +1553,17 @@ dumpDatabases(PGconn *conn) fprintf(OPF, "\\connect %s\n\n", fmtId(dbname)); + /* + * Restore will need to write to the target cluster. This connection + * setting is emitted for pg_dumpall rather than in the code also used + * by pg_dump, so that a cluster with databases or users which have + * this flag turned on can still be replicated through pg_dumpall + * without editing the file or stream. With pg_dump there are many + * other ways to allow the file to be used, and leaving it out allows + * users to protect databases from being accidental restore targets. + */ + fprintf(OPF, "SET default_transaction_read_only = off;\n\n"); + if (filename) fclose(OPF); |