Re: Patch for pg_upgrade to turn off autovacuum

Поиск
Список
Период
Сортировка
Искать

Re: Patch for pg_upgrade to turn off autovacuum

От:
Tom Lane <tgl@sss.pgh.pa.us>
Дата:

Re: Problem with pg_upgrade?

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: Problem with pg_upgrade?

От:
Alvaro Herrera <alvherre@commandprompt.com>
Дата:

Re: Problem with pg_upgrade?

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: Problem with pg_upgrade?

От:
Peter Eisentraut <peter_e@gmx.net>
Дата:

Re: Problem with pg_upgrade?

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: Problem with pg_upgrade?

От:
Peter Eisentraut <peter_e@gmx.net>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Alvaro Herrera <alvherre@commandprompt.com>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Jeff Davis <pgsql@j-davis.com>
Дата:

Re: pg_upgrade bug found!

От:
Tom Lane <tgl@sss.pgh.pa.us>
Дата:

Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Problem with pg_upgrade?

От:
Bruce Momjian <bruce@momjian.us>
Дата:

pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:
Bruce Momjian wrote:
> OK, thanks to RhodiumToad on IRC, I was able to determine the cause of
> the two reported pg_upgrade problems he saw via IRC.  It seems toast
> tables have xids and pg_dump is not preserving the toast relfrozenxids
> as it should.  Heap tables have preserved relfrozenxids, but if you
> update a heap row but don't change the toast value, and the old heap row
> is later removed, the toast table can have an older relfrozenxids than
> the heap table.
> 
> The fix for this is to have pg_dump preserve toast relfrozenxids, which
> can be easily added and backpatched.  We might want to push a 9.0.4 for
> this.  Second, we need to find a way for people to detect and fix
> existing systems that have this problem, perhaps looming when the
> pg_class relfrozenxid passes the toast relfrozenxid, and thirdly, we
> need to figure out how to get this information to users.  Perhaps the
> communication comes through the 9.0.4 release announcement.

I am not sure how to interpret the lack of replies to this email. 
Either it is confidence, shock, or we told you so.  ;-)

Anyway, the attached patch fixes the problem.  The fix is for pg_dump's
binary upgrade mode.  This would need to be backpatched back to 8.4
because pg_migrator needs this too.

I have added a personal regression test to show which
pg_class.relfrozenxid values are not preserved, and with this patch the
only ones not preserved are toast tables used by system tables, which
are not copied from the old cluster (FirstNormalObjectId = 16384).  I am
attaching that old/new pg_class.relfrozenxid diff as well.

Any idea how to correct existing systems?  Would VACUUM FREEZE of just
the toast tables work?  I perhaps could create a short DO block that
would vacuum freeze just toast tables;  it would have to be run in every
database.

-- 
  Bruce Momjian          http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
new file mode 100644
index 3f6e77b..1ccdb4d
*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
*************** getTables(int *numTables)
*** 3812,3817 ****
--- 3812,3819 ----
  	int			i_relhasrules;
  	int			i_relhasoids;
  	int			i_relfrozenxid;
+ 	int			i_toastoid;
+ 	int			i_toastfrozenxid;
  	int			i_relpersistence;
  	int			i_owning_tab;
  	int			i_owning_col;
*************** getTables(int *numTables)
*** 3855,3861 ****
  						  "(%s c.relowner) AS rolname, "
  						  "c.relchecks, c.relhastriggers, "
  						  "c.relhasindex, c.relhasrules, c.relhasoids, "
! 						  "c.relfrozenxid, c.relpersistence, "
  						  "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
--- 3857,3865 ----
  						  "(%s c.relowner) AS rolname, "
  						  "c.relchecks, c.relhastriggers, "
  						  "c.relhasindex, c.relhasrules, c.relhasoids, "
! 						  "c.relfrozenxid, tc.oid AS toid, "
! 						  "tc.relfrozenxid AS tfrozenxid, "
! 						  "c.relpersistence, "
  						  "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
*************** getTables(int *numTables)
*** 3889,3895 ****
  						  "(%s c.relowner) AS rolname, "
  						  "c.relchecks, c.relhastriggers, "
  						  "c.relhasindex, c.relhasrules, c.relhasoids, "
! 						  "c.relfrozenxid, 'p' AS relpersistence, "
  						  "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
--- 3893,3901 ----
  						  "(%s c.relowner) AS rolname, "
  						  "c.relchecks, c.relhastriggers, "
  						  "c.relhasindex, c.relhasrules, c.relhasoids, "
! 						  "c.relfrozenxid, tc.oid AS toid, "
! 						  "tc.relfrozenxid AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
*************** getTables(int *numTables)
*** 3922,3928 ****
  						  "(%s c.relowner) AS rolname, "
  						  "c.relchecks, c.relhastriggers, "
  						  "c.relhasindex, c.relhasrules, c.relhasoids, "
! 						  "c.relfrozenxid, 'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
--- 3928,3936 ----
  						  "(%s c.relowner) AS rolname, "
  						  "c.relchecks, c.relhastriggers, "
  						  "c.relhasindex, c.relhasrules, c.relhasoids, "
! 						  "c.relfrozenxid, tc.oid AS toid, "
! 						  "tc.relfrozenxid AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
*************** getTables(int *numTables)
*** 3955,3961 ****
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "relfrozenxid, 'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
--- 3963,3972 ----
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "relfrozenxid, "
! 						  "0 AS toid, "
! 						  "0 AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
*************** getTables(int *numTables)
*** 3987,3993 ****
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "0 AS relfrozenxid, 'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
--- 3998,4007 ----
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "0 AS relfrozenxid, "
! 						  "0 AS toid, "
! 						  "0 AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
*************** getTables(int *numTables)
*** 4019,4025 ****
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "0 AS relfrozenxid, 'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
--- 4033,4042 ----
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "0 AS relfrozenxid, "
! 						  "0 AS toid, "
! 						  "0 AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "d.refobjid AS owning_tab, "
  						  "d.refobjsubid AS owning_col, "
*************** getTables(int *numTables)
*** 4047,4053 ****
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "0 AS relfrozenxid, 'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "NULL::oid AS owning_tab, "
  						  "NULL::int4 AS owning_col, "
--- 4064,4073 ----
  						  "(%s relowner) AS rolname, "
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, relhasoids, "
! 						  "0 AS relfrozenxid, "
! 						  "0 AS toid, "
! 						  "0 AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "NULL::oid AS owning_tab, "
  						  "NULL::int4 AS owning_col, "
*************** getTables(int *numTables)
*** 4070,4076 ****
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, "
  						  "'t'::bool AS relhasoids, "
! 						  "0 AS relfrozenxid, 'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "NULL::oid AS owning_tab, "
  						  "NULL::int4 AS owning_col, "
--- 4090,4099 ----
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, "
  						  "'t'::bool AS relhasoids, "
! 						  "0 AS relfrozenxid, "
! 						  "0 AS toid, "
! 						  "0 AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "NULL::oid AS owning_tab, "
  						  "NULL::int4 AS owning_col, "
*************** getTables(int *numTables)
*** 4103,4109 ****
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, "
  						  "'t'::bool AS relhasoids, "
! 						  "0 as relfrozenxid, 'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "NULL::oid AS owning_tab, "
  						  "NULL::int4 AS owning_col, "
--- 4126,4135 ----
  						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
  						  "relhasindex, relhasrules, "
  						  "'t'::bool AS relhasoids, "
! 						  "0 as relfrozenxid, "
! 						  "0 AS toid, "
! 						  "0 AS tfrozenxid, "
! 						  "'p' AS relpersistence, "
  						  "NULL AS reloftype, "
  						  "NULL::oid AS owning_tab, "
  						  "NULL::int4 AS owning_col, "
*************** getTables(int *numTables)
*** 4149,4154 ****
--- 4175,4182 ----
  	i_relhasrules = PQfnumber(res, "relhasrules");
  	i_relhasoids = PQfnumber(res, "relhasoids");
  	i_relfrozenxid = PQfnumber(res, "relfrozenxid");
+ 	i_toastoid = PQfnumber(res, "toid");
+ 	i_toastfrozenxid = PQfnumber(res, "tfrozenxid");
  	i_relpersistence = PQfnumber(res, "relpersistence");
  	i_owning_tab = PQfnumber(res, "owning_tab");
  	i_owning_col = PQfnumber(res, "owning_col");
*************** getTables(int *numTables)
*** 4190,4195 ****
--- 4218,4225 ----
  		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].toast_oid = atooid(PQgetvalue(res, i, i_toastoid));
+ 		tblinfo[i].toast_frozenxid = atooid(PQgetvalue(res, i, i_toastfrozenxid));
  		if (PQgetisnull(res, i, i_reloftype))
  			tblinfo[i].reloftype = NULL;
  		else
*************** dumpTableSchema(Archive *fout, TableInfo
*** 12221,12233 ****
  				}
  			}
  
! 			appendPQExpBuffer(q, "\n-- For binary upgrade, set relfrozenxid\n");
  			appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
  							  "SET relfrozenxid = '%u'\n"
  							  "WHERE oid = ",
  							  tbinfo->frozenxid);
  			appendStringLiteralAH(q, fmtId(tbinfo->dobj.name), fout);
  			appendPQExpBuffer(q, "::pg_catalog.regclass;\n");
  		}
  
  		/* Loop dumping statistics and storage statements */
--- 12251,12273 ----
  				}
  			}
  
! 			appendPQExpBuffer(q, "\n-- For binary upgrade, set heap's relfrozenxid\n");
  			appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
  							  "SET relfrozenxid = '%u'\n"
  							  "WHERE oid = ",
  							  tbinfo->frozenxid);
  			appendStringLiteralAH(q, fmtId(tbinfo->dobj.name), fout);
  			appendPQExpBuffer(q, "::pg_catalog.regclass;\n");
+ 
+ 			if (tbinfo->toast_oid)
+ 			{
+ 				/* We preserve the toast oids, so we can use it during restore */
+ 				appendPQExpBuffer(q, "\n-- For binary upgrade, set toast's relfrozenxid\n");
+ 				appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+ 								  "SET relfrozenxid = '%u'\n"
+ 								  "WHERE oid = '%u';\n",
+ 								  tbinfo->toast_frozenxid, tbinfo->toast_oid);
+ 			}
  		}
  
  		/* Loop dumping statistics and storage statements */
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
new file mode 100644
index 113ecb1..6559e23
*** a/src/bin/pg_dump/pg_dump.h
--- b/src/bin/pg_dump/pg_dump.h
*************** typedef struct _tableInfo
*** 248,253 ****
--- 248,255 ----
  	bool		hastriggers;	/* does it have any triggers? */
  	bool		hasoids;		/* does it have OIDs? */
  	uint32		frozenxid;		/* for restore frozen xid */
