PostgreSQL: Query per la posizione della tablespace globale?
-
16-10-2019 - |
Domanda
Ho cercato di rendere i nostri clienti di database proattivo di non riempire la partizione in cui il database che stanno utilizzando risiede.
Come tutti i nostri clienti sono sullo stesso host del gestore di database, dovrebbe essere abbastanza facile per gli spazi tabelle creati dagli utenti; il cliente può cercare il percorso del file system per il tablespace (in spclocation), e chiede l'uso del sistema operativo per controllare quanto spazio disponibile è disponibile:
adb=> select * from pg_tablespace;
spcname | spcowner | spclocation | spcacl
------------+----------+-------------------+---------------------
pg_default | 10 | |
pg_global | 10 | |
adb | 2033793 | /database/adb | {adb=C/adb}
Non riesco a vedere come, da parte del cliente, per ottenere il percorso in cui è memorizzato il tablespace globale; una stringa vuota viene restituita perché nella query precedente.
Purtroppo, abbiamo molti sistemi legacy sul campo utilizzando un particolare database creato nel tablespace globale, e sarebbe uno sforzo monumentale per ottenerlo spostato in uno spazio tabelle creato dall'utente.
Speriamo che mi manca solo qualcosa di veramente semplice.
Soluzione
pg_default
e pg_global
posizioni sono "hardcoded".
pg_default
vive a:
select setting||'/base' from pg_settings where name='data_directory';
e vive pg_global
in:
select setting||'/global' from pg_settings where name='data_directory';
src/backend/commands/tablespace.c
dice così:
* 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
Si prega inoltre di nota, che l'esposizione della posizione della directory dati è una - non è così terribile, ma ancora -. Buco di sicurezza
app01@postgres=> show data_directory;
ERROR: must be superuser to examine "data_directory"
Altri suggerimenti
PostgreSQL crea pg_default
e pg_global
quando si crea un cluster, magari utilizzando direttamente initdb
. L'utilità initdb
può prendere un argomento che imposta la directory dei dati, ma senza argomenti su dove mettere il pg_default
e pg_global tablespaces
.
Mi piacerebbe concludere che stanno sempre creato nella directory dei dati. Potrei facilmente essere sbagliato a tale proposito. Non credo che possano essere spostati. Potrei sbagliarmi su questo, anche.
Ma se ho ragione fino a questo punto, è possibile derivare la loro posizione fisica
show data_directory;
Il pg_global tablespace
è quasi certamente è la sottodirectory "globale"; pg_default
probabilmente è, troppo.
Se avessi tempo, mi piacerebbe leggere il codice sorgente . Che sarebbe togliere ogni dubbio.