`pg_tblspc` faltando após a instalação da última versão do OS X (Yosemite ou El Capitan)

Eu uso postgres do homebrew no meu OS X, mas quando eu reinicio meu sistema, às vezes o postgres não inicia após a reboot, e então eu manualmente tentei iniciá-lo com postgres -D /usr/local/var/postgres , mas o erro ocorreu com a seguinte mensagem: FATAL: could not open directory "pg_tblspc": No such file or directory .

A última vez que isso ocorreu, eu não consegui colocá-lo no estado original, então decidi desinstalar todo o sistema postgres e então o re-instalei e criei usuários, tabelas, conjuntos de dados, etc … Era tão nojento, mas Ocorre com frequência no meu sistema, digamos uma vez em alguns meses.

Então, por que ele perde o arquivo pg_tblspc com freqüência? E há algo que eu possa fazer para evitar a perda do arquivo?

Eu não atualizei meu homebrew e postgres para a versão mais recente (ou seja, eu tenho usado a mesma versão). Além disso, todas as coisas que fiz no database postgres são excluir a tabela e preencher os novos dados todos os dias. Eu não mudei o usuário, senha, etc …

EDIT (mbannert): Eu senti a necessidade de adicionar isso, uma vez que o segmento é o maior sucesso no google para esta questão e para muitos o sintoma é diferente. Os Homebrewers provavelmente encontrarão essa mensagem de erro:

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

Então, se você acabou de experimentar isso depois da atualização do Yosemite, agora você está coberto por agora ler este tópico.

Resolvido … em parte.

Aparentemente, instalar as versões mais recentes do OS X (por exemplo, Yosemite ou El Capitan) remove alguns diretórios em /usr/local/var/postgres .

Para corrigir isso, você simplesmente recria os diretórios ausentes:

 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 

Ou, mais concisamente ( graças a Nate ):

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

Executar novamente o pg_ctl start -D /usr/local/var/postgres agora inicia o servidor normalmente e, pelo menos para mim, sem perda de dados.

ATUALIZAR

No meu sistema, alguns desses diretórios estão vazios, mesmo quando o Postgres está em execução. Talvez, como parte de alguma operação de “limpeza”, o Yosemite remove algum diretório vazio? De qualquer forma, eu fui em frente e criei um arquivo ‘.keep’ em cada diretório para evitar exclusão futura.

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

Nota : Criar o arquivo .keep nesses diretórios criará algum ruído em seu arquivo de log, mas não parece afetar negativamente qualquer outra coisa.

A resposta de Donavan é no local, eu só queria acrescentar que, como eu fazia coisas diferentes com o database (por exemplo, rake db:test ), ele procurava diretórios diferentes que não foram mencionados acima e sufocavam quando não eram mencionados. t present, no meu caso pg_logical/mappings , então você pode querer configurar um terminal rodando:

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

e observe as pastas ausentes enquanto você passa pelas atividades típicas do database.

Isso é um pouco fora do tópico, mas vale a pena notar aqui como parte do processo de recuperação do PostgreSQL Yosemite. Eu tive o mesmo problema que o anterior E eu tive um problema com o PostgreSQL “aparentemente” rodando em segundo plano, então mesmo depois de adicionar diretórios eu não pude reiniciar. Eu tentei usar pg_ctl stop -m fast para matar o servidor PostgreSQL, mas sem sorte. Eu também tentei ir após o processo diretamente com kill PID mas assim que fiz isso, um processo PostgreSQL reapareceu com um PID diferente.

A chave acabou sendo um arquivo .plist que o Homebrew carregou … A correção para mim acabou sendo:

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

Depois disso, consegui iniciar o PostgreSQL normalmente.

Os diretórios que faltam precisam estar presentes no diretório de dados do PostgreSQL. O diretório de dados padrão é /usr/local/var/postgres/ . Se você tiver configurado um diretório de dados diferente, será necessário recriar os diretórios ausentes. Se você modificou o arquivo .plist recomendado pelo homebrew que inicia o PostgreSQL, você pode encontrar o diretório de dados lá:

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

(é a opção -D você iniciou no postgres 🙂

  ProgramArguments  /usr/local/bin/postgres -D /usr/local/pgsql/data 

No exemplo acima, você criaria os diretórios ausentes em /usr/local/pgsql/data , assim:

 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} 

Criando os diretórios ausentes certamente funciona, mas eu corrigi-lo reinicializando postgres db, esta é uma abordagem mais limpa para evitar problemas futuros.

NOTA: Essa abordagem excluirá os bancos de dados existentes

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