+ 	Oid			toast_oid;		/* for restore toast frozen xid */
+ 	uint32		toast_frozenxid;/* for restore toast frozen xid */
  	int			ncheck;			/* # of CHECK expressions */
  	char	   *reloftype;		/* underlying type for typed table */
  	/* these two are set only if table is a sequence owned by a column: */
3c3
< postgres|654
---
> postgres|1457
6,7c6,7
< template0|654
< template1|654
---
> template0|1457
> template1|1457
11,19c11,19
< pg_toast|pg_toast_11454|654
< pg_toast|pg_toast_11459|654
< pg_toast|pg_toast_11464|654
< pg_toast|pg_toast_11469|654
< pg_toast|pg_toast_11474|654
< pg_toast|pg_toast_11479|654
< pg_toast|pg_toast_11484|654
< pg_toast|pg_toast_1255|654
< pg_toast|pg_toast_1262|654
---
> pg_toast|pg_toast_11511|1457
> pg_toast|pg_toast_11516|1457
> pg_toast|pg_toast_11521|1457
> pg_toast|pg_toast_11526|1457
> pg_toast|pg_toast_11531|1457
> pg_toast|pg_toast_11536|1457
> pg_toast|pg_toast_11541|1457
> pg_toast|pg_toast_1255|1457
> pg_toast|pg_toast_1262|1457
96,103c96,104
< pg_toast|pg_toast_2396|654
< pg_toast|pg_toast_2604|654
< pg_toast|pg_toast_2606|654
< pg_toast|pg_toast_2609|654
< pg_toast|pg_toast_2618|654
< pg_toast|pg_toast_2619|654
< pg_toast|pg_toast_2620|654
< pg_toast|pg_toast_2964|654
---
> pg_toast|pg_toast_2396|1457
> pg_toast|pg_toast_2604|1457
> pg_toast|pg_toast_2606|1457
> pg_toast|pg_toast_2609|1457
> pg_toast|pg_toast_2618|1457
> pg_toast|pg_toast_2619|1457
> pg_toast|pg_toast_2620|1457
> pg_toast|pg_toast_2964|1457
> pg_toast|pg_toast_3596|1457
279c280
< (268 rows)
---
> (269 rows)

Re: pg_upgrade bug found!

От:
Noah Misch <noah@leadboat.com>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Noah Misch <noah@leadboat.com>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:
Bruce Momjian wrote:
> Bruce Momjian wrote:
> > OK, thanks to RhodiumToad on IRC, I was able to determine the cause of
> > the two reported pg_upgrade problems he saw via IRC.  It seems toast
> > tables have xids and pg_dump is not preserving the toast relfrozenxids
> > as it should.  Heap tables have preserved relfrozenxids, but if you
> > update a heap row but don't change the toast value, and the old heap row
> > is later removed, the toast table can have an older relfrozenxids than
> > the heap table.
> > 
> > The fix for this is to have pg_dump preserve toast relfrozenxids, which
> > can be easily added and backpatched.  We might want to push a 9.0.4 for
> > this.  Second, we need to find a way for people to detect and fix
> > existing systems that have this problem, perhaps looming when the
> > pg_class relfrozenxid passes the toast relfrozenxid, and thirdly, we
> > need to figure out how to get this information to users.  Perhaps the
> > communication comes through the 9.0.4 release announcement.
> 
> I am not sure how to interpret the lack of replies to this email. 
> Either it is confidence, shock, or we told you so.  ;-)
> 
> Anyway, the attached patch fixes the problem.  The fix is for pg_dump's
> binary upgrade mode.  This would need to be backpatched back to 8.4
> because pg_migrator needs this too.

OK, I have applied the attached three patches to 8.4, 9.0, and 9.1. 
They are all slightly different because of code drift, and I created a
unified diff which I find is clearer for single-line changes.

I was very careful about the patching of queries because many of these
queries are only activated when dumping an older database, and are
therefore hard to test for SQL query errors.  I included all the version
patches in case someone sees something I missed.

-- 
  Bruce Momjian          http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 3842895..c5057f7 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -3185,6 +3185,8 @@ getTables(int *numTables)
 	int			i_relhasrules;
 	int			i_relhasoids;
 	int			i_relfrozenxid;
+	int			i_toastoid;
+	int			i_toastfrozenxid;
 	int			i_owning_tab;
 	int			i_owning_col;
 	int			i_reltablespace;
@@ -3226,7 +3228,8 @@ getTables(int *numTables)
 						  "(%s c.relowner) AS rolname, "
 						  "c.relchecks, c.relhastriggers, "
 						  "c.relhasindex, c.relhasrules, c.relhasoids, "
-						  "c.relfrozenxid, "
+						  "c.relfrozenxid, tc.oid AS toid, "
+						  "tc.relfrozenxid AS tfrozenxid, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
 						  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
@@ -3259,6 +3262,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
 						  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
@@ -3290,6 +3295,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
 						  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
@@ -3321,6 +3328,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
 						  "NULL AS reltablespace, "
@@ -3348,6 +3357,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
 						  "NULL AS reltablespace, "
@@ -3370,6 +3381,8 @@ getTables(int *numTables)
 						  "relhasindex, relhasrules, "
 						  "'t'::bool AS relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
 						  "NULL AS reltablespace, "
@@ -3446,6 +3459,8 @@ getTables(int *numTables)
 	i_relhasrules = PQfnumber(res, "relhasrules");
 	i_relhasoids = PQfnumber(res, "relhasoids");
 	i_relfrozenxid = PQfnumber(res, "relfrozenxid");
+	i_toastoid = PQfnumber(res, "toid");
+	i_toastfrozenxid = PQfnumber(res, "tfrozenxid");
 	i_owning_tab = PQfnumber(res, "owning_tab");
 	i_owning_col = PQfnumber(res, "owning_col");
 	i_reltablespace = PQfnumber(res, "reltablespace");
@@ -3484,6 +3499,8 @@ getTables(int *numTables)
 		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].toast_oid = atooid(PQgetvalue(res, i, i_toastoid));
+		tblinfo[i].toast_frozenxid = atooid(PQgetvalue(res, i, i_toastfrozenxid));
 		tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
 		if (PQgetisnull(res, i, i_owning_tab))
 		{
@@ -10044,13 +10061,23 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
 				}
 			}
 
-			appendPQExpBuffer(q, "\n-- For binary upgrade, set relfrozenxid.\n");
+			appendPQExpBuffer(q, "\n-- For binary upgrade, set heap's relfrozenxid\n");
 			appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
 							  "SET relfrozenxid = '%u'\n"
 							  "WHERE oid = ",
 							  tbinfo->frozenxid);
 			appendStringLiteralAH(q, fmtId(tbinfo->dobj.name), fout);
 			appendPQExpBuffer(q, "::pg_catalog.regclass;\n");
+
+			if (tbinfo->toast_oid)
+			{
+				/* We preserve the toast oids, so we can use it during restore */
+				appendPQExpBuffer(q, "\n-- For binary upgrade, set toast's relfrozenxid\n");
+				appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+								  "SET relfrozenxid = '%u'\n"
+								  "WHERE oid = '%u';\n",
+								  tbinfo->toast_frozenxid, tbinfo->toast_oid);
+			}
 		}
 
 		/* Loop dumping statistics and storage statements */
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 3339bf7..390b20c 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -227,6 +227,8 @@ typedef struct _tableInfo
 	bool		hastriggers;	/* does it have any triggers? */
 	bool		hasoids;		/* does it have OIDs? */
 	uint32		frozenxid;		/* for restore frozen xid */
+	Oid			toast_oid;		/* for restore toast frozen xid */
+	uint32		toast_frozenxid;/* for restore toast 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 */
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index f93affd..8721e65 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -3409,6 +3409,8 @@ getTables(int *numTables)
 	int			i_relhasrules;
 	int			i_relhasoids;
 	int			i_relfrozenxid;
+	int			i_toastoid;
+	int			i_toastfrozenxid;
 	int			i_owning_tab;
 	int			i_owning_col;
 	int			i_reltablespace;
@@ -3451,7 +3453,8 @@ getTables(int *numTables)
 						  "(%s c.relowner) AS rolname, "
 						  "c.relchecks, c.relhastriggers, "
 						  "c.relhasindex, c.relhasrules, c.relhasoids, "
-						  "c.relfrozenxid, "
+						  "c.relfrozenxid, tc.oid AS toid, "
+						  "tc.relfrozenxid AS tfrozenxid, "
 						  "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3484,7 +3487,8 @@ getTables(int *numTables)
 						  "(%s c.relowner) AS rolname, "
 						  "c.relchecks, c.relhastriggers, "
 						  "c.relhasindex, c.relhasrules, c.relhasoids, "
-						  "c.relfrozenxid, "
+						  "c.relfrozenxid, tc.oid AS toid, "
+						  "tc.relfrozenxid AS tfrozenxid, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3518,6 +3522,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3550,6 +3556,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3582,6 +3590,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3610,6 +3620,8 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL AS reloftype, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
@@ -3633,6 +3645,8 @@ getTables(int *numTables)
 						  "relhasindex, relhasrules, "
 						  "'t'::bool AS relhasoids, "
 						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL AS reloftype, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
@@ -3666,6 +3680,8 @@ getTables(int *numTables)
 						  "relhasindex, relhasrules, "
 						  "'t'::bool AS relhasoids, "
 						  "0 as relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
 						  "NULL AS reloftype, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
@@ -3711,6 +3727,8 @@ getTables(int *numTables)
 	i_relhasrules = PQfnumber(res, "relhasrules");
 	i_relhasoids = PQfnumber(res, "relhasoids");
 	i_relfrozenxid = PQfnumber(res, "relfrozenxid");
+	i_toastoid = PQfnumber(res, "toid");
+	i_toastfrozenxid = PQfnumber(res, "tfrozenxid");
 	i_owning_tab = PQfnumber(res, "owning_tab");
 	i_owning_col = PQfnumber(res, "owning_col");
 	i_reltablespace = PQfnumber(res, "reltablespace");
@@ -3750,6 +3768,8 @@ getTables(int *numTables)
 		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].toast_oid = atooid(PQgetvalue(res, i, i_toastoid));
+		tblinfo[i].toast_frozenxid = atooid(PQgetvalue(res, i, i_toastfrozenxid));
 		if (PQgetisnull(res, i, i_reloftype))
 			tblinfo[i].reloftype = NULL;
 		else
@@ -10852,13 +10872,23 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
 				}
 			}
 
-			appendPQExpBuffer(q, "\n-- For binary upgrade, set relfrozenxid.\n");
+			appendPQExpBuffer(q, "\n-- For binary upgrade, set heap's relfrozenxid\n");
 			appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
 							  "SET relfrozenxid = '%u'\n"
 							  "WHERE oid = ",
 							  tbinfo->frozenxid);
 			appendStringLiteralAH(q, fmtId(tbinfo->dobj.name), fout);
 			appendPQExpBuffer(q, "::pg_catalog.regclass;\n");
+
+			if (tbinfo->toast_oid)
+			{
+				/* We preserve the toast oids, so we can use it during restore */
+				appendPQExpBuffer(q, "\n-- For binary upgrade, set toast's relfrozenxid\n");
+				appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+								  "SET relfrozenxid = '%u'\n"
+								  "WHERE oid = '%u';\n",
+								  tbinfo->toast_frozenxid, tbinfo->toast_oid);
+			}
 		}
 
 		/* Loop dumping statistics and storage statements */
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index c309f69..1dc7157 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -228,6 +228,8 @@ typedef struct _tableInfo
 	bool		hastriggers;	/* does it have any triggers? */
 	bool		hasoids;		/* does it have OIDs? */
 	uint32		frozenxid;		/* for restore frozen xid */
+	Oid			toast_oid;		/* for restore toast frozen xid */
+	uint32		toast_frozenxid;/* for restore toast frozen xid */
 	int			ncheck;			/* # of CHECK expressions */
 	char	   *reloftype;		/* underlying type for typed table */
 	/* these two are set only if table is a sequence owned by a column: */
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 3f6e77b..1ccdb4d 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -3812,6 +3812,8 @@ getTables(int *numTables)
 	int			i_relhasrules;
 	int			i_relhasoids;
 	int			i_relfrozenxid;
+	int			i_toastoid;
+	int			i_toastfrozenxid;
 	int			i_relpersistence;
 	int			i_owning_tab;
 	int			i_owning_col;
@@ -3855,7 +3857,9 @@ getTables(int *numTables)
 						  "(%s c.relowner) AS rolname, "
 						  "c.relchecks, c.relhastriggers, "
 						  "c.relhasindex, c.relhasrules, c.relhasoids, "
-						  "c.relfrozenxid, c.relpersistence, "
+						  "c.relfrozenxid, tc.oid AS toid, "
+						  "tc.relfrozenxid AS tfrozenxid, "
+						  "c.relpersistence, "
 						  "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3889,7 +3893,9 @@ getTables(int *numTables)
 						  "(%s c.relowner) AS rolname, "
 						  "c.relchecks, c.relhastriggers, "
 						  "c.relhasindex, c.relhasrules, c.relhasoids, "
-						  "c.relfrozenxid, 'p' AS relpersistence, "
+						  "c.relfrozenxid, tc.oid AS toid, "
+						  "tc.relfrozenxid AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3922,7 +3928,9 @@ getTables(int *numTables)
 						  "(%s c.relowner) AS rolname, "
 						  "c.relchecks, c.relhastriggers, "
 						  "c.relhasindex, c.relhasrules, c.relhasoids, "
-						  "c.relfrozenxid, 'p' AS relpersistence, "
+						  "c.relfrozenxid, tc.oid AS toid, "
+						  "tc.relfrozenxid AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3955,7 +3963,10 @@ getTables(int *numTables)
 						  "(%s relowner) AS rolname, "
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
-						  "relfrozenxid, 'p' AS relpersistence, "
+						  "relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -3987,7 +3998,10 @@ getTables(int *numTables)
 						  "(%s relowner) AS rolname, "
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
-						  "0 AS relfrozenxid, 'p' AS relpersistence, "
+						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -4019,7 +4033,10 @@ getTables(int *numTables)
 						  "(%s relowner) AS rolname, "
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
-						  "0 AS relfrozenxid, 'p' AS relpersistence, "
+						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "NULL AS reloftype, "
 						  "d.refobjid AS owning_tab, "
 						  "d.refobjsubid AS owning_col, "
@@ -4047,7 +4064,10 @@ getTables(int *numTables)
 						  "(%s relowner) AS rolname, "
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, relhasoids, "
-						  "0 AS relfrozenxid, 'p' AS relpersistence, "
+						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "NULL AS reloftype, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
@@ -4070,7 +4090,10 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, "
 						  "'t'::bool AS relhasoids, "
-						  "0 AS relfrozenxid, 'p' AS relpersistence, "
+						  "0 AS relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "NULL AS reloftype, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
@@ -4103,7 +4126,10 @@ getTables(int *numTables)
 						  "relchecks, (reltriggers <> 0) AS relhastriggers, "
 						  "relhasindex, relhasrules, "
 						  "'t'::bool AS relhasoids, "
-						  "0 as relfrozenxid, 'p' AS relpersistence, "
+						  "0 as relfrozenxid, "
+						  "0 AS toid, "
+						  "0 AS tfrozenxid, "
+						  "'p' AS relpersistence, "
 						  "NULL AS reloftype, "
 						  "NULL::oid AS owning_tab, "
 						  "NULL::int4 AS owning_col, "
@@ -4149,6 +4175,8 @@ getTables(int *numTables)
 	i_relhasrules = PQfnumber(res, "relhasrules");
 	i_relhasoids = PQfnumber(res, "relhasoids");
 	i_relfrozenxid = PQfnumber(res, "relfrozenxid");
+	i_toastoid = PQfnumber(res, "toid");
+	i_toastfrozenxid = PQfnumber(res, "tfrozenxid");
 	i_relpersistence = PQfnumber(res, "relpersistence");
 	i_owning_tab = PQfnumber(res, "owning_tab");
 	i_owning_col = PQfnumber(res, "owning_col");
@@ -4190,6 +4218,8 @@ getTables(int *numTables)
 		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].toast_oid = atooid(PQgetvalue(res, i, i_toastoid));
+		tblinfo[i].toast_frozenxid = atooid(PQgetvalue(res, i, i_toastfrozenxid));
 		if (PQgetisnull(res, i, i_reloftype))
 			tblinfo[i].reloftype = NULL;
 		else
@@ -12221,13 +12251,23 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
 				}
 			}
 
-			appendPQExpBuffer(q, "\n-- For binary upgrade, set relfrozenxid\n");
+			appendPQExpBuffer(q, "\n-- For binary upgrade, set heap's relfrozenxid\n");
 			appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
 							  "SET relfrozenxid = '%u'\n"
 							  "WHERE oid = ",
 							  tbinfo->frozenxid);
 			appendStringLiteralAH(q, fmtId(tbinfo->dobj.name), fout);
 			appendPQExpBuffer(q, "::pg_catalog.regclass;\n");
+
+			if (tbinfo->toast_oid)
+			{
+				/* We preserve the toast oids, so we can use it during restore */
+				appendPQExpBuffer(q, "\n-- For binary upgrade, set toast's relfrozenxid\n");
+				appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+								  "SET relfrozenxid = '%u'\n"
+								  "WHERE oid = '%u';\n",
+								  tbinfo->toast_frozenxid, tbinfo->toast_oid);
+			}
 		}
 
 		/* Loop dumping statistics and storage statements */
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 113ecb1..6559e23 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -248,6 +248,8 @@ typedef struct _tableInfo
 	bool		hastriggers;	/* does it have any triggers? */
 	bool		hasoids;		/* does it have OIDs? */
 	uint32		frozenxid;		/* for restore frozen xid */
+	Oid			toast_oid;		/* for restore toast frozen xid */
+	uint32		toast_frozenxid;/* for restore toast frozen xid */
 	int			ncheck;			/* # of CHECK expressions */
 	char	   *reloftype;		/* underlying type for typed table */
 	/* these two are set only if table is a sequence owned by a column: */

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Noah Misch <noah@leadboat.com>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Stephen Frost <sfrost@snowman.net>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Stephen Frost <sfrost@snowman.net>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Noah Misch <noah@leadboat.com>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Stephen Frost <sfrost@snowman.net>
Дата:

Re: pg_upgrade bug found!

От:
Stephen Frost <sfrost@snowman.net>
Дата:

Re: pg_upgrade bug found!

От:
Stephen Frost <sfrost@snowman.net>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Stephen Frost <sfrost@snowman.net>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: pg_upgrade bug found!

От:
Noah Misch <noah@leadboat.com>
Дата:

Re: pg_upgrade bug found!

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:
Bruce Momjian wrote:
> Robert Haas wrote:
> > On Thu, Mar 31, 2011 at 12:11 PM, Bruce Momjian  wrote:
> > > Robert Haas wrote:
> > >> On Thu, Mar 31, 2011 at 11:32 AM, Heikki Linnakangas
> > >>  wrote:
> > >> >> ?I think the maintenance
> > >> >> overhead of an invisible variable is too much.
> > >> >
> > >> > A simple GUC or command-line switch isn't much code.
> > >>
> > >> I like the idea of a command-line switch.
> > >
> > > If you want to do that you should gereralize it as --binary-upgrade in
> > > case we have other needs for it.
> > 
> > Yeah.  Or we could do a binary_upgrade GUC which has the effect of
> > forcibly suppressing autovacuum, and maybe other things later.  I
> > think that's a lot less hazardous than fiddling with the autovacuum
> > GUC.
> 
> I like the idea of a command-line flag because it forces everything to
> be affected, and cannot be turned on and off in sessions --- if you are
> doing a binary upgrade, locked-down is good. :-)

The attached patch adds a new postmaster/postgres binary upgrade mode
(-b) which disables autovacuum, allows only super-user connections, and
prevents pg_upgrade_support oid assignment when not in upgrade mode. 
It also modifies pg_upgrade to use this new mode rather than play with
trying to stop autovacuum.

This does fix a very rare bug that could happen if
autovacuum_freeze_max_age were set to maximum by the user.

I think this should be applied to PG 9.1.

-- 
  Bruce Momjian          http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/contrib/pg_upgrade/server.c b/contrib/pg_upgrade/server.c
new file mode 100644
index 2a0f50e..df2f2db
*** a/contrib/pg_upgrade/server.c
--- b/contrib/pg_upgrade/server.c
*************** start_postmaster(ClusterInfo *cluster, b
*** 173,178 ****
--- 173,183 ----
  	const char *datadir;
  	unsigned short port;
  	bool		exit_hook_registered = false;
+ #ifndef WIN32
+ 	char		*output_filename = log_opts.filename;
+ #else
+ 	char		*output_filename = DEVNULL;
+ #endif
  
  	bindir = cluster->bindir;
  	datadir = cluster->pgdata;
*************** start_postmaster(ClusterInfo *cluster, b
*** 193,216 ****
  	 * same file because we get the error: "The process cannot access the file
  	 * because it is being used by another process." so we have to send all
  	 * other output to 'nul'.
! 	 *
! 	 * Using autovacuum=off disables cleanup vacuum and analyze, but freeze
! 	 * vacuums can still happen, so we set autovacuum_freeze_max_age to its
! 	 * maximum.  We assume all datfrozenxid and relfrozen values are less than
! 	 * a gap of 2000000000 from the current xid counter, so autovacuum will
! 	 * not touch them.
  	 */
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" "
! 			 "-o \"-p %d -c autovacuum=off "
! 			 "-c autovacuum_freeze_max_age=2000000000\" "
! 			 "start >> \"%s\" 2>&1" SYSTEMQUOTE,
! 			 bindir,
! #ifndef WIN32
! 			 log_opts.filename, datadir, port, log_opts.filename);
! #else
! 			 DEVNULL, datadir, port, DEVNULL);
! #endif
  	exec_prog(true, "%s", cmd);
  
  	/* wait for the server to start properly */
--- 198,212 ----
  	 * same file because we get the error: "The process cannot access the file
  	 * because it is being used by another process." so we have to send all
  	 * other output to 'nul'.
! 	 * Use binary upgrade mode on the server (-b), if supported.
  	 */
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" "
! 			 "-o \"-p %d %s\" start >> \"%s\" 2>&1" SYSTEMQUOTE,
! 			 bindir, output_filename, datadir, port,
! 			 (GET_MAJOR_VERSION(cluster->major_version) >= 901) ? "-b" : "",
! 			 log_opts.filename);
! 
  	exec_prog(true, "%s", cmd);
  
  	/* wait for the server to start properly */
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
new file mode 100644
index 8c5670f..870ddba
*** a/src/backend/catalog/heap.c
--- b/src/backend/catalog/heap.c
*************** heap_create_with_catalog(const char *rel
*** 1051,1057 ****
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
  			(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
  			 relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
  			 relkind == RELKIND_FOREIGN_TABLE))
--- 1051,1058 ----
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (IsBinaryUpgrade &&
! 			OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
  			(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
  			 relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
  			 relkind == RELKIND_FOREIGN_TABLE))
*************** heap_create_with_catalog(const char *rel
*** 1059,1065 ****
  			relid = binary_upgrade_next_heap_pg_class_oid;
  			binary_upgrade_next_heap_pg_class_oid = InvalidOid;
  		}
! 		else if (OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
  				 relkind == RELKIND_TOASTVALUE)
  		{
  			relid = binary_upgrade_next_toast_pg_class_oid;
--- 1060,1067 ----
  			relid = binary_upgrade_next_heap_pg_class_oid;
  			binary_upgrade_next_heap_pg_class_oid = InvalidOid;
  		}
! 		else if (IsBinaryUpgrade &&
! 				 OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
  				 relkind == RELKIND_TOASTVALUE)
  		{
  			relid = binary_upgrade_next_toast_pg_class_oid;
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
new file mode 100644
index c79402c..a662cfc
*** a/src/backend/catalog/index.c
--- b/src/backend/catalog/index.c
*************** index_create(Relation heapRelation,
*** 790,796 ****
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (OidIsValid(binary_upgrade_next_index_pg_class_oid))
  		{
  			indexRelationId = binary_upgrade_next_index_pg_class_oid;
  			binary_upgrade_next_index_pg_class_oid = InvalidOid;
--- 790,797 ----
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (IsBinaryUpgrade &&
! 			OidIsValid(binary_upgrade_next_index_pg_class_oid))
  		{
  			indexRelationId = binary_upgrade_next_index_pg_class_oid;
  			binary_upgrade_next_index_pg_class_oid = InvalidOid;
diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c
new file mode 100644
index 08d8aa1..61a9322
*** a/src/backend/catalog/pg_enum.c
--- b/src/backend/catalog/pg_enum.c
***************
*** 21,26 ****
--- 21,27 ----
  #include "catalog/pg_enum.h"
  #include "catalog/pg_type.h"
  #include "storage/lmgr.h"
+ #include "miscadmin.h"
  #include "utils/builtins.h"
  #include "utils/fmgroids.h"
  #include "utils/rel.h"
*************** restart:
*** 311,317 ****
  	}
  
  	/* Get a new OID for the new label */
! 	if (OidIsValid(binary_upgrade_next_pg_enum_oid))
  	{
  		/*
  		 * Use binary-upgrade override for pg_enum.oid, if supplied. During
--- 312,318 ----
  	}
  
  	/* Get a new OID for the new label */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_enum_oid))
  	{
  		/*
  		 * Use binary-upgrade override for pg_enum.oid, if supplied. During
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
new file mode 100644
index 9e35e73..80c1bfc
*** a/src/backend/catalog/pg_type.c
--- b/src/backend/catalog/pg_type.c
*************** TypeShellMake(const char *typeName, Oid 
*** 125,131 ****
  	tup = heap_form_tuple(tupDesc, values, nulls);
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_pg_type_oid))
  	{
  		HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  		binary_upgrade_next_pg_type_oid = InvalidOid;
--- 125,131 ----
  	tup = heap_form_tuple(tupDesc, values, nulls);
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
  	{
  		HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  		binary_upgrade_next_pg_type_oid = InvalidOid;
*************** TypeCreate(Oid newTypeOid,
*** 430,436 ****
  		if (OidIsValid(newTypeOid))
  			HeapTupleSetOid(tup, newTypeOid);
  		/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 		else if (OidIsValid(binary_upgrade_next_pg_type_oid))
  		{
  			HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  			binary_upgrade_next_pg_type_oid = InvalidOid;
--- 430,436 ----
  		if (OidIsValid(newTypeOid))
  			HeapTupleSetOid(tup, newTypeOid);
  		/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 		else if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
  		{
  			HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  			binary_upgrade_next_pg_type_oid = InvalidOid;
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
new file mode 100644
index 85fe57f..362d26d
*** a/src/backend/catalog/toasting.c
--- b/src/backend/catalog/toasting.c
*************** create_toast_table(Relation rel, Oid toa
*** 157,163 ****
  	 * creation even if it seems not to need one.
  	 */
  	if (!needs_toast_table(rel) &&
! 		!OidIsValid(binary_upgrade_next_toast_pg_class_oid))
  		return false;
  
  	/*
--- 157,164 ----
  	 * creation even if it seems not to need one.
  	 */
  	if (!needs_toast_table(rel) &&
! 		(!IsBinaryUpgrade ||
! 		 !OidIsValid(binary_upgrade_next_toast_pg_class_oid)))
  		return false;
  
  	/*
*************** create_toast_table(Relation rel, Oid toa
*** 202,208 ****
  		namespaceid = PG_TOAST_NAMESPACE;
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_toast_pg_type_oid))
  	{
  		toast_typid = binary_upgrade_next_toast_pg_type_oid;
  		binary_upgrade_next_toast_pg_type_oid = InvalidOid;
--- 203,209 ----
  		namespaceid = PG_TOAST_NAMESPACE;
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_toast_pg_type_oid))
  	{
  		toast_typid = binary_upgrade_next_toast_pg_type_oid;
  		binary_upgrade_next_toast_pg_type_oid = InvalidOid;
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
new file mode 100644
index 1a20b0d..b3b6dc2
*** a/src/backend/commands/typecmds.c
--- b/src/backend/commands/typecmds.c
*************** AssignTypeArrayOid(void)
*** 1550,1556 ****
  	Oid			type_array_oid;
  
  	/* Use binary-upgrade override for pg_type.typarray, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_array_pg_type_oid))
  	{
  		type_array_oid = binary_upgrade_next_array_pg_type_oid;
  		binary_upgrade_next_array_pg_type_oid = InvalidOid;
--- 1550,1556 ----
  	Oid			type_array_oid;
  
  	/* Use binary-upgrade override for pg_type.typarray, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_array_pg_type_oid))
  	{
  		type_array_oid = binary_upgrade_next_array_pg_type_oid;
  		binary_upgrade_next_array_pg_type_oid = InvalidOid;
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
new file mode 100644
index 3f7d499..838d6eb
*** a/src/backend/commands/user.c
--- b/src/backend/commands/user.c
*************** CreateRole(CreateRoleStmt *stmt)
*** 388,394 ****
  	 * pg_largeobject_metadata contains pg_authid.oid's, so we use the
  	 * binary-upgrade override, if specified.
  	 */
! 	if (OidIsValid(binary_upgrade_next_pg_authid_oid))
  	{
  		HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
  		binary_upgrade_next_pg_authid_oid = InvalidOid;
--- 388,394 ----
  	 * pg_largeobject_metadata contains pg_authid.oid's, so we use the
  	 * binary-upgrade override, if specified.
  	 */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_authid_oid))
  	{
  		HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
  		binary_upgrade_next_pg_authid_oid = InvalidOid;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
new file mode 100644
index 6e7f664..c0cf033
*** a/src/backend/postmaster/postmaster.c
--- b/src/backend/postmaster/postmaster.c
*************** PostmasterMain(int argc, char *argv[])
*** 529,535 ****
  	 * tcop/postgres.c (the option sets should not conflict) and with the
  	 * common help() function in main/main.c.
  	 */
! 	while ((opt = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
  	{
  		switch (opt)
  		{
--- 529,535 ----
  	 * tcop/postgres.c (the option sets should not conflict) and with the
  	 * common help() function in main/main.c.
  	 */
! 	while ((opt = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
  	{
  		switch (opt)
  		{
*************** PostmasterMain(int argc, char *argv[])
*** 541,546 ****
--- 541,551 ----
  				SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
  				break;
  
+ 			case 'b':
+ 				/* Undocumented flag used for binary upgrades */
+ 				IsBinaryUpgrade = true;
+ 				break;
+ 
  			case 'D':
  				userDoption = optarg;
  				break;
*************** ServerLoop(void)
*** 1480,1487 ****
  		if (WalWriterPID == 0 && pmState == PM_RUN)
  			WalWriterPID = StartWalWriter();
  
! 		/* If we have lost the autovacuum launcher, try to start a new one */
! 		if (AutoVacPID == 0 &&
  			(AutoVacuumingActive() || start_autovac_launcher) &&
  			pmState == PM_RUN)
  		{
--- 1485,1497 ----
  		if (WalWriterPID == 0 && pmState == PM_RUN)
  			WalWriterPID = StartWalWriter();
  
! 		/*
! 		 *	If we have lost the autovacuum launcher, try to start a new one.
! 		 *	We don't want autovacuum to run in binary upgrade mode because
! 		 *	autovacuum might update relfrozenxid for empty tables before
! 		 *	the physical files are put in place.
! 		 */
! 		if (!IsBinaryUpgrade && AutoVacPID == 0 &&
  			(AutoVacuumingActive() || start_autovac_launcher) &&
  			pmState == PM_RUN)
  		{
*************** reaper(SIGNAL_ARGS)
*** 2413,2419 ****
  			 */
  			if (WalWriterPID == 0)
  				WalWriterPID = StartWalWriter();
! 			if (AutoVacuumingActive() && AutoVacPID == 0)
  				AutoVacPID = StartAutoVacLauncher();
  			if (XLogArchivingActive() && PgArchPID == 0)
  				PgArchPID = pgarch_start();
--- 2423,2429 ----
  			 */
  			if (WalWriterPID == 0)
  				WalWriterPID = StartWalWriter();
! 			if (!IsBinaryUpgrade && AutoVacuumingActive() && AutoVacPID == 0)
  				AutoVacPID = StartAutoVacLauncher();
  			if (XLogArchivingActive() && PgArchPID == 0)
  				PgArchPID = pgarch_start();
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
new file mode 100644
index 59b7666..a07661f
*** a/src/backend/tcop/postgres.c
--- b/src/backend/tcop/postgres.c
*************** process_postgres_switches(int argc, char
*** 3238,3244 ****
  	 * postmaster/postmaster.c (the option sets should not conflict) and with
  	 * the common help() function in main/main.c.
  	 */
! 	while ((flag = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
  	{
  		switch (flag)
  		{
--- 3238,3244 ----
  	 * postmaster/postmaster.c (the option sets should not conflict) and with
  	 * the common help() function in main/main.c.
  	 */
! 	while ((flag = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
  	{
  		switch (flag)
  		{
*************** process_postgres_switches(int argc, char
*** 3250,3255 ****
--- 3250,3260 ----
  				SetConfigOption("shared_buffers", optarg, ctx, gucsource);
  				break;
  
+ 			case 'b':
+ 				/* Undocumented flag used for binary upgrades */
+ 				IsBinaryUpgrade = true;
+ 				break;
+ 
  			case 'D':
  				if (secure)
  					userDoption = strdup(optarg);
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
new file mode 100644
index 984ffd0..c4c4154
*** a/src/backend/utils/init/globals.c
--- b/src/backend/utils/init/globals.c
*************** pid_t		PostmasterPid = 0;
*** 85,90 ****
--- 85,91 ----
   */
  bool		IsPostmasterEnvironment = false;
  bool		IsUnderPostmaster = false;
+ bool		IsBinaryUpgrade = false;
  
  bool		ExitOnAnyError = false;
  
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
new file mode 100644
index a4c5d4c..1f6fba5
*** a/src/backend/utils/init/postinit.c
--- b/src/backend/utils/init/postinit.c
*************** InitPostgres(const char *in_dbname, Oid 
*** 626,631 ****
--- 626,641 ----
  	}
  
  	/*
+ 	 * Binary upgrades only allowed super-user connections
+ 	 */
+ 	if (IsBinaryUpgrade && !am_superuser)
+ 	{
+ 			ereport(FATAL,
+ 					(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 			errmsg("must be superuser to connect in binary upgrade mode")));
+ 	}
+ 
+ 	/*
  	 * The last few connections slots are reserved for superusers. Although
  	 * replication connections currently require superuser privileges, we
  	 * don't allow them to consume the reserved slots, which are intended for
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
new file mode 100644
index aa8cce5..9d19417
*** a/src/include/miscadmin.h
--- b/src/include/miscadmin.h
*************** do { \
*** 124,129 ****
--- 124,130 ----
  extern pid_t PostmasterPid;
  extern bool IsPostmasterEnvironment;
  extern PGDLLIMPORT bool IsUnderPostmaster;
+ extern bool IsBinaryUpgrade;
  
  extern bool ExitOnAnyError;
  

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:
Robert Haas wrote:
> On Apr 21, 2011, at 6:22 PM, Bruce Momjian  wrote:
> > Tom Lane wrote:
> >> Bruce Momjian  writes:
> >>> Tom Lane wrote:
> >>>> Huh?  Why would that be?  Seems like you've done something in the wrong
> >>>> place if that's an issue.
> >>
> >>> Yeah, it is complicated.  I don't really care if autovacuum runs on the
> >>> old cluster (we only move the files while the server is down).  We only
> >>> want autovacuum not to mess with the relfrozenxids we set on the new
> >>> cluster while the table file is empty.
> >>
> >>> The other issue is that the old alpha binary will not know about the -b
> >>> flag and hence will not start.
> >>
> >> Well, once again, why are you trying to do that?  It's not the source
> >> postmaster that needs this flag.
> >
> > Well, consider that this also locks out non-super users so I figured it
> > would be good to run the old and new in the same binary upgrade mode.
> > Again, we can do just the new cluster for 9.1.   I can also control the
> > behavior based on the catalog version number, which seems the most
> > logical.
> 
> I think you are over-engineering this. Just use it for the new cluster
> only, full stop, and you'll be right as rain.

I thought some more about this and I don't want autovacuum to run on the
old server.  This is because pg_dumpall --binary-upgrade --schema-only
grabs the datfrozenxid for all the databases at the start, then connects
to each database to gets the relfrozenxids.  I don't want to risk any
advancement of either of those during the pg_dumpall run.

FYI, the existing code already doesn't allow autovacuum to run on the old
or new cluster by setting autovacuum off and autovacuum_freeze_max_age
very high, so this is not a behavior change --- just a more formalized
way of turning off autovacuum.

The attached patch uses catalog version to test;  we use catalog version
checking already for tablespace subdirectories.

--
  Bruce Momjian          http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
new file mode 100644
index d1dc5db..7623c5e
*** a/contrib/pg_upgrade/check.c
--- b/contrib/pg_upgrade/check.c
*************** check_cluster_compatibility(bool live_ch
*** 264,270 ****
  
  	/* Is it 9.0 but without tablespace directories? */
  	if (GET_MAJOR_VERSION(new_cluster.major_version) == 900 &&
! 		new_cluster.controldata.cat_ver < TABLE_SPACE_SUBDIRS)
  		pg_log(PG_FATAL, "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
  			   "because of backend API changes made during development.\n");
  }
--- 264,270 ----
  
  	/* Is it 9.0 but without tablespace directories? */
  	if (GET_MAJOR_VERSION(new_cluster.major_version) == 900 &&
! 		new_cluster.controldata.cat_ver < CAT_VER_TABLE_SPACE_SUBDIRS)
  		pg_log(PG_FATAL, "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
  			   "because of backend API changes made during development.\n");
  }
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
new file mode 100644
index 5ca570e..70d74ba
*** a/contrib/pg_upgrade/pg_upgrade.h
--- b/contrib/pg_upgrade/pg_upgrade.h
***************
*** 58,64 ****
  #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
  
  /* OID system catalog preservation added during PG 9.0 development */
! #define TABLE_SPACE_SUBDIRS 201001111
  
  /*
   * Each relation is represented by a relinfo structure.
--- 58,66 ----
  #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
  
  /* OID system catalog preservation added during PG 9.0 development */
! #define CAT_VER_TABLE_SPACE_SUBDIRS 201001111
! /* postmaster/postgres -b (binary_upgrade) flag added during PG 9.1 development */
! #define CAT_VER_BINARY_UPGRADE_SERVER_FLAG 201104221
  
  /*
   * Each relation is represented by a relinfo structure.
diff --git a/contrib/pg_upgrade/server.c b/contrib/pg_upgrade/server.c
new file mode 100644
index 2a0f50e..f7d7653
*** a/contrib/pg_upgrade/server.c
--- b/contrib/pg_upgrade/server.c
*************** start_postmaster(ClusterInfo *cluster, b
*** 173,178 ****
--- 173,183 ----
  	const char *datadir;
  	unsigned short port;
  	bool		exit_hook_registered = false;
+ #ifndef WIN32
+ 	char		*output_filename = log_opts.filename;
+ #else
+ 	char		*output_filename = DEVNULL;
+ #endif
  
  	bindir = cluster->bindir;
  	datadir = cluster->pgdata;
*************** start_postmaster(ClusterInfo *cluster, b
*** 193,216 ****
  	 * same file because we get the error: "The process cannot access the file
  	 * because it is being used by another process." so we have to send all
  	 * other output to 'nul'.
! 	 *
! 	 * Using autovacuum=off disables cleanup vacuum and analyze, but freeze
! 	 * vacuums can still happen, so we set autovacuum_freeze_max_age to its
! 	 * maximum.  We assume all datfrozenxid and relfrozen values are less than
! 	 * a gap of 2000000000 from the current xid counter, so autovacuum will
! 	 * not touch them.
  	 */
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" "
! 			 "-o \"-p %d -c autovacuum=off "
! 			 "-c autovacuum_freeze_max_age=2000000000\" "
! 			 "start >> \"%s\" 2>&1" SYSTEMQUOTE,
! 			 bindir,
! #ifndef WIN32
! 			 log_opts.filename, datadir, port, log_opts.filename);
! #else
! 			 DEVNULL, datadir, port, DEVNULL);
! #endif
  	exec_prog(true, "%s", cmd);
  
  	/* wait for the server to start properly */
--- 198,213 ----
  	 * same file because we get the error: "The process cannot access the file
  	 * because it is being used by another process." so we have to send all
  	 * other output to 'nul'.
! 	 * Use binary upgrade mode on the server (-b), if supported.
  	 */
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" "
! 			 "-o \"-p %d%s\" start >> \"%s\" 2>&1" SYSTEMQUOTE,
! 			 bindir, output_filename, datadir, port,
! 			 (cluster->controldata.cat_ver >=
! 				CAT_VER_BINARY_UPGRADE_SERVER_FLAG) ? " -b" : "",
! 			 log_opts.filename);
! 
  	exec_prog(true, "%s", cmd);
  
  	/* wait for the server to start properly */
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
new file mode 100644
index 8c5670f..870ddba
*** a/src/backend/catalog/heap.c
--- b/src/backend/catalog/heap.c
*************** heap_create_with_catalog(const char *rel
*** 1051,1057 ****
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
  			(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
  			 relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
  			 relkind == RELKIND_FOREIGN_TABLE))
--- 1051,1058 ----
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (IsBinaryUpgrade &&
! 			OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
  			(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
  			 relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
  			 relkind == RELKIND_FOREIGN_TABLE))
*************** heap_create_with_catalog(const char *rel
*** 1059,1065 ****
  			relid = binary_upgrade_next_heap_pg_class_oid;
  			binary_upgrade_next_heap_pg_class_oid = InvalidOid;
  		}
! 		else if (OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
  				 relkind == RELKIND_TOASTVALUE)
  		{
  			relid = binary_upgrade_next_toast_pg_class_oid;
--- 1060,1067 ----
  			relid = binary_upgrade_next_heap_pg_class_oid;
  			binary_upgrade_next_heap_pg_class_oid = InvalidOid;
  		}
! 		else if (IsBinaryUpgrade &&
! 				 OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
  				 relkind == RELKIND_TOASTVALUE)
  		{
  			relid = binary_upgrade_next_toast_pg_class_oid;
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
new file mode 100644
index c79402c..a662cfc
*** a/src/backend/catalog/index.c
--- b/src/backend/catalog/index.c
*************** index_create(Relation heapRelation,
*** 790,796 ****
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (OidIsValid(binary_upgrade_next_index_pg_class_oid))
  		{
  			indexRelationId = binary_upgrade_next_index_pg_class_oid;
  			binary_upgrade_next_index_pg_class_oid = InvalidOid;
--- 790,797 ----
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (IsBinaryUpgrade &&
! 			OidIsValid(binary_upgrade_next_index_pg_class_oid))
  		{
  			indexRelationId = binary_upgrade_next_index_pg_class_oid;
  			binary_upgrade_next_index_pg_class_oid = InvalidOid;
diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c
new file mode 100644
index 08d8aa1..61a9322
*** a/src/backend/catalog/pg_enum.c
--- b/src/backend/catalog/pg_enum.c
***************
*** 21,26 ****
--- 21,27 ----
  #include "catalog/pg_enum.h"
  #include "catalog/pg_type.h"
  #include "storage/lmgr.h"
+ #include "miscadmin.h"
  #include "utils/builtins.h"
  #include "utils/fmgroids.h"
  #include "utils/rel.h"
*************** restart:
*** 311,317 ****
  	}
  
  	/* Get a new OID for the new label */
! 	if (OidIsValid(binary_upgrade_next_pg_enum_oid))
  	{
  		/*
  		 * Use binary-upgrade override for pg_enum.oid, if supplied. During
--- 312,318 ----
  	}
  
  	/* Get a new OID for the new label */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_enum_oid))
  	{
  		/*
  		 * Use binary-upgrade override for pg_enum.oid, if supplied. During
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
new file mode 100644
index 9e35e73..80c1bfc
*** a/src/backend/catalog/pg_type.c
--- b/src/backend/catalog/pg_type.c
*************** TypeShellMake(const char *typeName, Oid 
*** 125,131 ****
  	tup = heap_form_tuple(tupDesc, values, nulls);
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_pg_type_oid))
  	{
  		HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  		binary_upgrade_next_pg_type_oid = InvalidOid;
--- 125,131 ----
  	tup = heap_form_tuple(tupDesc, values, nulls);
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
  	{
  		HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  		binary_upgrade_next_pg_type_oid = InvalidOid;
*************** TypeCreate(Oid newTypeOid,
*** 430,436 ****
  		if (OidIsValid(newTypeOid))
  			HeapTupleSetOid(tup, newTypeOid);
  		/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 		else if (OidIsValid(binary_upgrade_next_pg_type_oid))
  		{
  			HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  			binary_upgrade_next_pg_type_oid = InvalidOid;
--- 430,436 ----
  		if (OidIsValid(newTypeOid))
  			HeapTupleSetOid(tup, newTypeOid);
  		/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 		else if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
  		{
  			HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  			binary_upgrade_next_pg_type_oid = InvalidOid;
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
new file mode 100644
index 85fe57f..362d26d
*** a/src/backend/catalog/toasting.c
--- b/src/backend/catalog/toasting.c
*************** create_toast_table(Relation rel, Oid toa
*** 157,163 ****
  	 * creation even if it seems not to need one.
  	 */
  	if (!needs_toast_table(rel) &&
! 		!OidIsValid(binary_upgrade_next_toast_pg_class_oid))
  		return false;
  
  	/*
--- 157,164 ----
  	 * creation even if it seems not to need one.
  	 */
  	if (!needs_toast_table(rel) &&
! 		(!IsBinaryUpgrade ||
! 		 !OidIsValid(binary_upgrade_next_toast_pg_class_oid)))
  		return false;
  
  	/*
*************** create_toast_table(Relation rel, Oid toa
*** 202,208 ****
  		namespaceid = PG_TOAST_NAMESPACE;
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_toast_pg_type_oid))
  	{
  		toast_typid = binary_upgrade_next_toast_pg_type_oid;
  		binary_upgrade_next_toast_pg_type_oid = InvalidOid;
--- 203,209 ----
  		namespaceid = PG_TOAST_NAMESPACE;
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_toast_pg_type_oid))
  	{
  		toast_typid = binary_upgrade_next_toast_pg_type_oid;
  		binary_upgrade_next_toast_pg_type_oid = InvalidOid;
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
new file mode 100644
index 1a20b0d..b3b6dc2
*** a/src/backend/commands/typecmds.c
--- b/src/backend/commands/typecmds.c
*************** AssignTypeArrayOid(void)
*** 1550,1556 ****
  	Oid			type_array_oid;
  
  	/* Use binary-upgrade override for pg_type.typarray, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_array_pg_type_oid))
  	{
  		type_array_oid = binary_upgrade_next_array_pg_type_oid;
  		binary_upgrade_next_array_pg_type_oid = InvalidOid;
--- 1550,1556 ----
  	Oid			type_array_oid;
  
  	/* Use binary-upgrade override for pg_type.typarray, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_array_pg_type_oid))
  	{
  		type_array_oid = binary_upgrade_next_array_pg_type_oid;
  		binary_upgrade_next_array_pg_type_oid = InvalidOid;
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
new file mode 100644
index 3f7d499..838d6eb
*** a/src/backend/commands/user.c
--- b/src/backend/commands/user.c
*************** CreateRole(CreateRoleStmt *stmt)
*** 388,394 ****
  	 * pg_largeobject_metadata contains pg_authid.oid's, so we use the
  	 * binary-upgrade override, if specified.
  	 */
! 	if (OidIsValid(binary_upgrade_next_pg_authid_oid))
  	{
  		HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
  		binary_upgrade_next_pg_authid_oid = InvalidOid;
--- 388,394 ----
  	 * pg_largeobject_metadata contains pg_authid.oid's, so we use the
  	 * binary-upgrade override, if specified.
  	 */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_authid_oid))
  	{
  		HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
  		binary_upgrade_next_pg_authid_oid = InvalidOid;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
new file mode 100644
index 6e7f664..c0cf033
*** a/src/backend/postmaster/postmaster.c
--- b/src/backend/postmaster/postmaster.c
*************** PostmasterMain(int argc, char *argv[])
*** 529,535 ****
  	 * tcop/postgres.c (the option sets should not conflict) and with the
  	 * common help() function in main/main.c.
  	 */
! 	while ((opt = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
  	{
  		switch (opt)
  		{
--- 529,535 ----
  	 * tcop/postgres.c (the option sets should not conflict) and with the
  	 * common help() function in main/main.c.
  	 */
! 	while ((opt = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
  	{
  		switch (opt)
  		{
*************** PostmasterMain(int argc, char *argv[])
*** 541,546 ****
--- 541,551 ----
  				SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
  				break;
  
+ 			case 'b':
+ 				/* Undocumented flag used for binary upgrades */
+ 				IsBinaryUpgrade = true;
+ 				break;
+ 
  			case 'D':
  				userDoption = optarg;
  				break;
*************** ServerLoop(void)
*** 1480,1487 ****
  		if (WalWriterPID == 0 && pmState == PM_RUN)
  			WalWriterPID = StartWalWriter();
  
! 		/* If we have lost the autovacuum launcher, try to start a new one */
! 		if (AutoVacPID == 0 &&
  			(AutoVacuumingActive() || start_autovac_launcher) &&
  			pmState == PM_RUN)
  		{
--- 1485,1497 ----
  		if (WalWriterPID == 0 && pmState == PM_RUN)
  			WalWriterPID = StartWalWriter();
  
! 		/*
! 		 *	If we have lost the autovacuum launcher, try to start a new one.
! 		 *	We don't want autovacuum to run in binary upgrade mode because
! 		 *	autovacuum might update relfrozenxid for empty tables before
! 		 *	the physical files are put in place.
! 		 */
! 		if (!IsBinaryUpgrade && AutoVacPID == 0 &&
  			(AutoVacuumingActive() || start_autovac_launcher) &&
  			pmState == PM_RUN)
  		{
*************** reaper(SIGNAL_ARGS)
*** 2413,2419 ****
  			 */
  			if (WalWriterPID == 0)
  				WalWriterPID = StartWalWriter();
! 			if (AutoVacuumingActive() && AutoVacPID == 0)
  				AutoVacPID = StartAutoVacLauncher();
  			if (XLogArchivingActive() && PgArchPID == 0)
  				PgArchPID = pgarch_start();
--- 2423,2429 ----
  			 */
  			if (WalWriterPID == 0)
  				WalWriterPID = StartWalWriter();
! 			if (!IsBinaryUpgrade && AutoVacuumingActive() && AutoVacPID == 0)
  				AutoVacPID = StartAutoVacLauncher();
  			if (XLogArchivingActive() && PgArchPID == 0)
  				PgArchPID = pgarch_start();
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
new file mode 100644
index 59b7666..a07661f
*** a/src/backend/tcop/postgres.c
--- b/src/backend/tcop/postgres.c
*************** process_postgres_switches(int argc, char
*** 3238,3244 ****
  	 * postmaster/postmaster.c (the option sets should not conflict) and with
  	 * the common help() function in main/main.c.
  	 */
! 	while ((flag = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
  	{
  		switch (flag)
  		{
--- 3238,3244 ----
  	 * postmaster/postmaster.c (the option sets should not conflict) and with
  	 * the common help() function in main/main.c.
  	 */
! 	while ((flag = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
  	{
  		switch (flag)
  		{
*************** process_postgres_switches(int argc, char
*** 3250,3255 ****
--- 3250,3260 ----
  				SetConfigOption("shared_buffers", optarg, ctx, gucsource);
  				break;
  
+ 			case 'b':
+ 				/* Undocumented flag used for binary upgrades */
+ 				IsBinaryUpgrade = true;
+ 				break;
+ 
  			case 'D':
  				if (secure)
  					userDoption = strdup(optarg);
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
new file mode 100644
index 984ffd0..c4c4154
*** a/src/backend/utils/init/globals.c
--- b/src/backend/utils/init/globals.c
*************** pid_t		PostmasterPid = 0;
*** 85,90 ****
--- 85,91 ----
   */
  bool		IsPostmasterEnvironment = false;
  bool		IsUnderPostmaster = false;
+ bool		IsBinaryUpgrade = false;
  
  bool		ExitOnAnyError = false;
  
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
new file mode 100644
index a4c5d4c..1f6fba5
*** a/src/backend/utils/init/postinit.c
--- b/src/backend/utils/init/postinit.c
*************** InitPostgres(const char *in_dbname, Oid 
*** 626,631 ****
--- 626,641 ----
  	}
  
  	/*
+ 	 * Binary upgrades only allowed super-user connections
+ 	 */
+ 	if (IsBinaryUpgrade && !am_superuser)
+ 	{
+ 			ereport(FATAL,
+ 					(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 			errmsg("must be superuser to connect in binary upgrade mode")));
+ 	}
+ 
+ 	/*
  	 * The last few connections slots are reserved for superusers. Although
  	 * replication connections currently require superuser privileges, we
  	 * don't allow them to consume the reserved slots, which are intended for
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
new file mode 100644
index 53c684a..22926b0
*** a/src/include/catalog/catversion.h
--- b/src/include/catalog/catversion.h
***************
*** 53,58 ****
   */
  
  /*							yyyymmddN */
! #define CATALOG_VERSION_NO	201104181
  
  #endif
--- 53,58 ----
   */
  
  /*							yyyymmddN */
! #define CATALOG_VERSION_NO	201104221
  
  #endif
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
new file mode 100644
index aa8cce5..9d19417
*** a/src/include/miscadmin.h
--- b/src/include/miscadmin.h
*************** do { \
*** 124,129 ****
--- 124,130 ----
  extern pid_t PostmasterPid;
  extern bool IsPostmasterEnvironment;
  extern PGDLLIMPORT bool IsUnderPostmaster;
+ extern bool IsBinaryUpgrade;
  
  extern bool ExitOnAnyError;
  

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:
Bruce Momjian wrote:
> > > Well, consider that this also locks out non-super users so I figured it
> > > would be good to run the old and new in the same binary upgrade mode.
> > > Again, we can do just the new cluster for 9.1.   I can also control the
> > > behavior based on the catalog version number, which seems the most
> > > logical.
> > 
> > I think you are over-engineering this. Just use it for the new cluster
> > only, full stop, and you'll be right as rain.
> 
> I thought some more about this and I don't want autovacuum to run on the
> old server.  This is because pg_dumpall --binary-upgrade --schema-only
> grabs the datfrozenxid for all the databases at the start, then connects
> to each database to gets the relfrozenxids.  I don't want to risk any
> advancement of either of those during the pg_dumpall run.
> 
> FYI, the existing code already doesn't allow autovacuum to run on the old
> or new cluster by setting autovacuum off and autovacuum_freeze_max_age
> very high, so this is not a behavior change --- just a more formalized
> way of turning off autovacuum.
> 
> The attached patch uses catalog version to test;  we use catalog version
> checking already for tablespace subdirectories.

OK, thinking even more, it seems I have to keep the old vacuum disable
flag for pre-9.1 old clusters.  This new patch does that.

-- 
  Bruce Momjian          http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
new file mode 100644
index d1dc5db..7623c5e
*** a/contrib/pg_upgrade/check.c
--- b/contrib/pg_upgrade/check.c
*************** check_cluster_compatibility(bool live_ch
*** 264,270 ****
  
  	/* Is it 9.0 but without tablespace directories? */
  	if (GET_MAJOR_VERSION(new_cluster.major_version) == 900 &&
! 		new_cluster.controldata.cat_ver < TABLE_SPACE_SUBDIRS)
  		pg_log(PG_FATAL, "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
  			   "because of backend API changes made during development.\n");
  }
--- 264,270 ----
  
  	/* Is it 9.0 but without tablespace directories? */
  	if (GET_MAJOR_VERSION(new_cluster.major_version) == 900 &&
! 		new_cluster.controldata.cat_ver < CAT_VER_TABLE_SPACE_SUBDIRS)
  		pg_log(PG_FATAL, "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
  			   "because of backend API changes made during development.\n");
  }
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
new file mode 100644
index 5ca570e..70d74ba
*** a/contrib/pg_upgrade/pg_upgrade.h
--- b/contrib/pg_upgrade/pg_upgrade.h
***************
*** 58,64 ****
  #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
  
  /* OID system catalog preservation added during PG 9.0 development */
! #define TABLE_SPACE_SUBDIRS 201001111
  
  /*
   * Each relation is represented by a relinfo structure.
--- 58,66 ----
  #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
  
  /* OID system catalog preservation added during PG 9.0 development */
! #define CAT_VER_TABLE_SPACE_SUBDIRS 201001111
! /* postmaster/postgres -b (binary_upgrade) flag added during PG 9.1 development */
! #define CAT_VER_BINARY_UPGRADE_SERVER_FLAG 201104221
  
  /*
   * Each relation is represented by a relinfo structure.
diff --git a/contrib/pg_upgrade/server.c b/contrib/pg_upgrade/server.c
new file mode 100644
index 2a0f50e..ca4a957
*** a/contrib/pg_upgrade/server.c
--- b/contrib/pg_upgrade/server.c
*************** start_postmaster(ClusterInfo *cluster, b
*** 173,178 ****
--- 173,183 ----
  	const char *datadir;
  	unsigned short port;
  	bool		exit_hook_registered = false;
+ #ifndef WIN32
+ 	char		*output_filename = log_opts.filename;
+ #else
+ 	char		*output_filename = DEVNULL;
+ #endif
  
  	bindir = cluster->bindir;
  	datadir = cluster->pgdata;
*************** start_postmaster(ClusterInfo *cluster, b
*** 193,199 ****
  	 * same file because we get the error: "The process cannot access the file
  	 * because it is being used by another process." so we have to send all
  	 * other output to 'nul'.
- 	 *
  	 * Using autovacuum=off disables cleanup vacuum and analyze, but freeze
  	 * vacuums can still happen, so we set autovacuum_freeze_max_age to its
  	 * maximum.  We assume all datfrozenxid and relfrozen values are less than
--- 198,203 ----
*************** start_postmaster(ClusterInfo *cluster, b
*** 202,216 ****
  	 */
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" "
! 			 "-o \"-p %d -c autovacuum=off "
! 			 "-c autovacuum_freeze_max_age=2000000000\" "
! 			 "start >> \"%s\" 2>&1" SYSTEMQUOTE,
! 			 bindir,
! #ifndef WIN32
! 			 log_opts.filename, datadir, port, log_opts.filename);
! #else
! 			 DEVNULL, datadir, port, DEVNULL);
! #endif
  	exec_prog(true, "%s", cmd);
  
  	/* wait for the server to start properly */
--- 206,218 ----
  	 */
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "\"%s/pg_ctl\" -l \"%s\" -D \"%s\" "
! 			 "-o \"-p %d %s\" start >> \"%s\" 2>&1" SYSTEMQUOTE,
! 			 bindir, output_filename, datadir, port,
! 			 (cluster->controldata.cat_ver >=
! 				CAT_VER_BINARY_UPGRADE_SERVER_FLAG) ? "-b" :
! 				"-c autovacuum=off -c autovacuum_freeze_max_age=2000000000",
! 			 log_opts.filename);
! 
  	exec_prog(true, "%s", cmd);
  
  	/* wait for the server to start properly */
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
new file mode 100644
index 8c5670f..870ddba
*** a/src/backend/catalog/heap.c
--- b/src/backend/catalog/heap.c
*************** heap_create_with_catalog(const char *rel
*** 1051,1057 ****
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
  			(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
  			 relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
  			 relkind == RELKIND_FOREIGN_TABLE))
--- 1051,1058 ----
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (IsBinaryUpgrade &&
! 			OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
  			(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
  			 relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
  			 relkind == RELKIND_FOREIGN_TABLE))
*************** heap_create_with_catalog(const char *rel
*** 1059,1065 ****
  			relid = binary_upgrade_next_heap_pg_class_oid;
  			binary_upgrade_next_heap_pg_class_oid = InvalidOid;
  		}
! 		else if (OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
  				 relkind == RELKIND_TOASTVALUE)
  		{
  			relid = binary_upgrade_next_toast_pg_class_oid;
--- 1060,1067 ----
  			relid = binary_upgrade_next_heap_pg_class_oid;
  			binary_upgrade_next_heap_pg_class_oid = InvalidOid;
  		}
! 		else if (IsBinaryUpgrade &&
! 				 OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
  				 relkind == RELKIND_TOASTVALUE)
  		{
  			relid = binary_upgrade_next_toast_pg_class_oid;
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
new file mode 100644
index c79402c..a662cfc
*** a/src/backend/catalog/index.c
--- b/src/backend/catalog/index.c
*************** index_create(Relation heapRelation,
*** 790,796 ****
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (OidIsValid(binary_upgrade_next_index_pg_class_oid))
  		{
  			indexRelationId = binary_upgrade_next_index_pg_class_oid;
  			binary_upgrade_next_index_pg_class_oid = InvalidOid;
--- 790,797 ----
  		 * Use binary-upgrade override for pg_class.oid/relfilenode, if
  		 * supplied.
  		 */
! 		if (IsBinaryUpgrade &&
! 			OidIsValid(binary_upgrade_next_index_pg_class_oid))
  		{
  			indexRelationId = binary_upgrade_next_index_pg_class_oid;
  			binary_upgrade_next_index_pg_class_oid = InvalidOid;
diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c
new file mode 100644
index 08d8aa1..61a9322
*** a/src/backend/catalog/pg_enum.c
--- b/src/backend/catalog/pg_enum.c
***************
*** 21,26 ****
--- 21,27 ----
  #include "catalog/pg_enum.h"
  #include "catalog/pg_type.h"
  #include "storage/lmgr.h"
+ #include "miscadmin.h"
  #include "utils/builtins.h"
  #include "utils/fmgroids.h"
  #include "utils/rel.h"
*************** restart:
*** 311,317 ****
  	}
  
  	/* Get a new OID for the new label */
! 	if (OidIsValid(binary_upgrade_next_pg_enum_oid))
  	{
  		/*
  		 * Use binary-upgrade override for pg_enum.oid, if supplied. During
--- 312,318 ----
  	}
  
  	/* Get a new OID for the new label */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_enum_oid))
  	{
  		/*
  		 * Use binary-upgrade override for pg_enum.oid, if supplied. During
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
new file mode 100644
index 9e35e73..80c1bfc
*** a/src/backend/catalog/pg_type.c
--- b/src/backend/catalog/pg_type.c
*************** TypeShellMake(const char *typeName, Oid 
*** 125,131 ****
  	tup = heap_form_tuple(tupDesc, values, nulls);
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_pg_type_oid))
  	{
  		HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  		binary_upgrade_next_pg_type_oid = InvalidOid;
--- 125,131 ----
  	tup = heap_form_tuple(tupDesc, values, nulls);
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
  	{
  		HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  		binary_upgrade_next_pg_type_oid = InvalidOid;
*************** TypeCreate(Oid newTypeOid,
*** 430,436 ****
  		if (OidIsValid(newTypeOid))
  			HeapTupleSetOid(tup, newTypeOid);
  		/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 		else if (OidIsValid(binary_upgrade_next_pg_type_oid))
  		{
  			HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  			binary_upgrade_next_pg_type_oid = InvalidOid;
--- 430,436 ----
  		if (OidIsValid(newTypeOid))
  			HeapTupleSetOid(tup, newTypeOid);
  		/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 		else if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
  		{
  			HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
  			binary_upgrade_next_pg_type_oid = InvalidOid;
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
new file mode 100644
index 85fe57f..362d26d
*** a/src/backend/catalog/toasting.c
--- b/src/backend/catalog/toasting.c
*************** create_toast_table(Relation rel, Oid toa
*** 157,163 ****
  	 * creation even if it seems not to need one.
  	 */
  	if (!needs_toast_table(rel) &&
! 		!OidIsValid(binary_upgrade_next_toast_pg_class_oid))
  		return false;
  
  	/*
--- 157,164 ----
  	 * creation even if it seems not to need one.
  	 */
  	if (!needs_toast_table(rel) &&
! 		(!IsBinaryUpgrade ||
! 		 !OidIsValid(binary_upgrade_next_toast_pg_class_oid)))
  		return false;
  
  	/*
*************** create_toast_table(Relation rel, Oid toa
*** 202,208 ****
  		namespaceid = PG_TOAST_NAMESPACE;
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_toast_pg_type_oid))
  	{
  		toast_typid = binary_upgrade_next_toast_pg_type_oid;
  		binary_upgrade_next_toast_pg_type_oid = InvalidOid;
--- 203,209 ----
  		namespaceid = PG_TOAST_NAMESPACE;
  
  	/* Use binary-upgrade override for pg_type.oid, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_toast_pg_type_oid))
  	{
  		toast_typid = binary_upgrade_next_toast_pg_type_oid;
  		binary_upgrade_next_toast_pg_type_oid = InvalidOid;
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
new file mode 100644
index 1a20b0d..b3b6dc2
*** a/src/backend/commands/typecmds.c
--- b/src/backend/commands/typecmds.c
*************** AssignTypeArrayOid(void)
*** 1550,1556 ****
  	Oid			type_array_oid;
  
  	/* Use binary-upgrade override for pg_type.typarray, if supplied. */
! 	if (OidIsValid(binary_upgrade_next_array_pg_type_oid))
  	{
  		type_array_oid = binary_upgrade_next_array_pg_type_oid;
  		binary_upgrade_next_array_pg_type_oid = InvalidOid;
--- 1550,1556 ----
  	Oid			type_array_oid;
  
  	/* Use binary-upgrade override for pg_type.typarray, if supplied. */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_array_pg_type_oid))
  	{
  		type_array_oid = binary_upgrade_next_array_pg_type_oid;
  		binary_upgrade_next_array_pg_type_oid = InvalidOid;
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
new file mode 100644
index 3f7d499..838d6eb
*** a/src/backend/commands/user.c
--- b/src/backend/commands/user.c
*************** CreateRole(CreateRoleStmt *stmt)
*** 388,394 ****
  	 * pg_largeobject_metadata contains pg_authid.oid's, so we use the
  	 * binary-upgrade override, if specified.
  	 */
! 	if (OidIsValid(binary_upgrade_next_pg_authid_oid))
  	{
  		HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
  		binary_upgrade_next_pg_authid_oid = InvalidOid;
--- 388,394 ----
  	 * pg_largeobject_metadata contains pg_authid.oid's, so we use the
  	 * binary-upgrade override, if specified.
  	 */
! 	if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_authid_oid))
  	{
  		HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
  		binary_upgrade_next_pg_authid_oid = InvalidOid;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
new file mode 100644
index 6e7f664..c0cf033
*** a/src/backend/postmaster/postmaster.c
--- b/src/backend/postmaster/postmaster.c
*************** PostmasterMain(int argc, char *argv[])
*** 529,535 ****
  	 * tcop/postgres.c (the option sets should not conflict) and with the
  	 * common help() function in main/main.c.
  	 */
! 	while ((opt = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
  	{
  		switch (opt)
  		{
--- 529,535 ----
  	 * tcop/postgres.c (the option sets should not conflict) and with the
  	 * common help() function in main/main.c.
  	 */
! 	while ((opt = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
  	{
  		switch (opt)
  		{
*************** PostmasterMain(int argc, char *argv[])
*** 541,546 ****
--- 541,551 ----
  				SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
  				break;
  
+ 			case 'b':
+ 				/* Undocumented flag used for binary upgrades */
+ 				IsBinaryUpgrade = true;
+ 				break;
+ 
  			case 'D':
  				userDoption = optarg;
  				break;
*************** ServerLoop(void)
*** 1480,1487 ****
  		if (WalWriterPID == 0 && pmState == PM_RUN)
  			WalWriterPID = StartWalWriter();
  
! 		/* If we have lost the autovacuum launcher, try to start a new one */
! 		if (AutoVacPID == 0 &&
  			(AutoVacuumingActive() || start_autovac_launcher) &&
  			pmState == PM_RUN)
  		{
--- 1485,1497 ----
  		if (WalWriterPID == 0 && pmState == PM_RUN)
  			WalWriterPID = StartWalWriter();
  
! 		/*
! 		 *	If we have lost the autovacuum launcher, try to start a new one.
! 		 *	We don't want autovacuum to run in binary upgrade mode because
! 		 *	autovacuum might update relfrozenxid for empty tables before
! 		 *	the physical files are put in place.
! 		 */
! 		if (!IsBinaryUpgrade && AutoVacPID == 0 &&
  			(AutoVacuumingActive() || start_autovac_launcher) &&
  			pmState == PM_RUN)
  		{
*************** reaper(SIGNAL_ARGS)
*** 2413,2419 ****
  			 */
  			if (WalWriterPID == 0)
  				WalWriterPID = StartWalWriter();
! 			if (AutoVacuumingActive() && AutoVacPID == 0)
  				AutoVacPID = StartAutoVacLauncher();
  			if (XLogArchivingActive() && PgArchPID == 0)
  				PgArchPID = pgarch_start();
--- 2423,2429 ----
  			 */
  			if (WalWriterPID == 0)
  				WalWriterPID = StartWalWriter();
! 			if (!IsBinaryUpgrade && AutoVacuumingActive() && AutoVacPID == 0)
  				AutoVacPID = StartAutoVacLauncher();
  			if (XLogArchivingActive() && PgArchPID == 0)
  				PgArchPID = pgarch_start();
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
new file mode 100644
index 59b7666..a07661f
*** a/src/backend/tcop/postgres.c
--- b/src/backend/tcop/postgres.c
*************** process_postgres_switches(int argc, char
*** 3238,3244 ****
  	 * postmaster/postmaster.c (the option sets should not conflict) and with
  	 * the common help() function in main/main.c.
  	 */
! 	while ((flag = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
  	{
  		switch (flag)
  		{
--- 3238,3244 ----
  	 * postmaster/postmaster.c (the option sets should not conflict) and with
  	 * the common help() function in main/main.c.
  	 */
! 	while ((flag = getopt(argc, argv, "A:B:bc:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:-:")) != -1)
  	{
  		switch (flag)
  		{
*************** process_postgres_switches(int argc, char
*** 3250,3255 ****
--- 3250,3260 ----
  				SetConfigOption("shared_buffers", optarg, ctx, gucsource);
  				break;
  
+ 			case 'b':
+ 				/* Undocumented flag used for binary upgrades */
+ 				IsBinaryUpgrade = true;
+ 				break;
+ 
  			case 'D':
  				if (secure)
  					userDoption = strdup(optarg);
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
new file mode 100644
index 984ffd0..c4c4154
*** a/src/backend/utils/init/globals.c
--- b/src/backend/utils/init/globals.c
*************** pid_t		PostmasterPid = 0;
*** 85,90 ****
--- 85,91 ----
   */
  bool		IsPostmasterEnvironment = false;
  bool		IsUnderPostmaster = false;
+ bool		IsBinaryUpgrade = false;
  
  bool		ExitOnAnyError = false;
  
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
new file mode 100644
index a4c5d4c..1f6fba5
*** a/src/backend/utils/init/postinit.c
--- b/src/backend/utils/init/postinit.c
*************** InitPostgres(const char *in_dbname, Oid 
*** 626,631 ****
--- 626,641 ----
  	}
  
  	/*
+ 	 * Binary upgrades only allowed super-user connections
+ 	 */
+ 	if (IsBinaryUpgrade && !am_superuser)
+ 	{
+ 			ereport(FATAL,
+ 					(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 			errmsg("must be superuser to connect in binary upgrade mode")));
+ 	}
+ 
+ 	/*
  	 * The last few connections slots are reserved for superusers. Although
  	 * replication connections currently require superuser privileges, we
  	 * don't allow them to consume the reserved slots, which are intended for
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
new file mode 100644
index 53c684a..22926b0
*** a/src/include/catalog/catversion.h
--- b/src/include/catalog/catversion.h
***************
*** 53,58 ****
   */
  
  /*							yyyymmddN */
! #define CATALOG_VERSION_NO	201104181
  
  #endif
--- 53,58 ----
   */
  
  /*							yyyymmddN */
! #define CATALOG_VERSION_NO	201104221
  
  #endif
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
new file mode 100644
index aa8cce5..9d19417
*** a/src/include/miscadmin.h
--- b/src/include/miscadmin.h
*************** do { \
*** 124,129 ****
--- 124,130 ----
  extern pid_t PostmasterPid;
  extern bool IsPostmasterEnvironment;
  extern PGDLLIMPORT bool IsUnderPostmaster;
+ extern bool IsBinaryUpgrade;
  
  extern bool ExitOnAnyError;
  

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Bruce Momjian <bruce@momjian.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Tom Lane <tgl@sss.pgh.pa.us>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Tom Lane <tgl@sss.pgh.pa.us>
Дата:

Re: Problem with pg_upgrade?

От:
Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>
Дата:

Re: pg_upgrade bug found!

От:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov>
Дата:

Re: pg_upgrade bug found!

От:
Josh Berkus <josh@agliodbs.com>
Дата:

Re: pg_upgrade bug found!

От:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov>
Дата:

Re: pg_upgrade bug found!

От:
Josh Berkus <josh@agliodbs.com>
Дата:

Re: Patch for pg_upgrade to turn off autovacuum

От:
Robert Haas <robertmhaas@gmail.com>
Дата:

Re: Problem with pg_upgrade?

От:
Gurjeet Singh <singh.gurjeet@gmail.com>
Дата:
On Wed, Mar 30, 2011 at 10:57 AM, Bruce Momjian <bruce@momjian.us> wrote:

I am hearing only second-hand reports of this problem through
Rhodiumtoad on IRC.  I don't have IRC access this week

If the firewalls allow port 80, you can use Freenode's web interface: webchat.freenode.net

Regards,
--
Gurjeet Singh
EnterpriseDB Corporation
The Enterprise PostgreSQL Company

Re: Problem with pg_upgrade?

От:
Robert Haas <robertmhaas@gmail.com>
Дата:

Re: Problem with pg_upgrade?

От:
Robert Haas <robertmhaas@gmail.com>
Дата:

Re: Problem with pg_upgrade?

От:
Robert Haas <robertmhaas@gmail.com>
Дата:

Re: Problem with pg_upgrade?

От:
Robert Haas <robertmhaas@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
Robert Haas <robertmhaas@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
Aidan Van Dyk <aidan@highrise.ca>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
Robert Haas <robertmhaas@gmail.com>
Дата:

Re: pg_upgrade bug found!

От:
bricklen <bricklen@gmail.com>
Дата:
FAQ