PostgreSQL: ERROR: invalid page header in block XXXXXX of relation base/XXXXX/XXXXX

3747 1

На VDS одного из проектов который я поддерживаю и который крутится на моем хостере по умолчанию (firstvds) недавно произошел сбой.

Сбои на VDS сами по себе явления необычные, а тут прям все "колом встало". 

В результате разбора ситуации оказалось что сбойнула файловая система.

Файловую систему оживил но уперся в другую проблему. Postgres отказался запускаться и писал что-то типа:


Эту проблему решил довольно быстро командой:

root$ pg_resetxlog DATADIR

И перезапуском postgresql.

Но в результате получил сбои при работе с базой проекта, обусловленные "битыми" индексами в одной из таблиц базы.

Выражалось это при любых попытках манипуляций с базой, ошибками вида:

ERROR: invalid page header in block XXXXX of relation base/XXXXX/XXXXX

При попытке сделать резервную копию базы получил ошибку вида:

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

Решение данной проблемы нагуглил не сразу и уже готовился к сносу данных и восстановлению из резервных копий. 

Но случайно набрел на рекомендации от lxadm.com в следующем виде:

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

Все сработало и индексы в моём случае восстановились без потерь данных.


Комментарии

3 марта 2022 г. 8:40 otistarda
Спасибо, помогло.

Контактные данные

 Россия, г. Москва