Allow dumping of roles or tablespaces
Per discussion on -hackers, the attached patch introduces an optional
parameter to pg_dumpall's -g (--globals-only) option to allow roles or
tablespaces to be dumped on their own.
eg.
pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only
Regards, Dave.
Attachments:
pg_dumpall_global_objects.difftext/plain; name=pg_dumpall_global_objects.diff; x-mac-creator=0; x-mac-type=0Download+60-43
Dave Page <dpage@postgresql.org> writes:
pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only
This seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like
--roles-only
--tablespaces-only
--globals-only
Not sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...
regards, tom lane
Tom Lane wrote:
Dave Page <dpage@postgresql.org> writes:
pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces onlyThis seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like--roles-only
--tablespaces-only
--globals-onlyNot sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...
I agree. In fact, as I understand the patch it would also allow "-g r"
and "-g t", and that seems ugly too.
We don't have to have a short form for every long option - e.g. initdb
has several like --no-locale for which there is no corresponding short
form. I suggest we make the new options long form only, along the lines
Tom suggests.
cheers
andrew
Andrew Dunstan wrote:
Tom Lane wrote:
Dave Page <dpage@postgresql.org> writes:
pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces onlyThis seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like--roles-only
--tablespaces-only
--globals-onlyNot sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...I agree. In fact, as I understand the patch it would also allow "-g r"
and "-g t", and that seems ugly too.We don't have to have a short form for every long option - e.g. initdb
has several like --no-locale for which there is no corresponding short
form. I suggest we make the new options long form only, along the lines
Tom suggests.
OK, no probs. I'll fix it up as Tom suggests.
Regards, Dave.
Am Freitag, 12. Januar 2007 15:08 schrieb Dave Page:
pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only
Also note that optional argument specifications in getopt like "g::" are not
portable, so this cannot be implemented in the first place.
--
Peter Eisentraut
http://developer.postgresql.org/~petere/
Tom Lane wrote:
Dave Page <dpage@postgresql.org> writes:
pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces onlyThis seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like--roles-only
--tablespaces-only
--globals-onlyNot sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...
Revised patch attached - it now has
-r --roles-only
-t --tablespaces-only
-g --globals-only
Regards, Dave.
Attachments:
pg_dumpall_global_objects2.difftext/plain; name=pg_dumpall_global_objects2.diff; x-mac-creator=0; x-mac-type=0Download+100-38
Patch applied. Thanks.
---------------------------------------------------------------------------
Dave Page wrote:
Tom Lane wrote:
Dave Page <dpage@postgresql.org> writes:
pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces onlyThis seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like--roles-only
--tablespaces-only
--globals-onlyNot sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...Revised patch attached - it now has
-r --roles-only
-t --tablespaces-only
-g --globals-onlyRegards, Dave.
Index: doc/src/sgml/ref/pg_dumpall.sgml =================================================================== RCS file: /projects/cvsroot/pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v retrieving revision 1.58 diff -c -r1.58 pg_dumpall.sgml *** doc/src/sgml/ref/pg_dumpall.sgml 7 Oct 2006 20:59:04 -0000 1.58 --- doc/src/sgml/ref/pg_dumpall.sgml 15 Jan 2007 09:10:31 -0000 *************** *** 134,140 **** <term><option>--globals-only</option></term> <listitem> <para> ! Dump only global objects (users and groups), no databases. </para> </listitem> </varlistentry> --- 134,140 ---- <term><option>--globals-only</option></term> <listitem> <para> ! Dump only global objects (roles and tablespaces), no databases. </para> </listitem> </varlistentry> *************** *** 194,199 **** --- 194,209 ---- </varlistentry><varlistentry> + <term><option>-r</option></term> + <term><option>--roles-only</option></term> + <listitem> + <para> + Dump only roles, no databases or tablespaces. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><option>-s</option></term> <term><option>--schema-only</option></term> <listitem> *************** *** 217,222 **** --- 227,242 ---- </varlistentry><varlistentry> + <term><option>-t</option></term> + <term><option>--tablespaces-only</option></term> + <listitem> + <para> + Dump only tablespaces, no databases or roles. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><option>-v</></term> <term><option>--verbose</></term> <listitem> Index: src/bin/pg_dump/pg_dumpall.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v retrieving revision 1.86 diff -c -r1.86 pg_dumpall.c *** src/bin/pg_dump/pg_dumpall.c 5 Jan 2007 22:19:48 -0000 1.86 --- src/bin/pg_dump/pg_dumpall.c 15 Jan 2007 09:10:33 -0000 *************** *** 78,83 **** --- 78,85 ---- bool force_password = false; bool data_only = false; bool globals_only = false; + bool roles_only = false; + bool tablespaces_only = false; bool schema_only = false; PGconn *conn; int encoding; *************** *** 97,107 **** {"oids", no_argument, NULL, 'o'}, {"no-owner", no_argument, NULL, 'O'}, {"port", required_argument, NULL, 'p'}, ! {"password", no_argument, NULL, 'W'}, {"schema-only", no_argument, NULL, 's'}, {"superuser", required_argument, NULL, 'S'}, {"username", required_argument, NULL, 'U'}, {"verbose", no_argument, NULL, 'v'}, {"no-privileges", no_argument, NULL, 'x'}, {"no-acl", no_argument, NULL, 'x'},--- 99,111 ---- {"oids", no_argument, NULL, 'o'}, {"no-owner", no_argument, NULL, 'O'}, {"port", required_argument, NULL, 'p'}, ! {"roles-only", no_argument, NULL, 'r'}, {"schema-only", no_argument, NULL, 's'}, {"superuser", required_argument, NULL, 'S'}, + {"tablespaces-only", no_argument, NULL, 't'}, {"username", required_argument, NULL, 'U'}, {"verbose", no_argument, NULL, 'v'}, + {"password", no_argument, NULL, 'W'}, {"no-privileges", no_argument, NULL, 'x'}, {"no-acl", no_argument, NULL, 'x'},***************
*** 161,167 ****pgdumpopts = createPQExpBuffer();
! while ((c = getopt_long(argc, argv, "acdDgh:ioOp:sS:U:vWxX:", long_options, &optindex)) != -1) { switch (c) { --- 165,171 ----pgdumpopts = createPQExpBuffer();
! while ((c = getopt_long(argc, argv, "acdDgh:ioOp:rsS:tU:vWxX:", long_options, &optindex)) != -1) { switch (c) { *************** *** 214,219 **** --- 218,227 ---- appendPQExpBuffer(pgdumpopts, " -p \"%s\"", pgport); #endif break; + + case 'r': + roles_only = true; + break;case 's': schema_only = true; *************** *** 227,232 **** --- 235,244 ---- appendPQExpBuffer(pgdumpopts, " -S \"%s\"", optarg); #endif break; + + case 't': + tablespaces_only = true; + break;case 'U': pguser = optarg; *************** *** 295,300 **** --- 307,340 ---- progname); exit(1); } + + /* Make sure the user hasn't specified a mix of globals-only options */ + if (globals_only && roles_only) + { + fprintf(stderr, _("%s: --globals-only and --roles-only cannot be used together\n"), + progname); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), + progname); + exit(1); + } + + if (globals_only && tablespaces_only) + { + fprintf(stderr, _("%s: --globals-only and --tablespaces-only cannot be used together\n"), + progname); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), + progname); + exit(1); + } + + if (roles_only && tablespaces_only) + { + fprintf(stderr, _("%s: --roles-only and --tablespaces-only cannot be used together\n"), + progname); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), + progname); + exit(1); + }/*
* First try to connect to database "postgres", and failing that
***************
*** 332,356 ****
printf("SET escape_string_warning = 'off';\n");
printf("\n");! /* Dump roles (users) */
! dumpRoles(conn);! /* Dump role memberships --- need different method for pre-8.1 */
! if (server_version >= 80100)
! dumpRoleMembership(conn);
! else
! dumpGroups(conn);! /* Dump tablespaces */
! if (server_version >= 80000)
! dumpTablespaces(conn);/* Dump CREATE DATABASE commands */
! if (!globals_only)
dumpCreateDB(conn);
}! if (!globals_only)
dumpDatabases(conn);PQfinish(conn); --- 372,402 ---- printf("SET escape_string_warning = 'off';\n"); printf("\n");! if (!tablespaces_only)
! {
! /* Dump roles (users) */
! dumpRoles(conn);! /* Dump role memberships --- need different method for pre-8.1 */
! if (server_version >= 80100)
! dumpRoleMembership(conn);
! else
! dumpGroups(conn);
! }! if (!roles_only)
! {
! /* Dump tablespaces */
! if (server_version >= 80000)
! dumpTablespaces(conn);
! }/* Dump CREATE DATABASE commands */
! if (!globals_only && !roles_only && !tablespaces_only)
dumpCreateDB(conn);
}! if (!globals_only && !roles_only && !tablespaces_only)
dumpDatabases(conn);PQfinish(conn); *************** *** 381,391 **** printf(_(" -c, --clean clean (drop) databases prior to create\n")); printf(_(" -d, --inserts dump data as INSERT, rather than COPY, commands\n")); printf(_(" -D, --column-inserts dump data as INSERT commands with column names\n")); ! printf(_(" -g, --globals-only dump only global objects, no databases\n")); printf(_(" -o, --oids include OIDs in dump\n")); printf(_(" -O, --no-owner skip restoration of object ownership\n")); printf(_(" -s, --schema-only dump only the schema, no data\n")); printf(_(" -S, --superuser=NAME specify the superuser user name to use in the dump\n")); printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n")); printf(_(" --disable-dollar-quoting\n" " disable dollar quoting, use SQL standard quoting\n")); --- 427,439 ---- printf(_(" -c, --clean clean (drop) databases prior to create\n")); printf(_(" -d, --inserts dump data as INSERT, rather than COPY, commands\n")); printf(_(" -D, --column-inserts dump data as INSERT commands with column names\n")); ! printf(_(" -g, --globals-only dump only global objects, no databases.\n")); printf(_(" -o, --oids include OIDs in dump\n")); printf(_(" -O, --no-owner skip restoration of object ownership\n")); + printf(_(" -r, --roles-only dump only roles, no databases or tablespaces.\n")); printf(_(" -s, --schema-only dump only the schema, no data\n")); printf(_(" -S, --superuser=NAME specify the superuser user name to use in the dump\n")); + printf(_(" -t, --tablespaces-only dump only tablespaces, no databases or roles.\n")); printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n")); printf(_(" --disable-dollar-quoting\n" " disable dollar quoting, use SQL standard quoting\n"));
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings
--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com
+ If your life is a hard drive, Christ can be your backup. +