#postgresql #psql #dump #corruption
#postgresql #psql #дамп #повреждение
Вопрос:
Я попытался создать дамп своей базы данных. Во время сброса я получил приведенную ниже ошибку. Я знал, что таблица в моей базе данных повреждена, и я могу использовать опцию exclude, чтобы исключить поврежденную таблицу и получить дамп оставшихся таблиц. Но я ищу возможность дампа даже поврежденной таблицы, исключая недопустимые блоки страницы.
Команда, которую я использовал для создания дампа, является :
pg_dump -U postgres -p 5432 -d DBNAME -v -n SCHEMA_NAME -f "OUTFILE.sql"
Выводится ошибка:
pg_dump: Dumping the contents of table "TABLE_NAME" failed: PQgetResult() failed.
pg_dump: Error message from server: ERROR: invalid page in block 2145280 of relation base/16384/25464
Я смог получить доступ к поврежденной таблице и ее данным. Поэтому я считаю, что часть данных, к которым я могу получить доступ, может быть удалена. Пожалуйста, поделитесь, есть ли какая-либо возможность достичь этого.
Ответ №1:
Вы могли бы установить zero_damaged_pages = on
, тогда PostgreSQL должен обнулять (и игнорировать) такие страницы.
Комментарии:
1. Спасибо за ответ. У меня было два сценария, в которых я сталкивался с коррупцией. Первый, который я попробовал pg_resetxlog.exe потому что я не смог запустить posgres. Но после этого я столкнулся с проблемами при сбросе базы данных, поэтому я сделал именно то, что вы предлагаете zero_damaged_pages = on но даже после этого я не смог получить дамп, поэтому мне приходится вручную добавлять поврежденные таблицы в параметр —exclude-table.
2.
zero_damaged_pages
будет жаловаться, только если заголовок блока поврежден. Но сообщение об ошибке выглядит так.pg_resetxlog
повредит вашему кластеру, да. Если вы не можете запустить PostgreSQL, найдите причину в журнале.3. Вы используете,
pg_resetxlog
только если вы уже знаете , что кластер поврежден. По какой причине PostgreSQL не мог запуститься в первую очередь?4. Конечно, вы должны продолжать применять исправления ошибок (хотя я не вижу никаких признаков того, что это ошибка базы данных). Журнал выглядит как чистое завершение работы. Интересные записи журнала будут там, где база данных пытается запуститься, но терпит неудачу. Я имею в виду, прежде чем вы прервали его, запустив
pg_resetxlog
.5. Да,
pg_resetxlog
может повредить ваш кластер. Вот почему вы запускаете его только в том случае, если ваша база данных не может быть вызвана каким-либо другим способом.