Дамп Postgres, исключающий поврежденный блок страницы

#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 может повредить ваш кластер. Вот почему вы запускаете его только в том случае, если ваша база данных не может быть вызвана каким-либо другим способом.