PostgreSQL: ¿Consulta para la ubicación del espacio de tabla global?
-
16-10-2019 - |
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.
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.