Как исправить 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. Что может быть причиной такого поведения и, конечно, каков выход?

Ответы

Ответ 1

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

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

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

    hdparm -I /dev/sda

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

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

    к

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

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

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

Ответ 2

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

Ответ 3

Сначала я попробую запустить fsck на этом диске, если вы еще этого не сделали.

Ответ 4

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

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