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

464

Я использую Postgres из доморощенных в моем OS 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, - это удаление таблицы и заполнение новых данных каждый день. Я не менял пользователя, пароль и т.д ...

РЕДАКТИРОВАТЬ (mbannert): я чувствовал необходимость добавить это, так как эта тема является главным хитом в Google для этой проблемы, и для многих симптом другой. Домашние пивовары, вероятно, столкнутся с этим сообщением об ошибке:

No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

Итак, если вы только что испытали это после апгрейда Yosemite, то теперь вы можете прочитать эту ветку.

Blaszard
источник
Eep, это действительно, действительно не должно! Когда вы говорите «последняя версия», укажите точный номер версии. Кроме того, вы разместили какие-либо табличные пространства на внешнем хранилище? где находится каталог данных PostgreSQL?
Крейг Рингер,
Также pg_tblspcесть каталог . Единственный способ, которым я вижу этот каталог и только этот каталог, случайно исчезающий, - это повреждение файловой системы или особенно плохо ведущий себя сканер вирусов или инструмент синхронизации файлов.
Крейг Рингер,
У меня нет вирусов. Я не знаю что tablespaces, поэтому я не думаю, что я положил его на внешнее хранилище.
Blaszard
Гектометр Все , что я могу вам сказать, что что - то плохо неправильно. pg_tblspcне исчезает ни в одной из систем, с которыми я когда-либо сталкивался, и я не могу представить себе здравой причины. Будет очень трудно сказать, что отличает вашу систему без дополнительных подробностей.
Крейг Рингер,
2
Вы смогли найти решение для этого @Gardecolo? У меня та же проблема после обновления до Yosemite.
Донован

Ответы:

928

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

Очевидно, установка последних версий 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

Или более кратко ( спасибо Нейту ):

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теперь запускает сервер нормально и, по крайней мере для меня, без потери данных.

ОБНОВИТЬ

В моей системе некоторые из этих каталогов пусты даже во время работы Postgres. Может быть, в рамках некоторой операции «очистки» Yosemite удаляет все пустые каталоги? В любом случае я решил создать файл «.keep» в каждом каталоге, чтобы предотвратить его удаление в будущем.

touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep

Примечание . Создание .keepфайла в этих каталогах создаст некоторый шум в вашем лог-файле, но, похоже, не окажет негативного влияния на что-либо еще.

Donovan
источник
53
Просто предложение для более краткой команды: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/иtouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Нейт
26
Эти файлы .keep на самом деле вызывают у меня некоторое горе в журналах сервера:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funusinglost
13
Мне также не хватало каталогов pg_snapshots и pg_stat.
Джон Стивенс
8
Мне также пришлось создать один дополнительный каталог 'pg_replslot'. За исключением того, что он работает нормально. Спасибо!
Лукас
6
испытал то же, что и @Lucas для бутылок postgres 9.4.0. Я должен был mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Патрик Фаррелл
9

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

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

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

tony_k
источник
3
Необходимо добавить mkdir -p / usr / local / var / postgres / pg_logical / {снимки, сопоставления}
peter_v
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.

MCP
источник
Мой список был назван немного по-другому: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistно в принципе это была та же проблема для меня, и то же решение.
onekiloparsec
4

Отсутствующие каталоги должны присутствовать в вашем каталоге данных PostgreSQL. Каталог данных по умолчанию /usr/local/var/postgres/. Если вы установили другой каталог данных, вам нужно заново создать отсутствующие каталоги там. Если вы изменили .plistфайл, рекомендуемый для homebrew, который запускает 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}
тройник
источник
-20

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

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

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres
Greg
источник
19
Очевидно, что удаление существующих баз данных не является здесь небольшим исключением. Это немного похоже на высказывание «Я не смог найти / var / tmp, поэтому переустановил операционную систему».
Адам Донахью
4
О, чувак, это "чище", чем все, что я могу придумать :) Просто надеюсь, что какой-нибудь случайный копировщик из интернета не выстрелит это прямо в свою консоль, не глядя на это :)
Halil Özgür
2
Извините за отрицательный голос, Грег, но я рекомендую переформулировать ваше решение, чтобы было ясно, что этот подход следует использовать только при разработке или если пользователь может позволить себе стереть свою БД.
Hraynaud
1
Почему это так сильно отрицается? На сервере dev это правильный путь.
Джордон Бедвелл
@JordonBedwell даже на dev-сервере - плохая идея, если только вы не играете с одним приложением, использующим db на вашем компьютере ... Это как «Я не могу запустить мой любимый редактор кода, давайте переустановим ОС»
Andre Figueiredo