Re: Help: my table is corrupt!

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view

Re: Help: my table is corrupt!

Tom Lane-2
Jos van Roosmalen <[hidden email]> 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

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

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend