Falta `pg_tblspc` después de la instalación de la última versión de OS X (Yosemite o El Capitan)

464

Yo uso postgres de homebrew en mi OS X, pero cuando reinicio mi sistema, a veces los postgres no se inicia después del reinicio, y lo que he intentado manualmente para comenzar con postgres -D /usr/local/var/postgres, pero entonces se produjo el error con el siguiente mensaje: FATAL: could not open directory "pg_tblspc": No such file or directory.

La última vez que ocurrió, no pude llevarlo al estado original, así que decidí desinstalar todo el sistema de postgres y luego lo reinstalé y creé usuarios, tablas, conjuntos de datos, etc. Fue muy desagradable, pero ocurre con frecuencia en mi sistema, digamos una vez en unos pocos meses.

Entonces, ¿por qué pierde el pg_tblspcarchivo con frecuencia? ¿Y hay algo que pueda hacer para evitar la pérdida del archivo?

No he actualizado mi homebrew y postgres a la última versión (es decir, he estado usando la misma versión). Además, todo lo que hice en la base de datos de Postgres es eliminar la tabla y llenar los nuevos datos todos los días. No he cambiado el usuario, contraseña, etc.

EDITAR (mbannert): sentí la necesidad de agregar esto, ya que el hilo es el éxito principal en Google para este problema y para muchos el síntoma es diferente. Los cerveceros caseros probablemente encontrarán este mensaje de error:

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

Entonces, si acabas de experimentar esto después de la actualización de Yosemite, ahora estás cubierto por ahora leyendo este hilo.

Blaszard
fuente
¡Eep, realmente no debería! Cuando diga "última versión", muestre el número de versión exacto. Además, ¿ha puesto espacios de tabla en el almacenamiento externo? ¿Dónde está ubicado el directorio de datos PostgreSQL?
Craig Ringer
Además, pg_tblspces un directorio . La única forma en que puedo ver este directorio y solo este directorio que se desvanece al azar es la corrupción del sistema de archivos o un escáner de virus o herramienta de sincronización de archivos particularmente mal comportados.
Craig Ringer
No tengo ningún antivirus. No sé qué tablespaceses, así que no creo que lo puse en almacenamiento externo.
Blaszard
Hm. Todo lo que puedo decirte es que algo anda mal . pg_tblspcno solo desaparece en ningún sistema que haya encontrado, ni puedo imaginar una razón sensata para que lo haga. Va a ser muy difícil decir qué hace que su sistema sea diferente sin muchos más detalles.
Craig Ringer
2
¿Pudiste encontrar una solución para este @Gardecolo? Tengo el mismo problema después de actualizar a Yosemite.
Donovan

Respuestas:

928

Resuelto ... en parte.

Aparentemente, la instalación de las últimas versiones de OS X (por ejemplo, Yosemite o El Capitan) elimina algunos directorios /usr/local/var/postgres.

Para solucionar esto, simplemente vuelva a crear los directorios que faltan:

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

O, de manera más concisa ( gracias a Nate ):

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

La nueva ejecución pg_ctl start -D /usr/local/var/postgresahora inicia el servidor normalmente y, al menos para mí, sin pérdida de datos.

ACTUALIZAR

En mi sistema, algunos de esos directorios están vacíos incluso cuando Postgres se está ejecutando. ¿Quizás, como parte de alguna operación de "limpieza", Yosemite elimina cualquier directorio vacío? En cualquier caso, seguí adelante y creé un archivo '.keep' en cada directorio para evitar su eliminación futura.

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

Nota : Crear el .keeparchivo en esos directorios creará algo de ruido en su archivo de registro, pero no parece afectar negativamente a nada más.

Donovan
fuente
53
Solo una sugerencia para un comando más conciso: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/ytouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate
26
Esos archivos .keep en realidad me causan cierto dolor en los registros del servidor:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost
13
También me faltaban los directorios pg_snapshots y pg_stat.
Jon Stevens
8
También tuve que crear un directorio adicional 'pg_replslot'. Excepto que funciona bien. ¡Gracias!
Lucas
66
experimentado igual que @Lucas para postgres embotellados 9.4.0. Tenía que hacerlo mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell,
9

La respuesta de Donavan es acertada, solo quería agregar que, como hice cosas diferentes con la base de datos (p rake db:test. Ej. ), Buscó diferentes directorios que no se han mencionado anteriormente y se ahogarían cuando no estuvieran presentes, en mi caso pg_logical/mappings, por lo que es posible que desee configurar un terminal en ejecución:

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

y observe las carpetas que faltan mientras revisa las actividades típicas de la base de datos.

tony_k
fuente
3
Necesario para agregar mkdir -p / usr / local / var / postgres / pg_logical / {instantáneas, asignaciones}
peter_v
6

Esto está un poco fuera de tema, pero vale la pena señalarlo aquí como parte del proceso de recuperación de PostgreSQL Yosemite. Tuve el mismo problema que el anterior Y tuve un problema con PostgreSQL "aparentemente" ejecutándose en segundo plano, por lo que incluso después de agregar directorios no pude reiniciar. Intenté usar pg_ctl stop -m fastpara matar el servidor PostgreSQL pero no tuve suerte. También intenté seguir el proceso directamente, kill PIDpero tan pronto como lo hice, un proceso PostgreSQL reapareció con un PID diferente.

La clave terminó siendo un .plistarchivo que Homebrew había cargado ... La solución para mí terminó siendo:

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

Después de eso pude iniciar PostgreSQL normalmente.

MCP
fuente
Mi plist se denominó de manera ligeramente diferente: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistpero básicamente ese también era el mismo problema para mí y la misma solución.
onekiloparsec
4

Los directorios que faltan deben estar presentes en su directorio de datos PostgreSQL. El directorio de datos predeterminado es /usr/local/var/postgres/. Si ha configurado un directorio de datos diferente, debe volver a crear los directorios que faltan allí. Si modificó el .plistarchivo recomendado por homebrew que inicia PostgreSQL, puede encontrar el directorio de datos allí:

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

(es la -Dopción con la que comenzaste postgres :)

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

En el ejemplo anterior, crearía los directorios que faltan /usr/local/pgsql/data, así:

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
fuente
-20

Crear los directorios que faltan ciertamente funciona, pero lo arreglé reinicializando postgres db, este es un enfoque más limpio para evitar futuros problemas.

NOTA: este enfoque eliminará las bases de datos existentes

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres
Greg
fuente
19
Obviamente, eliminar bases de datos existentes no es una excepción menor aquí. Esto es un poco como decir "No pude encontrar / var / tmp, así que reinstalé el sistema operativo".
Adam Donahue
44
Oh, hombre, esto es "más limpio" que cualquier cosa que se me ocurra :) Solo espero que algún copy-paster aleatorio del interwebz no dispare esto directamente a su consola sin mirarlo :)
Halil Özgür
2
Perdón por el voto negativo Greg, pero recomiendo volver a redactar su solución para hacer explícito que este enfoque solo debe usarse en el desarrollo o si el usuario puede permitirse borrar su base de datos.
hraynaud
1
¿Por qué es tanto rechazado? En un servidor de desarrollo, esta es la forma correcta.
Jordon Bedwell
@JordonBedwell incluso en un servidor de desarrollo es una mala idea, a menos que esté jugando con una sola aplicación usando db en su computadora. Es como "No puedo iniciar mi editor de código favorito, reinstalemos el sistema operativo"
Andre Figueiredo