Pregunta

He estado tratando de hacer que nuestros clientes de base de datos sean activos sobre no completar la partición en la que reside la base de datos que están utilizando.

Como todos nuestros clientes están en el mismo host que el administrador de la base de datos, debería ser lo suficientemente fácil para los espacios de tabla creados por el usuario; El cliente puede buscar la ruta del sistema de archivos para el espacio de tabla (en SpClocation) y usar llamadas del sistema operativo para verificar cuánto espacio disponible está disponible:

adb=> select * from pg_tablespace;

  spcname   | spcowner |    spclocation    |       spcacl        
------------+----------+-------------------+---------------------
 pg_default |       10 |                   | 
 pg_global  |       10 |                   | 
 adb        |  2033793 | /database/adb     | {adb=C/adb}

No puedo ver cómo, desde el cliente, para obtener el camino hacia donde se almacena el espacio de tabla global; Se devuelve una cadena vacía en la consulta anterior.

Desafortunadamente, tenemos muchos sistemas heredados en el campo utilizando una base de datos particular creada en el espacio de tabla global, y sería un esfuerzo monumental que se mude a un espacio de tabla creado por el usuario.

Ojalá me esté perdiendo algo realmente simple.

¿Fue útil?

Solución

pg_default y pg_global Las ubicaciones son "codificadas".

pg_default vive en:

select setting||'/base' from pg_settings where name='data_directory';

y pg_global vive en:

select setting||'/global' from pg_settings where name='data_directory';

src/backend/commands/tablespace.c Dice eso:

 * There are two tablespaces created at initdb time: pg_global (for shared
 * tables) and pg_default (for everything else).  For backwards compatibility
 * and to remain functional on platforms without symlinks, these tablespaces
 * are accessed specially: they are respectively
 *          $PGDATA/global/relfilenode
 *          $PGDATA/base/dboid/relfilenode

Tenga en cuenta también que exponer la ubicación del directorio de datos es un agujero de seguridad, no tan terrible pero aún así,.

app01@postgres=> show data_directory;
ERROR:  must be superuser to examine "data_directory"

Otros consejos

PostgreSQL crea pg_default y pg_global Cuando crea un clúster, tal vez usando initdb directamente. los initdb La utilidad puede tomar un argumento que establece el directorio de datos, pero no hay discusiones sobre dónde colocar el pg_default y pg_global tablespaces.

Concluiría que siempre se crean en el directorio de datos. Podría estar fácilmente equivocado al respecto. No creo que puedan ser conmovidos. Yo también podría estar equivocado por eso.

Pero si estoy hasta este punto, puede obtener su ubicación física por

show data_directory;

los pg_global tablespace Es casi seguro que es el subdirectorio "global"; pg_default Probablemente también lo sea.

Si tuviera tiempo, leí el código fuente. Eso eliminaría toda duda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top