From 7b070e896ca835318c90b02c830a5c4844413b64 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 14 Dec 2011 09:23:17 -0500 Subject: [PATCH] Add --exclude-table-data option to pg_dump. Andrew Dunstan, reviewed by Josh Berkus, Robert Haas and Peter Geoghegan. This allows dumping of a table definition but not its data, on a per table basis. Table name patterns are supported just as for --exclude-table. --- doc/src/sgml/ref/pg_dump.sgml | 22 ++++++++++++++++++++++ src/bin/pg_dump/pg_dump.c | 25 +++++++++++++++++++++++++ src/bin/pg_dump/pg_dump.h | 1 + 3 files changed, 48 insertions(+) diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index f6f33de7e7..98f0ec68f8 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -404,6 +404,10 @@ PostgreSQL documentation Dump only the object definitions (schema), not data. + + To exclude table data for only a subset of tables in the database, + see @@ -611,6 +615,24 @@ PostgreSQL documentation + + + + + Do not dump data for any tables matching the table pattern. The pattern is + interpreted according to the same rules as for + + To exclude data for all tables in the database, see + + diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index afeae6f9f7..2fa99dd0bb 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -115,6 +115,8 @@ static SimpleStringList table_include_patterns = {NULL, NULL}; static SimpleOidList table_include_oids = {NULL, NULL}; static SimpleStringList table_exclude_patterns = {NULL, NULL}; static SimpleOidList table_exclude_oids = {NULL, NULL}; +static SimpleStringList tabledata_exclude_patterns = {NULL, NULL}; +static SimpleOidList tabledata_exclude_oids = {NULL, NULL}; /* default, if no "inclusion" switches appear, is to dump everything */ static bool include_everything = true; @@ -324,6 +326,7 @@ main(int argc, char **argv) {"column-inserts", no_argument, &column_inserts, 1}, {"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1}, {"disable-triggers", no_argument, &disable_triggers, 1}, + {"exclude-table-data", required_argument, NULL, 4}, {"inserts", no_argument, &dump_inserts, 1}, {"lock-wait-timeout", required_argument, NULL, 2}, {"no-tablespaces", no_argument, &outputNoTablespaces, 1}, @@ -487,6 +490,10 @@ main(int argc, char **argv) use_role = optarg; break; + case 4: /* exclude table(s) data */ + simple_string_list_append(&tabledata_exclude_patterns, optarg); + break; + default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -715,6 +722,10 @@ main(int argc, char **argv) } expand_table_name_patterns(&table_exclude_patterns, &table_exclude_oids); + + expand_table_name_patterns(&tabledata_exclude_patterns, + &tabledata_exclude_oids); + /* non-matching exclusion patterns aren't an error */ /* @@ -854,6 +865,7 @@ help(const char *progname) printf(_(" --column-inserts dump data as INSERT commands with column names\n")); printf(_(" --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n")); printf(_(" --disable-triggers disable triggers during data-only restore\n")); + printf(_(" --exclude-table-data=TABLE do NOT dump data for the named table(s)\n")); printf(_(" --inserts dump data as INSERT commands, rather than COPY\n")); printf(_(" --no-security-labels do not dump security label assignments\n")); printf(_(" --no-tablespaces do not dump tablespace assignments\n")); @@ -1087,6 +1099,15 @@ selectDumpableTable(TableInfo *tbinfo) simple_oid_list_member(&table_exclude_oids, tbinfo->dobj.catId.oid)) tbinfo->dobj.dump = false; + + /* If table is to be dumped, check that the data is not excluded */ + if (tbinfo->dobj.dump && ! + simple_oid_list_member(&tabledata_exclude_oids, + tbinfo->dobj.catId.oid)) + tbinfo->dobj.dumpdata = true; + else + tbinfo->dobj.dumpdata = false; + } /* @@ -1518,6 +1539,10 @@ dumpTableData(Archive *fout, TableDataInfo *tdinfo) DataDumperPtr dumpFn; char *copyStmt; + /* don't do anything if the data isn't wanted */ + if (!tbinfo->dobj.dumpdata) + return; + if (!dump_inserts) { /* Dump/restore using COPY */ diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index c248e75599..31442f1622 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -129,6 +129,7 @@ typedef struct _dumpableObject char *name; /* object name (should never be NULL) */ struct _namespaceInfo *namespace; /* containing namespace, or NULL */ bool dump; /* true if we want to dump this object */ + bool dumpdata; /* true if we want data for this object */ bool ext_member; /* true if object is member of extension */ DumpId *dependencies; /* dumpIds of objects this one depends on */ int nDeps; /* number of valid dependencies */ -- 2.40.0