PostgreSQL: ERROR: invalid page header in block 13760 of relation base/16995/67484

From lxadm | Linux administration tips, tutorials, HOWTOs and articles
Jump to: navigation, search

When you see this in your PostgreSQL log:

ERROR: invalid page header in block 13760 of relation base/16995/67484

or that, when doing your database dump:

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: invalid page header in block 11947 of relation base/16995/17062
pg_dump: The command was: COPY public.samaged_table (column1, column2, column3, ...) TO stdout;

it is likely your PostgreSQL server has hardware issues or has crashed (or, the VM host, as in my case). If it’s the case, pg_dump / pg_dumpall will error and exit when seeing a corrupted block.

Unfortunately, it means you’ll loose some data, so depending on what you have in your database, you may resort to some other methods.

Here is a quick way to fix it:

database=# SET zero_damaged_pages = on;
SET
database=# VACUUM FULL damaged_table;
WARNING: invalid page header in block 13748 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13749 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13757 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13758 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13759 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13760 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13762 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13782 of relation base/16995/67484; zeroing out page
(...)
WARNING: index "damaged_table_site_id" contains 14697831 row versions, but table contains 14709258 row versions
HINT: Rebuild the index with REINDEX.
WARNING: invalid page header in block 13762 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13816 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13817 of relation base/16995/67484; zeroing out page
WARNING: invalid page header in block 13818 of relation base/16995/67484; zeroing out page
(...)
WARNING: index "damaged_table_site_id" contains 14697498 row versions, but table contains 14709258 row versions
HINT: Rebuild the index with REINDEX.
VACUUM

database=# REINDEX TABLE damaged_table;

Do a database dump after that to make sure it’s no longer corrupted (pg_dump / pg_dumpall should no longer complain).