Thread: Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Alvaro Herrera
Date:
On 2019-Oct-04, Moreno Andreo wrote: > select * from heap_page_items(get_raw_page('tablename',3159)); > select * from heap_page_items(get_raw_page('tablename',3160)); > > and so on for about 5 or 6 pages. Please paste the output of that for pages 3159 and 3160, as well as the output of pg_controldata. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Moreno Andreo
Date:
Il 04/10/19 17:30, Alvaro Herrera ha scritto: > On 2019-Oct-04, Moreno Andreo wrote: > >> select * from heap_page_items(get_raw_page('tablename',3159)); >> select * from heap_page_items(get_raw_page('tablename',3160)); >> >> and so on for about 5 or 6 pages. > Please paste the output of that for pages 3159 and 3160, as well as the > output of pg_controldata. > Thanks Alvaro, you can find attached the data you requested
Attachment
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Alvaro Herrera
Date:
On 2019-Oct-04, Moreno Andreo wrote: > Il 04/10/19 17:30, Alvaro Herrera ha scritto: > > On 2019-Oct-04, Moreno Andreo wrote: > > > > > select * from heap_page_items(get_raw_page('tablename',3159)); > > > select * from heap_page_items(get_raw_page('tablename',3160)); > > > > > > and so on for about 5 or 6 pages. > > Please paste the output of that for pages 3159 and 3160, as well as the > > output of pg_controldata. > > > Thanks Alvaro, > you can find attached the data you requested Hmm, so it is tuple (3160,31) that's giving you grief -- it has xmax=12800 t_infomask=0x1103 (HEAP_XMAX_IS_MULTI | HEAP_XMIN_COMMITTED | others) Which is weird, since it has none of the locking bits. ... and also the valid range of multixacts as of the last checkpoint was: > NextMultiXactId dell'ultimo checkpoint: 366 > oldestMultiXID dell'ultimo checkpoint: 365 so the value 12800 is certainly not in range there. I wonder if it would work to just clear that multixact with SELECT ... WHERE ctid='(3160,31)' FOR UPDATE If this was in my hands, I would scan the WAL looking for the place that last touched this page (and the latest FPI for this page, also). It might have an explanation of what went on. Maybe use the page's LSN (from pageinspect's page_header()) as starting point for the WAL location that modified the page. I hope you have a WAL archive that goes back to well before the previous checkpoint. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Moreno Andreo
Date:
Il 04/10/19 18:28, Alvaro Herrera ha scritto: > I wonder if it would work to just clear that multixact with > SELECT ... WHERE ctid='(3160,31)' FOR UPDATE select ...what? :-) Sorry but it's totally beyond my knowledge and my control.... after resolving the issue i'll surely go and search docs to understand what we've done.... > > If this was in my hands, I would scan the WAL looking for the place that > last touched this page (and the latest FPI for this page, also). It > might have an explanation of what went on. Maybe use the page's LSN > (from pageinspect's page_header()) as starting point for the WAL > location that modified the page. I hope you have a WAL archive that > goes back to well before the previous checkpoint. One thing I forgot to report is that this cluster is just upgraded from a 9.1 that was crashing at least once a day (in many cases the upgrade itself resolved the issue) here's the log line 2019-10-03 15:11:52 CEST LOG: server process (PID 18668) was terminated by exception 0xC0000005 In this case probably the access violation was due to a data corruption. These are customer machines that are really badly kept and NTFS issues are not that rare, so I won't bother investigating what's happened but just make the customer up & running again. Thanks for your time Moreno >
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Alvaro Herrera
Date:
On 2019-Oct-04, Moreno Andreo wrote: > Il 04/10/19 18:28, Alvaro Herrera ha scritto: > > I wonder if it would work to just clear that multixact with > > SELECT ... WHERE ctid='(3160,31)' FOR UPDATE > select ...what? :-) Sorry but it's totally beyond my knowledge and my > control.... after resolving the issue i'll surely go and search docs to > understand what we've done.... This should do it: SELECT * FROM the_broken_table WHERE <what I said above> But of course I make no promise of it working or even having any effect at all ... > One thing I forgot to report is that this cluster is just upgraded from a > 9.1 that was crashing at least once a day (in many cases the upgrade itself > resolved the issue) > here's the log line > 2019-10-03 15:11:52 CEST LOG: server process (PID 18668) was terminated by > exception 0xC0000005 > In this case probably the access violation was due to a data corruption. > These are customer machines that are really badly kept and NTFS issues are > not that rare, so I won't bother investigating what's happened but just make > the customer up & running again. Hmm, well, it does sound like corrupted data, and if we suspect that that's the case then there's not much we can do other than clearing the page and moving on. That exception code is STATUS_ACCESS_VIOLATION. Old Postgres bugs caused that, many are fixed in current versions I think. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Moreno Andreo
Date:
Il 04/10/19 21:14, Alvaro Herrera ha scritto: > On 2019-Oct-04, Moreno Andreo wrote: > >> Il 04/10/19 18:28, Alvaro Herrera ha scritto: >>> I wonder if it would work to just clear that multixact with >>> SELECT ... WHERE ctid='(3160,31)' FOR UPDATE >> select ...what? :-) Sorry but it's totally beyond my knowledge and my >> control.... after resolving the issue i'll surely go and search docs to >> understand what we've done.... > This should do it: > > SELECT * FROM the_broken_table WHERE <what I said above> > > But of course I make no promise of it working or even having any effect > at all ... Unfortunately, it didn't work :( db0=# select * from failing_table where ctid='(3160,31)' for update; ERROR: MultiXactId 12800 has not been created yet -- apparent wraparound Since the probability we are into corruption is very high, what if I \copy all the table but the failing row(s) to an external file, drop and recreate the table, and then \copy clean data back inside? Thanks Moreno.-
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Alvaro Herrera
Date:
On 2019-Oct-07, Moreno Andreo wrote: > Unfortunately, it didn't work :( > > db0=# select * from failing_table where ctid='(3160,31)' for update; > ERROR: MultiXactId 12800 has not been created yet -- apparent wraparound Oh well. It was a long shot anyway ... > Since the probability we are into corruption is very high, what if I \copy > all the table but the failing row(s) to an external file, drop and recreate > the table, and then \copy clean data back inside? Yes, that should work. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparentwraparound
From
Moreno Andreo
Date:
Hi Alvaro, sorry for late reply, I've been out of office. Il 09/10/19 19:51, Alvaro Herrera ha scritto: > On 2019-Oct-07, Moreno Andreo wrote: > >> Unfortunately, it didn't work :( >> >> db0=# select * from failing_table where ctid='(3160,31)' for update; >> ERROR: MultiXactId 12800 has not been created yet -- apparent wraparound > Oh well. It was a long shot anyway ... It was a long shot, but it was worth trying >> Since the probability we are into corruption is very high, what if I \copy >> all the table but the failing row(s) to an external file, drop and recreate >> the table, and then \copy clean data back inside? > Yes, that should work. It did not work... I think there was some big deal with the cluster itself. To extract these small parts of data I had to SELECT using OFFSET and LIMIT. Well, the same query (i.e. select * from table offset 35 limit 145) run as it is worked well, but from the moment I put it into a COPY statement, it was messing again with multixact, even if I tried back the only query. It ended recovering data from backups (2 days old, and that's good news) Thanks for your time Moreno.- >