¿Ubicación física de objetos en una base de datos PostgreSQL?

Estoy interesado en obtener las ubicaciones físicas de tablas, vistas, funciones, datos/contenido disponible en las tablas de PostgreSQL en el sistema operativo Linux. Tengo un escenario en el que PostgreSQL podría instalarse en las instalaciones de la tarjeta SD y el disco duro. Si tengo tablas, vistas, funciones, datos en SD, quiero obtener las ubicaciones físicas de los mismos y fusionar/copiar en mi disco duro cada vez que desee reemplazar el espacio de almacenamiento. Espero que el almacenamiento de la base de datos sea en términos de arquitectura de archivos simples.

Además, ¿es posible ver el contenido de los archivos? Quiero decir, ¿puedo acceder a ellos?

preguntado el 03 de mayo de 12 a las 13:05

@Bruno: No es exactamente la misma pregunta y claramente no son las mismas respuestas. -

@Catcall tienes razón. -

3 Respuestas

Kevin y Mike ya proporcionaron indicaciones sobre dónde encontrar el directorio de datos. Para la ubicación física de un tabla (me disculpo, pero solo está disponible en Inglés) en el sistema de archivos, utilice:

SELECT pg_relation_filepath('my_table');

No juegue con los archivos directamente a menos que sepa exactamente lo que está haciendo.

A base de datos como un todo está representado por un subdirectorio en PGDATA/base:

Si utiliza espacios de mesa se vuelve más complicado. Lea los detalles en el capítulo. Diseño de archivo de base de datos en el manual:

Para cada uno base de datos en el clúster hay un subdirectorio dentro de PGDATA/base, llamado así por el OID de la base de datos en pg_database. Este subdirectorio es la ubicación predeterminada para los archivos de la base de datos; en particular, sus catálogos de sistema se almacenan allí.

...

Cada tabla e indice se almacena en un archivo separado. Para las relaciones ordinarias, estos archivos reciben el nombre de la tabla o el índice. nodo de archivo número, que se puede encontrar en pg_class.relfilenode.

...

La pg_relation_filepath() La función muestra la ruta completa (relativa a PGDATA) de cualquier relación.

El énfasis audaz es mío.
El manual sobre la función. pg_relation_filepath().

contestado el 09 de mayo de 19 a las 07:05

+1, porque no sabía sobre esa función. Pero pg_relation_filepath() no funciona para bases de datos. Para las bases de datos, creo que aún necesitaría mirar el espacio de tabla. - Mike Sherrill 'Cat Recall'

@Catcall: agregué un poco a mi respuesta para cubrir las bases de datos y señalar el manual para la situación más compleja que involucra espacios de tablas. - Erwin Brandstetter

Lo siento, Erwin. Ya te he votado una vez. Si quieres más puntos, tendrás que enseñarme algo más que no sepa. - Mike Sherrill 'Cat Recall'

@Catcall: Es al revés, en realidad: aprovecharé su sugerencia para mejorar mi respuesta. Dirigido al público en general y al OP. No esperaba encontrar más lagunas en su amplio conocimiento de PostgreSQL por hoy. ;) - Erwin Brandstetter

La consulta show data_directory; le mostrará el directorio de datos principal. Pero eso no necesariamente te dice dónde se almacenan las cosas.

PostgreSQL le permite definir nuevos espacios de mesa. Un tablespace es un directorio con nombre en el sistema de archivos. PostgreSQL le permite almacenar tablas individuales, índices y bases de datos completas en cualquier espacio de tablas permitido. Entonces, si se creara una base de datos en un espacio de tabla específico, creo que ninguno de sus objetos aparecería en el directorio de datos.

Para obtener información sólida en tiempo de ejecución sobre dónde se almacenan las cosas en el disco, probablemente deba consultar base_de_datos_pg, pg_tablespace o el tablas_pg de los catálogos del sistema. La información del espacio de tabla también puede estar disponible en las vistas de esquema_información.

Pero para fusionar o copiar en su disco duro, el uso de estos archivos es casi seguro que es algo malo. Para ese tipo de trabajo, pg_dump es tu amigo.

contestado el 04 de mayo de 12 a las 00:05

Si está hablando de copiar los archivos del disco como una forma de copia de seguridad, probablemente debería leer esto, especialmente la sección sobre archivado continuo y recuperación de un momento dado (PITR):

http://www.postgresql.org/docs/current/interactive/backup.html

Si está pensando en intentar acceder e interpretar directamente los datos en los archivos del disco, sin pasar por el sistema de administración de la base de datos, es una muy mala idea por muchas razones. Por un lado, el esquema de almacenamiento es muy complejo. Por otro lado, tiende a cambiar en cada nuevo lanzamiento importante (publicado una vez al año). En tercer lugar, el fantasma de EF Codd probablemente te perseguirá; véanse las reglas 8, 9, 11 y 12 de Las 12 reglas de Codd.

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.