Re: pg_upgrade < 9.3 -> >=9.3 misses a step around multixacts
От | Andres Freund |
---|---|
Тема | Re: pg_upgrade < 9.3 -> >=9.3 misses a step around multixacts |
Дата | |
Msg-id | 20140720210408.GC5974@alap3.anarazel.de обсуждение исходный текст |
Ответ на | Re: pg_upgrade < 9.3 -> >=9.3 misses a step around multixacts (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-bugs |
On 2014-07-20 15:55:25 -0400, Tom Lane wrote: > I wrote: > > I started transcribing Bruce's proposed fix procedure at > > https://wiki.postgresql.org/wiki/20140702pg_upgrade_fix > > into the release notes, but I'm afraid it's all wet. > > > He's suggesting copying the last checkpoint's NextMultiXactId into > > datminmxid/relminmxid, which is surely the wrong thing: that's likely to > > be newer than all mxids in the tables, not older than them. I thought at > > first that this was a simple thinko and he meant to write oldestMultiXid, > > but here's the thing: if we're in the situation where we've got > > wraparound, isn't oldestMultiXid going to be 1? The value recorded in the > > checkpoint isn't magic, it's just going to be extracted from whatever's in > > pg_database; and the whole problem here is that we can't trust that data. > > Where can we get a useful lower bound from? > > Ugh: it's worse than that. pg_upgrade itself is using this utterly > nonsensical logic to set datminmxid/relminmxid. This is a stop-ship > issue for 9.3.5. > > After some reflection it seems to me that we could estimate oldestmxid for > a pre-9.3 source cluster as the NextMultiXactId from its pg_control less > 2000000000 or so. This will nearly always be much older than the actual > oldest mxid, but that's okay --- the next vacuuming cycle will advance the > datminmxid/relminmxid values to match reality, so long as they aren't > wrapped around already. I think NextMultiXactId should be fine when upgrading from pre 9.3 clusters. Pre 9.3 multis that have been written before a shutdown don't really have a meaning: To the point that we actually never look at them. MultiXactIdSetOldestVisible() would have set oldestMXact to MultiXactState->nextMXact if no backend has any active ones. GetMultiXactIdMembers et al will deal with that. So I think for pg_upgrade itself using NextMulti as a replacement for oldestMXact is fine. Now that obviously does *not* mean it's safe to do that to after the cluster has already been running 9.3+. Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
В списке pgsql-bugs по дате отправления: