Восстановление поврежденной базы данных postgresql

У меня есть несколько ошибок с моим postgresql db, который возник после перенапряжения:

Я не могу получить доступ ко многим таблицам из моей базы данных. Когда я пытаюсь, например, select * from ac_cash_collection, я получаю ошибку обмана:

ERROR: missing chunk number 0 for toast value 118486855 in pg_toast_2619

когда я пытаюсь pg_dump Я получаю следующую ошибку:

Error message from server: ERROR:  relation "public.st_stock_item_newlist" does not exist
pg_dump: The command was: LOCK TABLE public.st_stock_item_newlist IN ACCESS SHARE MODE

Я пошел вперед и попытался запустить reindex всей базы данных, я на самом деле я оставил это runnng, пошел спать, и я обнаружил, что утром ничего не сделал, поэтому мне пришлось отменить его.

Мне нужна помощь, чтобы исправить это как можно скорее, пожалуйста, помогите.

Ответ 1

Прежде чем делать что-либо еще, http://wiki.postgresql.org/wiki/Corruption и действуйте по инструкциям. Несоблюдение этого требования затрудняет проблему.


В Fine Manual есть два параметра конфигурации: ignore_system_indexes и zero_damaged_pages. Я никогда их не использовал, но если бы я был отчаян...

Я не знаю, помогают ли они против тостов. В любом случае, если их установка заставляет вашу базу данных снова стать пригодной для использования, я бы сделал {backup + drop + restore}, чтобы снова вернуть все таблицы и каталоги в новорожденную форму. Успех!

Ответ 2

Если у вас есть резервные копии, просто восстановите их.

Если нет - вы только что узнали, зачем нужны регулярные резервные копии. Там ничего не может сделать PostgreSQL, если аппаратное обеспечение неверно.

Кроме того, если вы когда-нибудь снова окажетесь в этой ситуации, сначала остановите PostgreSQL и возьмите полную резервную копию всего уровня - все табличные пространства, WAL и т.д. Таким образом, у вас есть известная отправная точка.

Итак - если вы все еще хотите восстановить некоторые данные.

  • Попробуйте сбросить отдельные таблицы. Получите то, что вы можете таким образом.
  • Отбрасывать индексы, если они вызывают проблемы.
  • Дамп разделов таблиц (id = 0..9999, 1000..19999 и т.д.) - таким образом вы можете определить, где некоторые строки могут быть повреждены, и сбросить все меньшие разделы, чтобы восстановить то, что все еще хорошо.
  • Попробуйте сбросить только определенные столбцы - большие текстовые значения хранятся вне очереди (в таблицах с тостами), поэтому их можно избежать извлечения остальных данных.
  • Если у вас есть поврежденные системные таблицы, вы получаете много работы.

Это много работы, и тогда вам нужно будет пройти и проверить, что вы восстановили, и попытаться выяснить, что отсутствует/неверно.

Есть много вещей, которые вы можете сделать (создание пустых блоков в некоторых случаях может позволить вам сбрасывать частичные данные), но они все сложнее и сложнее, и если данные не являются особенно ценными, не стоит усилий.

Ключевое сообщение, чтобы убрать это - убедитесь, что вы делаете регулярные резервные копии и убедитесь, что они работают.

Ответ 3

Прежде чем делать что-либо, сделайте полную копию поврежденной базы данных на уровне файловой системы.

http://wiki.postgresql.org/wiki/Corruption

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

Скопируйте его прямо сейчас!