Ремонт поврежденной базы данных postgresql

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

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

ОШИБКА: отсутствует номер фрагмента 0 для значения тоста 118486855 в pg_toast_2619

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

Сообщение об ошибке от сервера: ОШИБКА: отношение "public.st_stock_item_newlist" не существует
pg_dump: Команда была: LOCK TABLE public.st_stock_item_newlist В РЕЖИМЕ ДОСТУПА К ДОСТУПУ

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

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

4 ответа

Решение

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Скопируйте это сейчас!

Если несколько/конкретные файлы повреждены, могут помочь следующие приемы.

  • Восстановите старый дамп на другом узле или во второй установке.
  • Скопируйте требуемые файлы из ВОССТАНОВЛЕННОЙ/второй установки в НЕУДАЧНЫЙ узел.
  • Остановить и запустить PSQL.

Из сегодняшнего опыта!

      Error message from server: ERROR:  could not read block 226448 in file "base/12345/12345.1": Input/output error
  • попробуй (вероятно не получится)cp base/12345/12345.1 /root/backup/12345.1-orig

  • пытатьсяmv base/12345/12345.1 /root/backup/12345.1-orig#ожидая, что это закончится. В противном случаеrm -rf base/12345/12345.1 /root/backup/12345.1-orig

Окончательно,

Магия дегтя. (если ниже tar завершится, вам повезло!)

  • tar -zcvf my_backup.tar.gz /var/lib/postgresql/xx/main/xx
  • Извлеките поврежденный файл из TAR.
  • Замените его в исходном местеbase/12345/12345.1.
  • Остановить и запустить PGSQL

ВАЖНО: Пожалуйста, попробуйте поискать в Google и попробуйтеvaccum, reindexи проверки диска, какfsckи т. д., прежде чем перейти к этому этапу.

Кроме того, всегда делайте резервную копию файловой системы, прежде чем использовать какой-либо метод проб и ошибок :)

Другие вопросы по тегам