Я использую postgres из homebrew в своей ОС X, но когда я перезагружаю свою систему, иногда postgres не запускается после перезагрузки, поэтому я вручную попытался запустить его с помощью postgres -D /usr/local/var/postgres
, но затем произошла ошибка с следующее сообщение: FATAL: could not open directory "pg_tblspc": No such file or directory
.
В последний раз, когда это произошло, я не смог получить его в исходное состояние, поэтому решил удалить всю систему postgres, а затем снова установить ее и создать пользователей, таблицы, наборы данных и т.д. Это было так отвратительно, но это часто происходит в моей системе, скажем, раз в несколько месяцев.
Так почему он часто теряет pg_tblspc
файл? И есть ли что-нибудь, что я могу сделать, чтобы избежать потери файла?
Я не обновлял свой homebrew и postgres до последней версии (т.е. я использовал ту же версию). Кроме того, все, что я делал в базе данных postgres, удаляет таблицу и заполняет новые данные каждый день. Я не изменил пользователя, пароль и т.д.
EDIT (mbannert): Я почувствовал необходимость добавить это, так как поток является самым популярным в google для этой проблемы, и для многих симптом отличается. Вероятно, домашние пивовары столкнутся с этим сообщением об ошибке:
No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Итак, если вы только что испытали это после обновления Yosemite, теперь вы закрыты, прочитав эту тему.
Решено... частично.
По-видимому, установка последних версий OS X (например, Yosemite или El Capitan) удаляет некоторые каталоги в /usr/local/var/postgres
.
Чтобы исправить это, вы просто воссоздаете недостающие каталоги:
mkdir /usr/local/var/postgres/pg_tblspc
mkdir /usr/local/var/postgres/pg_twophase
mkdir /usr/local/var/postgres/pg_stat
mkdir /usr/local/var/postgres/pg_stat_tmp
mkdir /usr/local/var/postgres/pg_replslot
mkdir /usr/local/var/postgres/pg_snapshots
Или, более кратко (благодаря Nate):
mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/
Rerunning pg_ctl start -D /usr/local/var/postgres
теперь запускает сервер обычно и, по крайней мере, для меня, без потери данных.
UPDATE
В моей системе некоторые из этих каталогов пусты, даже когда Postgres запущен. Возможно, в рамках какой-то операции "очистки" Yosemite удаляет все пустые каталоги? В любом случае я пошел вперед и создал файл ".keep" в каждом каталоге, чтобы предотвратить удаление в будущем.
touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep
Примечание. Создание файла .keep
в этих каталогах создаст некоторый шум в вашем файле журнала, но не оказывает негативного влияния на что-либо еще.
/usr/local/var/postgres
, такие как pg_clog
, pg_stat
, pg_subtrans
, base
и т.д ...?
Донаван ответ на вопрос, я просто хотел добавить, что, поскольку я делал разные вещи с базой данных (например, rake db:test
), он искал разные каталоги которые не были упомянуты выше и задушили бы, когда их не было, в моем случае pg_logical/mappings
, поэтому вы можете настроить работу терминала:
tail -f /usr/local/var/postgres/server.log
и наблюдайте за отсутствующими папками, пока вы проходите через свои типичные действия с базой данных.
Это немного не по теме, но стоит отметить здесь как часть процесса восстановления PostgreSQL Yosemite. У меня была такая же проблема, как и выше. У меня была проблема с PostgreSQL, "похоже" работающей в фоновом режиме, поэтому даже после добавления каталогов я не мог перезапустить. Я попытался использовать pg_ctl stop -m fast
, чтобы убить сервер PostgreSQL, но не повезло. Я также попытался перейти к процессу непосредственно с помощью kill PID
, но как только я это сделал, процесс PostgreSQL снова появился с другим PID.
Ключ оказался файлом .plist
, который загрузил Homebrew... Исправление для меня закончилось тем, что:
launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist
После этого я смог нормально запустить PostgreSQL.
launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
но в основном это была та же проблема для меня и то же решение.
Отсутствующие каталоги должны присутствовать в вашем каталоге данных PostgreSQL. Каталог данных по умолчанию - /usr/local/var/postgres/
. Если вы настроили другой каталог данных, вам нужно заново создать отсутствующие каталоги. Если вы изменили рекомендованный homebrew файл .plist
, который запускает PostgreSQL, вы можете найти там каталог данных:
cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
(это параметр -D
, который вы начали postgres с помощью:)
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/postgres</string>
<string>-D</string>
<string>/usr/local/pgsql/data</string>
В приведенном выше примере вы создадите недостающие каталоги в /usr/local/pgsql/data
, например:
cd /usr/local/pgsql/data
mkdir {pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots,pg_logical}
mkdir pg_logical/{snapshots,mappings}
Создание недостающих каталогов, безусловно, работает, но я исправил его, повторно инициализируя postgres db, это более чистый подход, чтобы избежать будущих проблем.
ПРИМЕЧАНИЕ. Этот подход удалит существующие базы данных
$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres
pg_tblspc
является каталогом . Единственный способ увидеть этот каталог, и только этот каталог случайно исчезает, это повреждение файловой системы или особенно плохо ведущий себя сканер вирусов или инструмент синхронизации файлов.