최신 버전의 OS X (Yosemite 또는 El Capitan) 설치 후`pg_tblspc`가 누락 됨


464

OS X의 homebrew에서 postgres를 사용하지만 시스템을 재부팅 할 때 재부팅 후 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"?

요세미티 업그레이드 이후에이 문제가 발생했다면 이제이 글을 읽을 수 있습니다.


Eep, 정말로, 정말로해서는 안됩니다! "최신 버전"이라고 말하면 정확한 버전 번호를 표시하십시오. 또한 외부 스토리지에 테이블 스페이스를 배치 했습니까? PostgreSQL 데이터 디렉토리는 어디에 있습니까?
Craig Ringer

또한, pg_tblspcA는 디렉토리 . 이 디렉토리를 볼 수 있고이 디렉토리가 임의로 사라지는 유일한 방법은 파일 시스템 손상 또는 특히 잘못 작동하는 바이러스 스캐너 또는 파일 동기화 도구입니다.
Craig Ringer

바이러스 스캐너가 없습니다. 나는 무엇인지 tablespaces모르므로 외부 저장소에 넣지 않는다고 생각합니다.
Blaszard

흠. 내가 말할 수있는 건 뭔가가 있어요입니다 심하게 잘못. pg_tblspc내가 경험 한 어떤 시스템에서도 사라지지 않으며, 그럴만한 이유도 상상할 수 없습니다. 시스템을 더 자세하게 설명하지 않으면 서 무엇이 다른지 말하기는 매우 어려울 것입니다.
Craig Ringer

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

또는 더 간결하게 ( Nate 덕분에 ) :

mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/

재실행은 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
Nate

26
이러한 .keep 파일은 실제로 서버 로그에 약간의 슬픔을 유발합니다.could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
pg_snapshots 및 pg_stat 디렉토리도 누락되었습니다.
Jon Stevens

8
또한 하나의 추가 디렉토리 'pg_replslot'을 만들어야했습니다. 그것이 잘 작동한다는 것을 제외하고. 감사!
Lucas

6
병에 든 postgres 9.4.0의 @Lucas와 동일한 경험. 나는에 있었다 mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
패트릭 파렐

9

Donavan 의 대답은 제 자리에 있습니다. 나는 데이터베이스와 다른 일을했을 때 (예 rake db:test:) 위에서 언급하지 않았고 존재하지 않을 때 질식 할 다른 디렉토리를 찾았습니다. 내 경우 pg_logical/mappings, 그래서 당신은 실행중인 터미널을 설정하고 싶을 수도 있습니다 :

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

일반적인 데이터베이스 작업을 진행하는 동안 폴더가 없는지 확인하십시오.


3
mkdir -p / usr / local / var / postgres / pg_logical / {snapshots, mappings}를 추가해야 함
peter_v 2015 년

6

이것은 약간 주제가 아니지만 PostgreSQL Yosemite 복구 프로세스의 일부로 주목할 가치가 있습니다. 위와 같은 문제가 있었고 PostgreSQL이 "겉보기"백그라운드에서 실행 중이므로 디렉토리를 추가 한 후에도 다시 시작할 수 없었습니다. 나는 사용하여 시도 pg_ctl stop -m fastPostgreSQL 서버하지만 행운을 죽일. 또한 프로세스를 직접 수행하려고했지만 kill PIDPostgreSQL 프로세스가 다른 PID로 다시 나타납니다.

열쇠는 .plistHomebrew 가로 드 한 파일이되었습니다 ... 나에게 대한 수정은 다음과 같습니다.

launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist

그 후 PostgreSQL을 정상적으로 시작할 수있었습니다.


내 plist는 약간 다르게 이름이 붙여졌습니다. launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plist그러나 기본적으로 그것은 저에게도 같은 문제였으며 같은 해결책이었습니다.
onekiloparsec

4

누락 된 디렉토리는 PostgreSQL 데이터 디렉토리에 있어야합니다. 기본 데이터 디렉토리는 /usr/local/var/postgres/입니다. 다른 데이터 디렉토리를 설정 한 경우 누락 된 디렉토리를 다시 작성해야합니다. .plistPostgreSQL을 시작 하는 homebrew 권장 파일을 수정 한 경우 여기에서 데이터 디렉토리를 찾을 수 있습니다.

cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

(이것은 -Dpostgres를 시작한 옵션입니다.)

  <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를 찾을 수 없어서 운영 체제를 다시 설치했습니다"라고 말하는 것과 비슷합니다.
Adam Donahue

4
오, 사람, 이것은 내가 생각할 수있는 것보다 "깨끗하다":) 그냥 interwebz에서 임의의 복사-복사기가 콘솔을 보지 않고 이것을 직접 쏘지 않기를 바랍니다 :)
Halil Özgür

2
그렉 투표에 대해 유감스럽게 생각하지만이 방법을 개발 또는 사용자가 DB를 지울 수있는 경우에만 사용해야한다는 점을 명확히하기 위해 솔루션을 다시 작성하는 것이 좋습니다.
hraynaud

1
왜 이렇게 많이 다운 보팅됩니까? 개발자 서버에서는 이것이 올바른 방법입니다.
Jordon Bedwell

dev에 서버가 사용자 컴퓨터에 DB를 사용하여 하나의 응용 프로그램과 함께 연주하지 않는 .. 그것은 같은 나쁜 생각도에 "나는의이 OS를 다시 설치하게 내가 좋아하는 코드 편집기를 시작할 수 없습니다"@JordonBedwell
앙드레 Figueiredo의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.