Re: found xmin from before relfrozenxid on pg_catalog.pg_authid - Mailing list pgsql-general

From Jeremy Finzel
Subject Re: found xmin from before relfrozenxid on pg_catalog.pg_authid
Date
Msg-id CAMa1XUixhP2XoBSjBfaU+-rxh_PmoGKLZtyfax5g_5QpvoxFNg@mail.gmail.com
Whole thread Raw
In response to Re: found xmin from before relfrozenxid on pg_catalog.pg_authid  (Andres Freund <andres@anarazel.de>)
Responses Re: found xmin from before relfrozenxid on pg_catalog.pg_authid  (Andres Freund <andres@anarazel.de>)
List pgsql-general


On Mon, Mar 19, 2018 at 2:41 PM, Andres Freund <andres@anarazel.de> wrote:
On 2018-03-19 14:37:24 -0500, Jeremy Finzel wrote:
> We upgraded to 9.5.5, and today we are running 9.5.11.  And actually we
> upgraded from 9.3, not 9.4.  We are still trying to figure out which point
> release we were on at 9.3.

Ok.  IIRC there used to be a bug a few years back that sometimes lead to
highly contended pages being skipped during vacuum, and we'd still
update relfrozenxid. IIRC it required the table to be extended at the
same time or something?


>
> > - Can you install the pageinspect extension? If so, it might be a
> >   CREATE EXTENSION pageinspect;
> >   CREATE OR REPLACE FUNCTION check_rel(rel regclass, OUT blockno int8, OUT
> > lp int2, OUT xmin xid)
> > RETURNS SETOF RECORD
> > LANGUAGE SQL
> > AS $$
> >     SELECT blockno, lp, t_xmin
> >     FROM
> >         generate_series(0, pg_relation_size($1::text) / 8192 - 1) blockno,
> > -- every block in the relation
> >         heap_page_items(get_raw_page($1::text, blockno::int4)) -- every
> > item on the page
> >     WHERE
> >         t_xmin IS NOT NULL -- filter out empty items
> >         AND t_xmin != 1 -- filter out bootstrap
> >         AND t_xmin != 2 -- filter out frozen transaction id
> >         AND (t_infomask & ((x'0100' | x'0200')::int)) != ((x'0100' |
> > x'0200')::int) -- filter out frozen rows with xid present
> >         AND age(t_xmin) > age((SELECT relfrozenxid FROM pg_class WHERE oid
> > = $1)) -- xid cutoff filter
> > $$;
> >   SELECT * FROM check_rel('pg_authid') LIMIT 100;
> >
>
> Small note - Needs to be this because != is not supported for xid:
>
>         AND NOT t_xmin = 1 -- filter out bootstrap
>         AND NOT t_xmin = 2 -- filter out frozen transaction id

Only on older releases ;). But yea, that looks right.



> >   and then display all items for one of the affected pages like
> >   SELECT * FROM heap_page_items(get_raw_page('pg_authid', 34343));
> >
> >
> > Alvaro:
> > - Hm, we talked about code adding context for these kind of errors,
> >   right? Is that just skipped for csvlog?
> > - Alvaro, does the above check_rel() function make sense?
> >
> > Greetings,
> >
> > Andres Freund
> >
>
> The function does NOT show any issue with either of those tables.

Uh, huh?  Alvaro, do you see a bug in my query?

Greetings,

Andres Freund

FWIW, if I remove the last filter, I get these rows and I believe row 7/57/2906288382 is the one generating error:

SELECT * FROM check_rel('pg_authid') LIMIT 100;
 blockno | lp |    xmin
---------+----+------------
       7 |  4 | 2040863716
       7 |  5 | 2040863716
       7 |  8 | 2041172882
       7 |  9 | 2041172882
       7 | 12 | 2041201779
       7 | 13 | 2041201779
       7 | 16 | 2089742733
       7 | 17 | 2090021318
       7 | 18 | 2090021318
       7 | 47 | 2090021898
       7 | 48 | 2090021898
       7 | 49 | 2102749003
       7 | 50 | 2103210571
       7 | 51 | 2103210571
       7 | 54 | 2154640913
       7 | 55 | 2163849781
       7 | 56 | 2295315714
       7 | 57 | 2906288382
       7 | 58 | 2906329443
       7 | 60 | 3131766386
       8 |  1 | 2089844462
       8 |  2 | 2089844462
       8 |  3 | 2089844463
       8 |  6 | 2089844463
       8 |  9 | 2295318868
(25 rows)

pgsql-general by date:

Previous
From: Andres Freund
Date:
Subject: Re: found xmin from before relfrozenxid on pg_catalog.pg_authid
Next
From: Andres Freund
Date:
Subject: Re: found xmin from before relfrozenxid on pg_catalog.pg_authid