PostgreSQL. ERROR: failed to re-find parent key in index for split pages
Что делать, если после перезагрузки сервера, не стартует PostgreSQL, а свой отказ запускаться мотивирует следующей строкой в логах:
failed to re-find parent key in index "16596" for split pages 327272/327287
Простейшее, что приходит на ум, это пересоздать БД из бекапов.
Но, если есть в наличии несколько минут, можно попробовать очистить логи транзакций сервера.
Для этого под суперпользователем БД PostgreSQL запускаем следующую команду:
pg_controldata /usr/local/pgsql/data/
/usr/local/pgsql/data/ – это каталог в котором находятся данные БД. В ответ команда выдаёт примерно такой ответ:
Номер версии pg_control: 843
Номер версии каталога: 200904091
Идентификатор системы баз данных: 6015769137366654649
Состояние кластера БД: в работе
Последнее обновление pg_control: среда, 19 ноября 2014 г. 15:32:51
Положение последней конт. точки: E2/69AF720
Положение предыдущей конт. точки: E2/5B19CF0
Положение REDO последней конт. точки: E2/654ED78
Линия времени последней конт. точки: 1
NextXID последней конт. точки: 0/279041395
NextOID последней конт. точки: 41181
NextMultiXactId послед. конт. точки: 1
NextMultiOffset послед. конт. точки: 0
Время последней контрольной точки: среда, 19 ноября 2014 г. 15:32:12
Мин. положение конца восстановления: 0/0
Макс. предел выравнивания данных: 8
Размер блока БД: 8192
Блоков в макс. сегменте отношений: 131072
Размер блока WAL: 8192
Байт в сегменте WAL: 16777216
Максимальная длина идентификаторов: 64
Максимальное число колонок в индексе: 32
Максимальный размер порции TOAST: 1996
Формат хранения даты/времени: 64-битные целые
Передача аргумента Float4: по значению
Передача аргумента Float8: по значению
В этом выводе интересны две строки:
NextXID последней конт. точки: 0/279041395
NextOID последней конт. точки: 41181
Эти значения мы будем использовать в параметрах команды для очистки логов транзакций. А теперь собственно попробуем выполнить эту команду (ВАЖНО: от суперпользователя PostgreSQL):
pg_resetxlog -o 41181 -x 279041395 -f /usr/local/pgsql/data/
После успешного выполнения команды запускаем PostgreSQL.
На этом можно закончить, но все же лучше еще полечить БД. Ведь не факт что при следующей перезагрузке БД успешно запустится. Мне помогла переиндексация таблиц при помощи команды REINDEX
. На одной из таблиц переиндексация не выполнилась, указав причину. После устранения причины все стало на свои места.