pg_dump и ERROR: пропущенный номер блока 0 для значения тоста

10

Я использую PostgreSQL 8.4.15. При запуске pg_dumpдля резервного копирования базы данных я получил следующую ошибку:

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)

При поиске этого сообщения об ошибке я нашел несколько ссылок ( здесь и здесь ), в которых предлагалось переиндексировать таблицу. (В этих обсуждениях была ссылка на запрос pg_classтаблицы для поиска правильного pg_toast_XXXXXXзначения, но казалось, что это потому, что оно не отображалось в их сообщениях об ошибках. Я пропустил эту часть, потому что в сообщении об ошибке отображалось значение Я думаю, это может быть удобно из-за более поздней версии PostgreSQL.)

Я запустил следующее:

REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;

Теперь я могу использовать pg_dumpбез ошибок.

Что pg_toastи что на самом деле делали эти команды? Это просто простая очистка или они могли избавиться от некоторых строк в этой таблице? Что могло вызвать проблемы в первую очередь?

В этой таблице около 300000 строк, но я ожидаю, что с момента предыдущего успешного резервного копирования будет только около 250 новых строк (эта таблица используется только для INSERT / SELECT, без UPDATE).

Bruno
источник
Я нашел эту идею . Можете ли вы проверить, совпадает ли ваш случай?
Дезсо 26.12.12
Это может также помочь stackoverflow.com/questions/47533639/…
papanito

Ответы:

6

Учитывая, что вы сделали переиндексацию, вероятно, он использовал сканирование индекса, чтобы попытаться найти значения в таблице и не смог найти их. Это звучит как поврежденный индекс. Вакуумный анализ меняет таблицу, а переиндексация - нет, и изменения очень незначительны.

Можно подумать, что атрибуты TOASTed фактически разбиты на куски размером около 4 Кб, и они хранятся в строках. Они ищутся и сортируются / переподключаются с основной строкой во время запроса. Похоже, использованный здесь индекс был поврежден, и поэтому переиндексация решила проблему.

Я обнаружил, что поврежденные индексы обычно являются признаком того, что с сервером что-то не так. Это хорошо, чтобы проверить и убедиться, что память, процессор и жесткие диски все в порядке и не сообщают о проблемах. Я обнаружил, что перегреваемые серверы особенно подвержены повреждению индексов, и если индексы могут быть повреждены, нужно также беспокоиться о повреждении данных.

Крис Траверс
источник