На 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;
Все сработало и индексы в моём случае восстановились без потерь данных.
Комментарии