Ремонт поврежденной базы данных 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 и т. Д. Таким образом, у вас есть известная отправная точка.
Так что - если вы все еще хотите восстановить некоторые данные.
- Попробуйте сбросить отдельные таблицы. Получить то, что вы можете таким образом.
- Удалите индексы, если они вызывают проблемы
- Дамп разделов таблиц (id=0..9999, 1000..19999 и т. Д.) - таким образом вы можете определить, где некоторые строки могут быть повреждены, и сбросить еще меньшие разделы, чтобы восстановить то, что по-прежнему хорошо.
- Попробуйте сбросить только определенные столбцы - большие текстовые значения хранятся вне строки (в таблицах тостов), поэтому избегая их, вы можете получить оставшиеся данные.
- Если у вас есть испорченные системные таблицы, значит, у вас много работы.
Это большая работа, и тогда вам нужно будет пройти и проверить то, что вы восстановили, и попытаться выяснить, что отсутствует / неверно.
Есть еще кое-что, что вы можете сделать (создание пустых блоков в некоторых случаях может позволить вам сбросить частичные данные), но все они более сложны и сложны, и если эти данные не являются особенно ценными, не стоит усилий.
Ключевое сообщение, чтобы отнять это - убедитесь, что вы делаете регулярные резервные копии, и убедитесь, что они работают.
Прежде чем делать что-либо еще, возьмите полную копию поврежденной базы данных на уровне файловой системы.
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
и т. д., прежде чем перейти к этому этапу.
Кроме того, всегда делайте резервную копию файловой системы, прежде чем использовать какой-либо метод проб и ошибок :)