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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top