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
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 |