відсутній `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.

Востаннє це сталося, я не зміг довести його до початкового стану, тому вирішив видалити всю систему постгрес, а потім перевстановив її та створив користувачів, таблиці, набори даних тощо ... Це було так огидно, але це часто трапляється в моїй системі, скажімо, раз на кілька місяців.

То чому він pg_tblspcчасто втрачає файл? І чи можу я щось зробити, щоб уникнути втрати файлу?

Я не оновив свій домашній і постгрес до останньої версії (тобто я використовував ту саму версію). Крім того, все, що я робив у базі даних 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, то тепер ви охоплені для читання цієї теми.


Еп, це справді, справді не повинно! Коли ви говорите "остання версія", будь ласка, покажіть точний номер версії. Ви також розмістили будь-які простори таблиць на зовнішньому сховищі? де знаходиться каталог даних PostgreSQL?
Крейг Рінгер

Також pg_tblspcє каталог . Єдиний спосіб я бачу цей каталог і лише цей каталог, випадково зникаючи, - це пошкодження файлової системи або особливо погано поводиться сканер вірусів або інструмент синхронізації файлів.
Крейг Рінгер

У мене немає сканера на віруси. Я не знаю, що tablespacesтаке, тому не думаю, що я ставлю його на зовнішнє сховище.
Blaszard

Гм. Все, що я можу вам сказати, - це щось погано не так. pg_tblspcне просто зникає в будь-якій системі, з якою я коли-небудь стикався, і я не можу уявити собі розумну причину. Складно сказати, що робить вашу систему різною без особливих деталей, буде дуже важко.
Крейг Рінгер

2
Ви змогли знайти рішення для цього @Gardecolo? У мене те саме питання після переходу на Йосеміті.
Донован

Відповіді:


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файлу в цих каталогах створюватиме шум у вашому лог-файлі, але, схоже, не впливатиме ні на що інше.


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
funtimelost

13
Я також бракував каталогів pg_snapshots та pg_stat.
Джон Стівенс

8
Я також повинен був створити один додатковий каталог 'pg_replslot'. За винятком того, що це працює чудово. Дякую!
Лукас

6
досвідчений так само, як @Lucas для бутильованих постгресів 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

і спостерігати за відсутніми папками, поки ви проходите через свої типові дії в базі даних.


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.


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

4

В каталозі даних PostgreSQL повинні бути присутні відсутні каталоги. Каталог даних за замовчуванням - /usr/local/var/postgres/. Якщо ви створили інший каталог даних, вам потрібно заново створити там відсутні каталоги. Якщо ви змінили .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}

-20

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

ПРИМІТКА. Цей підхід видалить існуючі бази даних

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

19
Очевидно, що видалення існуючих баз даних тут не є другорядним винятком. Це трохи схоже на те, що сказати "Не вдалося знайти / var / tmp, тому я перевстановив операційну систему".
Адам Донахю

4
О, чоловіче, це "чистіше", ніж усе, про що я можу придумати :) Просто сподіваюсь, що якийсь випадковий папірець із інтерв'ю не застрелить це прямо у свою консоль, не дивлячись на це :)
Халіль Озгюр

2
Вибачте за голос, який проголосував проти, Грег, але я рекомендую переробити своє рішення, щоб чітко вказати, що цей підхід слід використовувати лише в розробці або якщо користувач може дозволити стерти свою БД.
hraynaud

1
Чому це так заборонено? На сервері розробок це правильний шлях.
Джордон Бедвелл

@JordonBedwell навіть на сервері розробників - це погана ідея, якщо ви не граєте з одним додатком, використовуючи db на своєму комп’ютері. Це як "я не можу запустити свій улюблений редактор коду, давайте перевстановити ОС"
Andre Figueiredo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.