Re: check database integrity

From: Torsten Förtsch <torsten(dot)foertsch(at)gmx(dot)net>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: check database integrity
Date: 2014-07-22 14:44:48
Message-ID: 53CE78E0.30106@gmx.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 21/07/14 16:17, Tom Lane wrote:
>> > db=# select page_header(get_raw_page(2836::oid::regclass::text, 'fsm',
>> > 1));
>> > ERROR: block number 1 is out of range for relation "pg_toast_1255"
>> > db=# select pg_relation_size(2836::oid::regclass, 'fsm');
>> > pg_relation_size
>> > ------------------
>> > 24576
> That's bizarre. AFAICS, pg_relation_size() reduces to a stat() call,
> while the other error looks like it's coming from rawpage.c's check on
> RelationGetNumberOfBlocks() which depends on mdnblocks() which prefers
> to look at the result of lseek(SEEK_END). But both of those should
> surely get the same answer, if the file's not changing.
>
> Could you trace through it and see where the results diverge? Also,
> what's the actual size of the file on disk?

# select pg_relation_filepath(2836::oid::regclass);
pg_relation_filepath
----------------------
base/25317/11790

# ls -l data/base/25317/11790*
-rw------- 1 postgres postgres 8192 Jul 21 07:31 data/base/25317/11790
-rw------- 1 postgres postgres 24576 Jul 21 07:33 data/base/25317/11790_fsm
-rw------- 1 postgres postgres 8192 Jul 21 07:33 data/base/25317/11790_vm

You see, main and vm forks of the relation are one page. Only fsm is 3
pages.

After a fresh restart of the database I attached strace to the backend.
There are only 2 lines in the output that mention that relation:

open("base/25317/11790", O_RDWR) = 35
lseek(35, 0, SEEK_END) = 8192

This happened during this query:

select get_raw_page(2836::oid::regclass::text, 'fsm', 1);

Shouldn't it rather open 11790_fsm?

Or is there something that first checks the main fork to see if the fsm
page makes sense?

It seems so because here is the same query for a relation where it works:

open("base/25317/60966", O_RDWR) = 39
lseek(39, 0, SEEK_END) = 1490944
open("base/25317/60966_fsm", O_RDWR) = 40
lseek(40, 8192, SEEK_SET) = 8192
read(40, "\37\1\0\0\360\371\275\212\305\35\0\0\30\0\0 \0 \4
\0\0\0\0\0\0\0\0\372\372\0\372"..., 8192) = 8192

First it opens the main fork, then *_fsm where it reads a page at offset
8192.

Torsten

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message David G Johnston 2014-07-22 14:49:42 Re: Referencing serial col's sequence for insert
Previous Message rob stone 2014-07-22 14:30:55 Re: Referencing serial col's sequence for insert