Как исправить 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