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

429

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

  • 0
    Eep, это действительно, действительно не должно! Когда вы говорите «последняя версия», укажите точный номер версии. Кроме того, вы разместили какие-либо табличные пространства на внешнем хранилище? где находится каталог данных PostgreSQL?
  • 0
    Кроме того, pg_tblspc является каталогом . Единственный способ увидеть этот каталог, и только этот каталог случайно исчезает, это повреждение файловой системы или особенно плохо ведущий себя сканер вирусов или инструмент синхронизации файлов.
Показать ещё 14 комментариев
Теги:
homebrew
osx-yosemite
osx

5 ответов

915
Лучший ответ

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

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

  • 1
    Вы все еще теряете другие файлы / каталоги в /usr/local/var/postgres , такие как pg_clog , pg_stat , pg_subtrans , base и т.д ...?
  • 1
    Я не, нет. Я скучал только по этим трем
Показать ещё 25 комментариев
8

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

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

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

  • 3
    Необходимо добавить mkdir -p / usr / local / var / postgres / pg_logical / {снимки, сопоставления}
6

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

  • 0
    Мой список был назван немного по-другому: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plist но в основном это была та же проблема для меня и то же решение.
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}
-22

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

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

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres
  • 19
    Очевидно, что удаление существующих баз данных не является здесь небольшим исключением. Это немного похоже на высказывание «Я не смог найти / var / tmp, поэтому переустановил операционную систему».
  • 4
    О, чувак, это "чище", чем все, что я могу придумать :) Просто надеюсь, что какой-нибудь случайный копировщик из интернета не выстрелит это прямо в свою консоль, не глядя на это :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню