`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.

Blaszard
fonte
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.

Donovan
fonte
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.

tony_k
fonte
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.

MCP
fonte
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}
tee
fonte
-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
Greg
fonte
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