`pg_tblspc` ausente após a instalação da versão mais recente do OS X (Yosemite ou El Capitan)


464

Eu uso postgres de homebrew no meu OS X, mas quando eu reiniciar o meu sistema, por vezes, os postgres não começar após o reinício, e então eu tentei manualmente para começar com postgres -D /usr/local/var/postgres, mas, em seguida, o erro ocorreu com a seguinte mensagem: FATAL: could not open directory "pg_tblspc": No such file or directory.

A última vez que ocorreu, eu não consegui obtê-lo no estado original, então decidi desinstalar todo o sistema do postgres, reinstalá-lo e criar usuários, tabelas, conjuntos de dados, etc ... Era tão nojento, mas ocorre frequentemente no meu sistema, digamos uma vez em alguns meses.

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

Não atualizei meu homebrew e postgres para a versão mais recente (ou seja, estou usando a mesma versão). Além disso, tudo o que fiz no banco de dados do postgres é excluir a tabela e preencher os novos dados todos os dias. Não mudei usuário, senha, etc ...

EDIT (mbannert): senti a necessidade de adicionar isso, pois o segmento é o principal hit do google para esse problema e para muitos o sintoma é diferente. Os homebrewers provavelmente encontrarão esta mensagem de erro:

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

Portanto, se você acabou de experimentar isso após a atualização do Yosemite, agora está coberto por ler este tópico.


Eep, realmente, realmente não deveria! Quando você diz "versão mais recente", mostre o número exato da versão. Além disso, você colocou espaços de tabela no armazenamento externo? onde está localizado o diretório de dados do PostgreSQL?
Craig Ringer

Além disso, pg_tblspcé um diretório . A única maneira de ver esse diretório e desaparecer aleatoriamente é a corrupção do sistema de arquivos ou um scanner de vírus ou uma ferramenta de sincronização de arquivos particularmente mal comportada.
Craig Ringer

Não tenho antivírus. Não sei o que tablespacesé, então acho que não coloco no armazenamento externo.
Blaszard 22/09

Hum. Tudo o que posso dizer é que algo está muito errado. pg_tblspcnão desaparece apenas em qualquer sistema que eu já encontrei, nem posso imaginar uma razão sã. Vai ser muito difícil dizer o que torna seu sistema diferente sem muito mais detalhes.
Craig Ringer

2
Você conseguiu encontrar uma solução para este @Gardecolo? Estou tendo o mesmo problema depois de atualizar para o Yosemite.
Donovan

Respostas:


928

Resolvido ... em parte.

Aparentemente, a instalação das versões mais recentes do OS X (por exemplo, Yosemite ou El Capitan) remove alguns diretórios do /usr/local/var/postgres.

Para corrigir isso, basta recriar 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, de forma mais concisa ( graças a Nate ):

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

A nova execução pg_ctl start -D /usr/local/var/postgresagora 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 remova qualquer diretório vazio? De qualquer forma, fui adiante e criei um arquivo '.keep' em cada diretório para impedir a exclusão futura.

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

Nota : A criação do .keeparquivo nesses diretórios criará algum ruído no seu arquivo de log, mas não parece afetar negativamente qualquer outra coisa.


53
Apenas uma sugestão para um comando mais conciso: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/etouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate

26
Esses arquivos .mantenha realmente causar-me alguma tristeza nos logs do servidor:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
Também estava faltando os diretórios pg_snapshots e pg_stat.
Jon Stevens

8
Eu também tive que criar um diretório extra 'pg_replslot'. Só que funciona bem. Obrigado!
Lucas

6
experimentou o mesmo que o @Lucas para o postgres engarrafado 9.4.0. Eu tive que mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell

9

A resposta de Donavan é imediata, eu só queria acrescentar que, como fiz coisas diferentes com o banco de dados (por exemplo rake db:test), ele procurou por diretórios diferentes que não foram mencionados acima e engasgaria quando não estivesse presente, em No meu caso pg_logical/mappings, você pode configurar um terminal em execução:

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

e observe se há pastas ausentes enquanto você realiza suas atividades típicas de banco de dados.


3
Necessário adicionar mkdir -p / usr / local / var / postgres / pg_logical / {snapshots, mappings}
peter_v 9/15

6

Isso é um pouco estranho, mas vale a pena notar aqui como parte do processo de recuperação do PostgreSQL Yosemite. Eu tive o mesmo problema acima e tive um problema com o PostgreSQL "aparentemente" sendo executado em segundo plano, portanto, mesmo após adicionar diretórios, não consegui reiniciar. Eu tentei usar pg_ctl stop -m fastpara matar o servidor PostgreSQL, mas sem sorte. Também tentei ir diretamente após o processo, kill PIDmas assim que o processo PostgreSQL reapareceu com um PID diferente.

A chave acabou sendo um .plistarquivo 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.


Minha lista foi nomeada de maneira um pouco diferente: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistmas basicamente esse também era o mesmo problema para mim e a mesma solução.
Onekiloparsec

4

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

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

(é a -Dopção com a qual você iniciou o postgres :)

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/postgres</string>
    <string>-D</string>
    <string>/usr/local/pgsql/data</string>

No exemplo acima, você criaria os diretórios ausentes /usr/local/pgsql/data, da seguinte maneira:

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

Criar os diretórios ausentes certamente funciona, mas eu o corrigi reinicializando o postgres db; essa é 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

19
Obviamente, excluir bancos de dados existentes não é uma exceção menor aqui. É um pouco como dizer "Não consegui encontrar / var / tmp, então reinstalei o sistema operacional".
Adam Donahue

4
Oh, cara, isso é mais "limpo" do que qualquer coisa que eu posso pensar :) Só espero que algum aleatório copy-paster do interwebz não filmar este diretamente em seu console sem olhar para ele :)
Halil Özgür

2
Desculpe pelo voto negativo, Greg, mas recomendo reformular sua solução para deixar explícito que essa abordagem deve ser usada apenas no desenvolvimento ou se o usuário puder limpar seu banco de dados.
Hraynaud 7/11

1
Por que isso é tão prejudicado? Em um servidor de desenvolvimento, este é o caminho certo.
Jordon Bedwell

@JordonBedwell, mesmo em um servidor de desenvolvimento, é uma má idéia, a menos que você esteja jogando com um único aplicativo usando db no seu computador. É como "Não consigo iniciar meu editor de código favorito, vamos reinstalar o sistema operacional"
Andre Figueiredo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.