Восстановление поврежденной базы данных 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
Неспособность сделать это уничтожает доказательства о том, что вызвало коррупцию, и означает, что если ваши усилия по восстановлению ухудшаются и ухудшаются, вы не можете их отменить.
Скопируйте его прямо сейчас!