Как исправить Postgres, чтобы он запускался после внезапного выключения?

Из-за внезапного отключения электроэнергии сервер Postgres, работающий на моей локальной машине, внезапно отключился. После перезагрузки я попытался перезапустить Postgres и получил эту ошибку:

$ pg_ctl -D /usr/local/pgsql/data restart

pg_ctl: PID file "/usr/local/pgsql/data/postmaster.pid" does not exist
Is server running?
starting server anyway
server starting
$:/usr/local/pgsql/data$ LOG:  database system shutdown was interrupted at 2009-02-28 21:06:16 
LOG:  checkpoint record is at 2/8FD6F8D0
LOG:  redo record is at 2/8FD6F8D0; undo record is at 0/0; shutdown FALSE
LOG:  next transaction ID: 0/1888104; next OID: 1711752
LOG:  next MultiXactId: 2; next MultiXactOffset: 3
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  redo starts at 2/8FD6F918
LOG:  record with zero length at 2/8FFD94A8
LOG:  redo done at 2/8FFD9480
LOG:  could not fsync segment 0 of relation 1663/1707047/1707304: No such file or directory
FATAL:  storage sync failed on magnetic disk: No such file or directory
LOG:  startup process (PID 5465) exited with exit code 1
LOG:  aborting startup due to startup process failure

В каталоге данных нет файла postmaster.pid. В чем может быть причина такого поведения и, конечно же, каков выход?


person Community    schedule 28.02.2009    source источник
comment
Какую версию postgres вы используете и какой тип файловой системы для /usr/local/pgsql/data?   -  person vladr    schedule 28.02.2009
comment
Просто чтобы вы знали, скорее всего, вам придется восстанавливать из резервной копии. Но прежде чем сделать это, сообщите нам свою версию Postgres (в v8.1.5 и v8.1.6 IIRC была ошибка, вызывающая эту ошибку во время восстановления) и тип файловой системы (вы можете изменить это перед следующим сбоем).   -  person vladr    schedule 28.02.2009
comment
подсказка: перезапуская, вы сообщаете PostgreSQL, что он запущен и его необходимо перезапустить. Он не запущен, поэтому нет файла идентификатора процесса (.pid).   -  person Kurt    schedule 01.03.2009


Ответы (7)


Вам потребуется pg_resetxlog. Однако после этого ваша база данных может оказаться в несогласованном состоянии, поэтому выгрузите ее с помощью pg_dumpall, создайте заново и импортируйте обратно.

Причиной этому может быть:

  • Вы не отключили аппаратный кеш записи на диск, что часто мешает ОС убедиться, что данные записаны до того, как она сообщит об успешной записи в приложение. Проверить с

    hdparm -I /dev/sda

    Если он показывает «*» перед «Запись кеша», это может быть так. Источник PostgreSQL содержит программу src/tools/fsync/test_fsync.c, который проверяет скорость синхронизации данных с диском. Запустите его - если он сообщает все время короче, чем, скажем, 3 секунды, чем ваш диск лжет ОС - на дисках со скоростью 7500 об / мин тест 1000 записей в одно и то же место потребует не менее 8 секунд для завершения (1000 / (7500 об / мин / 60-х)) так как он может писать только один раз за маршрут. Вам нужно будет отредактировать этот test_fsync.c, если ваша база данных находится на другом диске, чем раздел /var/tmp - измените

    #define FSYNC_FILENAME "/var/tmp/test_fsync.out"

    to

    #define FSYNC_FILENAME "/usr/local/pgsql/data/test_fsync.out"

  • Ваш диск неисправен и имеет плохой блок, проверьте с помощью бадблоков.

  • У вас плохая оперативная память, проверьте с помощью memtest86+ не менее 8 часов.

person Tometzky    schedule 02.03.2009
comment
Благодаря тонну. Я переместил БД, но решил попробовать ваш вариант. Это сработало, и БД восстановлена. pg_resetxlog сделал свое дело. - person ; 02.03.2009
comment
Эта проблема также может возникнуть при обновлении ОС Windows — не только постмастер становится недоступным, но и разрешения на папку данных и службу могут исчезнуть. pg_resetxlog решает первую проблему. - person MytyMyky; 02.01.2013
comment
Это также может просто произойти с невероятно перегруженной подсистемой хранения в Linux. - person Florian Heigl; 19.01.2015
comment
Было это после (очень подлого) теста на перегрузку дисковой подсистемы на linux. - person Florian Heigl; 19.01.2015

Чтение нескольких похожих сообщений в архивах списка рассылки PostgreSQL («Сбой синхронизации хранилища на магнитном диске: Нет такого файла или каталога»), по-видимому, указывает на очень серьезную аппаратную проблему, гораздо более серьезную, чем простой сбой питания. Возможно, вам придется подготовиться к восстановлению из резервных копий.

person bortzmeyer    schedule 28.02.2009
comment
Ant P, Vlad Romascanu и bortzmeyer - Спасибо за все ваши комментарии. Я понял, что жесткий диск был поврежден из-за скачка напряжения. Мне нужно перенести postgres на другую машину. - person ; 01.03.2009
comment
@bortzmeyer: fsck сказал мне, что на жестком диске есть ошибки. поэтому я был введен в заблуждение, полагая, что базу данных нельзя восстановить, но команда pg_resetxlog сделала свое дело. Большое спасибо. - person ; 02.03.2009

Были также повреждения базы данных, мои действия

docker run -it --rm -v /path/to/db:/var/lib/postgresql/data postgres:10.3 bash
su - postgres
/usr/lib/postgresql/10/bin/pg_resetwal -D /var/lib/postgresql/data -f
person srghma    schedule 30.04.2018

У меня была такая же проблема, и я собирался сделать дамп, переустановить и импортировать из дампа базы данных (действительно болезненный процесс), однако я просто попробовал это как последний ресурс, и это сработало!

brew services start postgresql

Потом перезапустил и все.

person Alexander Quiceno    schedule 06.07.2020

Запустите start вместо перезагрузки. Выполните следующую команду:

$pg_ctl -D /usr/local/pgsql/data start
person Community    schedule 07.08.2009
comment
Я получаю ошибку pg_ctl: каталог /usr/local/pgsql/data не существует при запуске этого - person Gideon Kitili; 13.03.2019

У меня была эта проблема пару раз, когда мой ноутбук неожиданно выключался из-за очень низкого заряда батареи во время работы PSQL в фоновом режиме.

Мое решение после поиска по всему миру было Hard delete and Reinstall, а затем импортировать данные из дампа базы данных.

Шаги для Mac с brew для удаления и переустановки psql 9.6

brew uninstall [email protected]
rm -rf rm -rf /usr/local/var/[email protected]
rm -rf .psql.local .psql_history .psqlrc.local l.psqlrc .pgpass

brew install [email protected]

echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

brew services start [email protected]

createuser -s postgres
createuser {ENTER_YOUR_USER_HERE} --interactive

person czarss    schedule 26.06.2020

Как говорили другие, у меня сработала остановка + запуск вместо перезапуска. В среде Docker это будет:

docker stop <container_name>
docker start <container_name>

или при использовании Docker Compose:

docker-compose stop
docker-compose start
person Sicco    schedule 04.08.2020