최신 버전의 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.