Have pg_dump/pg_dumpall --binary-upgrade restore frozenids for relations
authorBruce Momjian <bruce@momjian.us>
Wed, 18 Feb 2009 12:07:08 +0000 (12:07 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 18 Feb 2009 12:07:08 +0000 (12:07 +0000)
and databases.

src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_dump.h
src/bin/pg_dump/pg_dumpall.c

index b860cbc678be7d510731f13f0dcc363b06497361..824f2fb090492eb19ee9cc3283c681e049a563bf 100644 (file)
@@ -12,7 +12,7 @@
  * by PostgreSQL
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.523 2009/02/17 22:32:54 momjian Exp $
+ *   $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.524 2009/02/18 12:07:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1585,6 +1585,7 @@ dumpDatabase(Archive *AH)
                i_encoding,
                i_collate,
                i_ctype,
+               i_frozenxid,
                i_tablespace;
    CatalogId   dbCatId;
    DumpId      dbDumpId;
@@ -1594,6 +1595,7 @@ dumpDatabase(Archive *AH)
               *collate,
               *ctype,
               *tablespace;
+   uint32      frozenxid;
 
    datname = PQdb(g_conn);
 
@@ -1609,7 +1611,7 @@ dumpDatabase(Archive *AH)
        appendPQExpBuffer(dbQry, "SELECT tableoid, oid, "
                          "(%s datdba) AS dba, "
                          "pg_encoding_to_char(encoding) AS encoding, "
-                         "datcollate, datctype, "
+                         "datcollate, datctype, datfrozenxid, "
                          "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
                      "shobj_description(oid, 'pg_database') AS description "
 
@@ -1623,7 +1625,7 @@ dumpDatabase(Archive *AH)
        appendPQExpBuffer(dbQry, "SELECT tableoid, oid, "
                          "(%s datdba) AS dba, "
                          "pg_encoding_to_char(encoding) AS encoding, "
-                         "NULL AS datcollate, NULL AS datctype, "
+                         "NULL AS datcollate, NULL AS datctype, datfrozenxid, "
                          "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
                      "shobj_description(oid, 'pg_database') AS description "
 
@@ -1637,7 +1639,7 @@ dumpDatabase(Archive *AH)
        appendPQExpBuffer(dbQry, "SELECT tableoid, oid, "
                          "(%s datdba) AS dba, "
                          "pg_encoding_to_char(encoding) AS encoding, "
-                         "NULL AS datcollate, NULL AS datctype, "
+                         "NULL AS datcollate, NULL AS datctype, datfrozenxid, "
                          "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace "
                          "FROM pg_database "
                          "WHERE datname = ",
@@ -1650,6 +1652,7 @@ dumpDatabase(Archive *AH)
                          "(%s datdba) AS dba, "
                          "pg_encoding_to_char(encoding) AS encoding, "
                          "NULL AS datcollate, NULL AS datctype, "
+                         "0 AS datfrozenxid, "
                          "NULL AS tablespace "
                          "FROM pg_database "
                          "WHERE datname = ",
@@ -1664,6 +1667,7 @@ dumpDatabase(Archive *AH)
                          "(%s datdba) AS dba, "
                          "pg_encoding_to_char(encoding) AS encoding, "
                          "NULL AS datcollate, NULL AS datctype, "
+                         "0 AS datfrozenxid, "
                          "NULL AS tablespace "
                          "FROM pg_database "
                          "WHERE datname = ",
@@ -1696,6 +1700,7 @@ dumpDatabase(Archive *AH)
    i_encoding = PQfnumber(res, "encoding");
    i_collate = PQfnumber(res, "datcollate");
    i_ctype = PQfnumber(res, "datctype");
+   i_frozenxid = PQfnumber(res, "datfrozenxid");
    i_tablespace = PQfnumber(res, "tablespace");
 
    dbCatId.tableoid = atooid(PQgetvalue(res, 0, i_tableoid));
@@ -1704,6 +1709,7 @@ dumpDatabase(Archive *AH)
    encoding = PQgetvalue(res, 0, i_encoding);
    collate = PQgetvalue(res, 0, i_collate);
    ctype = PQgetvalue(res, 0, i_ctype);
+   frozenxid = atooid(PQgetvalue(res, 0, i_frozenxid));
    tablespace = PQgetvalue(res, 0, i_tablespace);
 
    appendPQExpBuffer(creaQry, "CREATE DATABASE %s WITH TEMPLATE = template0",
@@ -1728,6 +1734,15 @@ dumpDatabase(Archive *AH)
                          fmtId(tablespace));
    appendPQExpBuffer(creaQry, ";\n");
 
+   if (binary_upgrade)
+   {
+       appendPQExpBuffer(creaQry, "\n-- For binary upgrade, set datfrozenxid.\n");
+       appendPQExpBuffer(creaQry, "UPDATE pg_database\n"
+                            "SET datfrozenxid = '%u'\n"
+                            "WHERE datname = '%s';\n",
+                            frozenxid, datname);
+   }
+   
    appendPQExpBuffer(delQry, "DROP DATABASE %s;\n",
                      fmtId(datname));
 
@@ -3114,6 +3129,7 @@ getTables(int *numTables)
    int         i_relhasindex;
    int         i_relhasrules;
    int         i_relhasoids;
+   int         i_relfrozenxid;
    int         i_owning_tab;
    int         i_owning_col;
    int         i_reltablespace;
@@ -3155,6 +3171,7 @@ getTables(int *numTables)
                          "(%s c.relowner) AS rolname, "
                          "c.relchecks, c.relhastriggers, "
                          "c.relhasindex, c.relhasrules, c.relhasoids, "
+                         "c.relfrozenxid, "
                          "d.refobjid AS owning_tab, "
                          "d.refobjsubid AS owning_col, "
                          "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
@@ -3186,6 +3203,7 @@ getTables(int *numTables)
                          "(%s relowner) AS rolname, "
                          "relchecks, (reltriggers <> 0) AS relhastriggers, "
                          "relhasindex, relhasrules, relhasoids, "
+                         "relfrozenxid, "
                          "d.refobjid AS owning_tab, "
                          "d.refobjsubid AS owning_col, "
                          "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
@@ -3216,6 +3234,7 @@ getTables(int *numTables)
                          "(%s relowner) AS rolname, "
                          "relchecks, (reltriggers <> 0) AS relhastriggers, "
                          "relhasindex, relhasrules, relhasoids, "
+                         "0 AS relfrozenxid, "
                          "d.refobjid AS owning_tab, "
                          "d.refobjsubid AS owning_col, "
                          "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
@@ -3246,6 +3265,7 @@ getTables(int *numTables)
                          "(%s relowner) AS rolname, "
                          "relchecks, (reltriggers <> 0) AS relhastriggers, "
                          "relhasindex, relhasrules, relhasoids, "
+                         "0 AS relfrozenxid, "
                          "d.refobjid AS owning_tab, "
                          "d.refobjsubid AS owning_col, "
                          "NULL AS reltablespace, "
@@ -3272,6 +3292,7 @@ getTables(int *numTables)
                          "(%s relowner) AS rolname, "
                          "relchecks, (reltriggers <> 0) AS relhastriggers, "
                          "relhasindex, relhasrules, relhasoids, "
+                         "0 AS relfrozenxid, "
                          "NULL::oid AS owning_tab, "
                          "NULL::int4 AS owning_col, "
                          "NULL AS reltablespace, "
@@ -3293,6 +3314,7 @@ getTables(int *numTables)
                          "relchecks, (reltriggers <> 0) AS relhastriggers, "
                          "relhasindex, relhasrules, "
                          "'t'::bool AS relhasoids, "
+                         "0 AS relfrozenxid, "
                          "NULL::oid AS owning_tab, "
                          "NULL::int4 AS owning_col, "
                          "NULL AS reltablespace, "
@@ -3324,6 +3346,7 @@ getTables(int *numTables)
                          "relchecks, (reltriggers <> 0) AS relhastriggers, "
                          "relhasindex, relhasrules, "
                          "'t'::bool AS relhasoids, "
+                         "0 as relfrozenxid, "
                          "NULL::oid AS owning_tab, "
                          "NULL::int4 AS owning_col, "
                          "NULL AS reltablespace, "
@@ -3367,6 +3390,7 @@ getTables(int *numTables)
    i_relhasindex = PQfnumber(res, "relhasindex");
    i_relhasrules = PQfnumber(res, "relhasrules");
    i_relhasoids = PQfnumber(res, "relhasoids");
+   i_relfrozenxid = PQfnumber(res, "relfrozenxid");
    i_owning_tab = PQfnumber(res, "owning_tab");
    i_owning_col = PQfnumber(res, "owning_col");
    i_reltablespace = PQfnumber(res, "reltablespace");
@@ -3404,6 +3428,7 @@ getTables(int *numTables)
        tblinfo[i].hasrules = (strcmp(PQgetvalue(res, i, i_relhasrules), "t") == 0);
        tblinfo[i].hastriggers = (strcmp(PQgetvalue(res, i, i_relhastriggers), "t") == 0);
        tblinfo[i].hasoids = (strcmp(PQgetvalue(res, i, i_relhasoids), "t") == 0);
+       tblinfo[i].frozenxid = atooid(PQgetvalue(res, i, i_relfrozenxid));
        tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
        if (PQgetisnull(res, i, i_owning_tab))
        {
@@ -9860,6 +9885,15 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                                         tbinfo->dobj.name);
                }
            }
+           appendPQExpBuffer(q, "\n-- For binary upgrade, set relfrozenxid.\n");
+           appendPQExpBuffer(q, "UPDATE pg_class\n"
+                                "SET relfrozenxid = '%u'\n"
+                                "WHERE relname = '%s'\n"
+                                "  AND relnamespace = "
+                                "(SELECT oid FROM pg_namespace "
+                                "WHERE nspname = CURRENT_SCHEMA);\n",
+                                tbinfo->frozenxid,
+                                tbinfo->dobj.name);
        }
    
        /* Loop dumping statistics and storage statements */
index ffa3c2ea9eff11c4f0f259eddc356c989b238845..9a38645fd532815e6d1887b9ae9c0a523a6a2fe7 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.151 2009/02/17 15:41:50 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.152 2009/02/18 12:07:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -226,6 +226,7 @@ typedef struct _tableInfo
    bool        hasrules;       /* does it have any rules? */
    bool        hastriggers;    /* does it have any triggers? */
    bool        hasoids;        /* does it have OIDs? */
+   uint32      frozenxid;      /* for restore frozen xid */
    int         ncheck;         /* # of CHECK expressions */
    /* these two are set only if table is a sequence owned by a column: */
    Oid         owning_tab;     /* OID of table owning sequence */
index edc20b6f4465b12f100f5b43e3db67b8c53d56f4..d37e254c257cad1e1c2fd4e5be3920b6e7478b8c 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.114 2009/02/17 15:41:50 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.115 2009/02/18 12:07:08 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,7 +27,7 @@ int           optreset;
 #endif
 
 #include "dumputils.h"
-
+#include "pg_backup.h"
 
 /* version string we expect back from pg_dump */
 #define PGDUMP_VERSIONSTR "pg_dump (PostgreSQL) " PG_VERSION "\n"
@@ -71,6 +71,8 @@ static int    server_version;
 static FILE *OPF;
 static char *filename = NULL;
 
+static int binary_upgrade = 0;
+
 int
 main(int argc, char *argv[])
 {
@@ -90,7 +92,6 @@ main(int argc, char *argv[])
    const char *std_strings;
    int         c,
                ret;
-   int         binary_upgrade = 0;
 
    struct option long_options[] = {
        {"binary-upgrade", no_argument, &binary_upgrade, 1},    /* not documented */
@@ -937,7 +938,7 @@ dumpCreateDB(PGconn *conn)
                           "SELECT datname, "
                           "coalesce(rolname, (select rolname from pg_authid where oid=(select datdba from pg_database where datname='template0'))), "
                           "pg_encoding_to_char(d.encoding), "
-                          "datcollate, datctype, "
+                          "datcollate, datctype, datfrozenxid, "
                           "datistemplate, datacl, datconnlimit, "
                           "(SELECT spcname FROM pg_tablespace t WHERE t.oid = d.dattablespace) AS dattablespace "
              "FROM pg_database d LEFT JOIN pg_authid u ON (datdba = u.oid) "
@@ -947,7 +948,7 @@ dumpCreateDB(PGconn *conn)
                           "SELECT datname, "
                           "coalesce(rolname, (select rolname from pg_authid where oid=(select datdba from pg_database where datname='template0'))), "
                           "pg_encoding_to_char(d.encoding), "
-                          "null::text AS datcollate, null::text AS datctype, "
+                          "null::text AS datcollate, null::text AS datctype, datfrozenxid, "
                           "datistemplate, datacl, datconnlimit, "
                           "(SELECT spcname FROM pg_tablespace t WHERE t.oid = d.dattablespace) AS dattablespace "
              "FROM pg_database d LEFT JOIN pg_authid u ON (datdba = u.oid) "
@@ -957,7 +958,7 @@ dumpCreateDB(PGconn *conn)
                           "SELECT datname, "
                           "coalesce(usename, (select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), "
                           "pg_encoding_to_char(d.encoding), "
-                          "null::text AS datcollate, null::text AS datctype, "
+                          "null::text AS datcollate, null::text AS datctype, datfrozenxid, "
                           "datistemplate, datacl, -1 as datconnlimit, "
                           "(SELECT spcname FROM pg_tablespace t WHERE t.oid = d.dattablespace) AS dattablespace "
           "FROM pg_database d LEFT JOIN pg_shadow u ON (datdba = usesysid) "
@@ -967,7 +968,7 @@ dumpCreateDB(PGconn *conn)
                           "SELECT datname, "
                           "coalesce(usename, (select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), "
                           "pg_encoding_to_char(d.encoding), "
-                          "null::text AS datcollate, null::text AS datctype, "
+                          "null::text AS datcollate, null::text AS datctype, datfrozenxid, "
                           "datistemplate, datacl, -1 as datconnlimit, "
                           "'pg_default' AS dattablespace "
           "FROM pg_database d LEFT JOIN pg_shadow u ON (datdba = usesysid) "
@@ -979,7 +980,7 @@ dumpCreateDB(PGconn *conn)
                    "(select usename from pg_shadow where usesysid=datdba), "
                           "(select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), "
                           "pg_encoding_to_char(d.encoding), "
-                          "null::text AS datcollate, null::text AS datctype, "
+                          "null::text AS datcollate, null::text AS datctype, 0 AS datfrozenxid"
                           "datistemplate, '' as datacl, -1 as datconnlimit, "
                           "'pg_default' AS dattablespace "
                           "FROM pg_database d "
@@ -994,7 +995,7 @@ dumpCreateDB(PGconn *conn)
                           "SELECT datname, "
                    "(select usename from pg_shadow where usesysid=datdba), "
                           "pg_encoding_to_char(d.encoding), "
-                          "null::text AS datcollate, null::text AS datctype, "
+                          "null::text AS datcollate, null::text AS datctype, 0 AS datfrozenxid"
                           "'f' as datistemplate, "
                           "'' as datacl, -1 as datconnlimit, "
                           "'pg_default' AS dattablespace "
@@ -1009,10 +1010,11 @@ dumpCreateDB(PGconn *conn)
        char       *dbencoding = PQgetvalue(res, i, 2);
        char       *dbcollate = PQgetvalue(res, i, 3);
        char       *dbctype = PQgetvalue(res, i, 4);
-       char       *dbistemplate = PQgetvalue(res, i, 5);
-       char       *dbacl = PQgetvalue(res, i, 6);
-       char       *dbconnlimit = PQgetvalue(res, i, 7);
-       char       *dbtablespace = PQgetvalue(res, i, 8);
+       uint32     dbfrozenxid = atooid(PQgetvalue(res, i, 5));
+       char       *dbistemplate = PQgetvalue(res, i, 6);
+       char       *dbacl = PQgetvalue(res, i, 7);
+       char       *dbconnlimit = PQgetvalue(res, i, 8);
+       char       *dbtablespace = PQgetvalue(res, i, 9);
        char       *fdbname;
 
        fdbname = strdup(fmtId(dbname));
@@ -1076,6 +1078,15 @@ dumpCreateDB(PGconn *conn)
                appendStringLiteralConn(buf, dbname, conn);
                appendPQExpBuffer(buf, ";\n");
            }
+
+           if (binary_upgrade)
+           {
+               appendPQExpBuffer(buf, "\n-- For binary upgrade, set datfrozenxid.\n");
+               appendPQExpBuffer(buf, "UPDATE pg_database\n"
+                                    "SET datfrozenxid = '%u'\n"
+                                    "WHERE datname = '%s';\n",
+                                    dbfrozenxid, fdbname);
+           }
        }
 
        if (!skip_acls &&