postgresql error PANIC: не удалось найти действительную запись контрольной точки - PullRequest
43 голосов
/ 10 января 2012

Когда я загружаю сервер postgres (v9.0.1), я получаю панику, которая мешает его запуску:

PANIC: не удалось найти действительную запись контрольной точки

Как я могу это исправить?

Ответы [ 5 ]

79 голосов
/ 11 января 2012

Он ищет запись контрольной точки в журнале транзакций, которая, вероятно, не существует или повреждена. Вы можете определить, так ли это, запустив:

# Postgres < 10.0
pg_resetxlog DATADIR

# Postgres >= 10.0
pg_resetwal DATADIR

Если журнал транзакций поврежден, вы увидите сообщение вроде:

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

Затем вы можете следовать инструкциям и запустить с -f для принудительного обновления:

# Postgres < 10.0
pg_resetxlog -f DATADIR 

# Postgres >= 10.0
pg_resetwal -f DATADIR

Это должно сбросить журнал транзакций, однако это может привести к тому, что ваша база данных останется в неопределенном состоянии, как объяснено в документации PostgreSQL о pg_resetxlog

Если pg_resetxlog жалуется на то, что он не может определить действительные данные для pg_control, вы можете принудительно продолжить его, указав переключатель -f (force). В этом случае вероятные значения будут заменены отсутствующими данными. Можно ожидать совпадения большинства полей, но может потребоваться ручная помощь для следующего OID, следующего идентификатора транзакции и периода, следующего идентификатора многотранзакции и смещения и полей начального адреса WAL. Эти поля могут быть установлены с помощью переключателей, обсуждаемых ниже. Если вы не можете определить правильные значения для всех этих полей, -f все еще можно использовать, но к восстановленной базе данных следует относиться с еще большим подозрением, чем обычно: немедленный сброс и перезагрузка являются обязательными. Не выполняйте никакие операции по изменению данных в базе данных, прежде чем создавать дамп, так как любое такое действие может усугубить повреждение.

15 голосов
/ 06 февраля 2013

Я использую 9.1.7 и успешно выполнил следующее:

/usr/lib/postgresql/9.1/bin/pg_resetxlog -f /var/lib/postgresql/9.1/main

Последним аргументом команды pg_resetxlog должно быть место на диске, где postgres хранит данные вашей базы данных.

8 голосов
/ 02 октября 2014

Как указано здесь pg_resetxlog не должен запускаться.Ответы, которые относятся к этому, - плохой совет.Предполагая, что ошибка произошла в контексте экземпляра копирования / репликации, ссылка предоставляет более краткий способ выполнения копирования / репликации с pg_basebackup

3 голосов
/ 11 января 2012

Вы делаете непрерывное архивирование?Если вы выполняете резервное копирование в то время, может оказаться более целесообразным удалить backup_label.pg_resetxlog серьезная вещь.

1 голос
/ 11 января 2012

так же, как в журнале говорится: не удалось найти допустимую запись контрольной точки. Postgres не может правильно найти WAL в каталоге $ PGDATA / pg_xlog /.Попробуйте использовать pg_resetxlog

...