Re: Help: my table is corrupt!

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Jos van Roosmalen <josr(at)josr(dot)org>
Cc: pgsql-admin(at)postgresql(dot)org
Subject: Re: Help: my table is corrupt!
Date: 2005-03-27 16:23:00
Message-ID: 5730.1111940580@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin

Jos van Roosmalen <josr(at)josr(dot)org> writes:
> Can someone explain me how to repair a table?

> If I execute a 'select * from <brokentable>' in PSQL I get the next
> error. A pg_dump export only partially export the broken table and
> ends with the same error:

> "Invalid memory alloc request size: 4294967290"

What you've probably got is a variable-width field whose length word
is corrupted. The best procedure is to identify and delete the broken
row (or rows; it's likely that the corruption hit more than just one
byte). You can find more details about this in the archives but the
short answer is that you do this by trial-and-error. I'd do something
like:

1. Determine how far into the table the bad value is, by finding the
smallest N such that
select * from tab offset N limit 1
fails. This is a bit tedious but if you understand the principle of
binary search (a/k/a divide and conquer) it won't take long.

2. Find a way to name that row, and delete it. ctid always works:
select ctid from tab offset N limit 1
delete from tab where ctid = 'that value'
You might also select as much as you can out of the row before you
delete it, to find out what it is you are losing. Usually, you'll
be able to select all the columns to the left of the corrupted one.
select a,b,c from tab where ctid = 'that value'

3. Can you pg_dump the table yet? If not, return to step 1.

This assumes that you just want to get rid of the bad data ASAP
and not try to do any forensics to discover what happened. If you
want to study the corruption in detail you could use pg_filedump
on the damaged page. The first component of ctid is the page number.

> Is there a Postgresql Repair application which delete or repair
> corrupt records?

I've not seen anything that really looks at the data contents of rows.

regards, tom lane

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Tom Lane 2005-03-27 16:32:12 Re: [NOVICE] [pgsql-advocacy] Function which gives back the nearest neighbours
Previous Message Bruno Wolff III 2005-03-27 16:22:21 Re: ´Stalled post to pgsq