Подтвердить что ты не робот

`pg_tblspc` отсутствует после установки последней версии OS X (Yosemite или El Capitan)

Я использую 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, теперь вы закрыты, прочитав эту тему.

4b9b3361

Ответ 1

Решено... частично.

По-видимому, установка последних версий 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 в этих каталогах создаст некоторый шум в вашем файле журнала, но не оказывает негативного влияния на что-либо еще.

Ответ 2

Донаван ответ на вопрос, я просто хотел добавить, что, поскольку я делал разные вещи с базой данных (например, rake db:test), он искал разные каталоги которые не были упомянуты выше и задушили бы, когда их не было, в моем случае pg_logical/mappings, поэтому вы можете настроить работу терминала:

tail -f /usr/local/var/postgres/server.log

и наблюдайте за отсутствующими папками, пока вы проходите через свои типичные действия с базой данных.

Ответ 3

Это немного не по теме, но стоит отметить здесь как часть процесса восстановления 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.

Ответ 4

Отсутствующие каталоги должны присутствовать в вашем каталоге данных 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}

Ответ 5

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

ПРИМЕЧАНИЕ. Этот подход удалит существующие базы данных

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres