Recovering deleted or updated rows
Hi
I'm looking for a way to recover deleted or old versions of
accidentally updated rows from a postgres 7.4 database. I've
verified that the relevant tables haven't been vacuumed since
the accident took place.
I was thinking that it might work to patch the clog so that
the offending transactions look like they have never been
comitted? Would that work? How could I patch the clog?
If you have any other ideas, please tell me - I'm quite
desperate ;-)
greetings, Florian Pflug
----- Original Message -----
From: "Florian G. Pflug" <fgp@phlo.org>
To: <pgsql-general@postgresql.org>
Sent: Wednesday, November 15, 2006 11:19 AM
Subject: [GENERAL] Recovering deleted or updated rows
Hi
I'm looking for a way to recover deleted or old versions of
accidentally updated rows from a postgres 7.4 database. I've
verified that the relevant tables haven't been vacuumed since
the accident took place.I was thinking that it might work to patch the clog so that
the offending transactions look like they have never been
comitted? Would that work? How could I patch the clog?If you have any other ideas, please tell me - I'm quite
desperate ;-)
be sure to backup the data files before trying any of my ideas
1) pgfsck - last supported version was iirc 7.3, but with some hacking it
may work for You (When I tried it with 7.4 , it gave some errors about
unknown data types)
2) pg_resetxlog
-select xmin from table where id=id_of_a_badly_updated_row (if that was
updated in one transaction. If not, try to find the minimum xmin)
-stop postmaster
- reset the transaction counter to a value a hundred less than what You get.
-start postmaster, and You should see the old data.
-pg_dump the table . There may be some strange things in the dump - review
it manually.
-stop postmaster
-restore datafiles from backup (pg_resetxlog may have messed up your data)
Greetings
Marcin
"Florian G. Pflug" <fgp@phlo.org> writes:
I'm looking for a way to recover deleted or old versions of
accidentally updated rows from a postgres 7.4 database. I've
verified that the relevant tables haven't been vacuumed since
the accident took place.
I was thinking that it might work to patch the clog so that
the offending transactions look like they have never been
comitted? Would that work? How could I patch the clog?
By this point the lost rows are no doubt marked HEAP_XMAX_COMMITTED,
which means that hacking the clog entries wouldn't accomplish anything
by itself --- you'd have to go and unset those hint bits, too.
Given that, you might as well not bother with patching clog; it
wouldn't be any more trouble to unset HEAP_XMAX_COMMITTED and set
HEAP_XMAX_INVALID in each tuple you needed to resurrect.
You'd need a custom tool to do either though :-(
regards, tom lane
Tom Lane wrote:
"Florian G. Pflug" <fgp@phlo.org> writes:
I'm looking for a way to recover deleted or old versions of
accidentally updated rows from a postgres 7.4 database. I've
verified that the relevant tables haven't been vacuumed since
the accident took place.I was thinking that it might work to patch the clog so that
the offending transactions look like they have never been
comitted? Would that work? How could I patch the clog?By this point the lost rows are no doubt marked HEAP_XMAX_COMMITTED,
which means that hacking the clog entries wouldn't accomplish anything
by itself --- you'd have to go and unset those hint bits, too.Given that, you might as well not bother with patching clog; it
wouldn't be any more trouble to unset HEAP_XMAX_COMMITTED and set
HEAP_XMAX_INVALID in each tuple you needed to resurrect.You'd need a custom tool to do either though :-(
Thanks for you comments - they have been enlighting as usual ;-)
Fortunatly, the customer changed his mind, and now will manually
reenter the lost data.
Thanks anyways,
Florian Pflug