Il DBA (DataBase Administrator) utilizza statement SQL particolari per
estrarre le informazioni piu' interessanti sui DB che amministra.
Questa pagina raccoglie e descrive gli script SQL piu' utili ed interessanti per
la gestione di un database PostgreSQL.
PostgreSQL e' il piu' completo RDBMS Open Source ed il suo SQL e' molto potente. PostgreSQL ha infatti caratteristiche Object Oriented molto complete, piu' complete di altri RDBMS sia Open Source che commerciali.
Gli esempi riportati riguardano: Sessioni, Lock, Utilizzo di spazio, Performance, Replication, ...
Il documento e' volutamente breve e pratico con esempi funzionanti
di statement SQL.
Informazioni di dettaglio si possono trovare nella
relativa documentazione.
PostgreSQL fornisce un SQL ricco di funzionalita' grazie anche al suo disegno Object Relational.
All'interno di ogni database viene mantenuto un ricco Catalog che consente di controllare
con query SQL gli oggetti presenti nella base dati
(eg. pg_database, pg_class, pg_tables, ...)
e l'andamento delle attivita' (eg. pg_locks, pg_settings, pg_statistic, pg_stats,...).
Il data dictionary e' molto ampio, anzi ne esistono praticamente due:
quello Postgres storico e quello standard SQL:
spesso le stesse informazioni
si possono ricavare in piu' modi.
Gli statement SQL a disposizione di un DBA PostgreSQL sono quindi moltissimi... in questa pagina faremo una scelta su quelli piu' utili ed interessanti.
Una prima visione sull'utilizzo di una base dati e' quella
delle connessioni presenti.
PostgreSQL fornisce informazioni
sulle connessioni al database anche dal sistema operativo.
Un semplice ps -efa | grep postgres consente di riconoscere
i processi di sistema,
le connessioni presenti e le eventuali sessioni attive.
Maggiori informazioni si possono estrarre con una query SQL sulla base dati:
Le colonne a disposizione nella pg_stat_activity sono parecchie e possono essere tutte utilizzate a seconda dei casi. L'ordinamento per state e' comodo perche' cosi' le sessioni active sono le prime visualizzate!
Nel tempo il contenuto della vista pg_stat_activity e' cambiato piu' volte. Se si utilizza una versione di PostgreSQL <10 puo' essere utile il link alla precedente versione di questa pagina.
Gli oggetti sulla base dati vengono protetti dall'utilizzo concorrente in PostgreSQL mediante la gestione dei lock. In qualche caso possono verificarsi blocchi dovuti a sessioni che non rilasciano i lock e non permettono la modifica dei dati ad altre sessioni. Ecco come individuare i lock attivi (i lock not granted sono in attesa):
Nota: prima di ammazzare qualcuno... e' importante essere certi di quello che si sta facendo!
La query seguente utilizza qualche join per ottenere le query bloccate e da chi:
Questa query consente di capire con certezza chi e' il colpevole e chi e' la vittima del lock.
Decidere poi se terminare o cancellare il colpevole o la vittima e' un'altra questione...
La gestione dello spazio disco in Postgres si basa sul file system ospite. Ad ogni oggetto (eg. una tabella) corrisponde un file sul file system. Sono utilizzabili diverse organizzazioni dei dati come struttura interna per soddisfare i piu' specifici requisiti di memorizzazione. Tutti gli indici sono trattati come indici secondari: hanno quindi una struttura dedicata ciascuno (un file). I tipi di indice disponibili sono molteplici: B-tree, BRIN, Hash, GiST (Generalized Search Tree), GIN (Generalized Inverted Index), ... Nella pratica i file assegnati alle tabelle ed agli indici sono sempre piu' di uno ma sono dettagli di implementazione. Lo spazio viene liberato con le operazioni di VACUUM. Lo spazio puo' essere organizzato in tablespace, ma generalmente si utilizza il solo tablespace di default a meno di non utilizzare file system differenti.
Un server PostgreSQL ospita piu' database. Quindi un primo punto di vista e' controllare l'occupazione di ogni singolo database:
Analizzando invece gli oggetti contenuti nella base dati e' possibile ottenere i dati di dettaglio. Ecco i 20 oggetti di maggior dimensione:
Poiche' le tabelle TOAST vengono create automaticamente per ospitare il contenuto delle colonne di maggiori dimensioni che non trovano posto nel blocco dati, puo' essere utile riconoscere qual'e' la tabella di cui fanno parte:
In Postgres la gestione della concorrenza e del versionamento dei dati utilizza l'MVCC (Multi-Version Concurrency Control)
ed ha alcune caratteristiche specifiche.
Le DELETE e le UPDATE non cancellano mai le tuple ma le segnano come dead.
Quando il numero di dead tuples e' elevato oppure quando sono presenti ampi bloat (spazi vuoti nei blocchi)
e' opportuno svolgere un VACUUM manuale
(o un VACUUM FULL che libera piu' spazio ma utilizza un lock).
Il vacuum viene eseguito in automatico dal processo chiamato autovacuum.
I parametri di default dell'autovacuum pero' non sono molto aggressivi...
se una basi dati molto utilizzata tende a crescere di dimensione
e' consigliabile effettuare un tuning specifico.
La query seguente effettua un semplice controllo sulle tabelle:
L'ottimizzazione delle performance e' il leitmotiv di ogni DBA.
I punti di vista sono moltissimi:
individuare gli statement SQL piu' pesanti,
ottimizzare i piani di esecuzione degli statement,
determinare eventuali bottleneck,
effettuare il tuning sui parametri di configurazione,
...
Ecco qualche query di esempio:
La prima query permette di capire il carico presente su ogni database dell'istanza riportando statistiche globali.
La seconda query utilizza l'estensione pg_stat_statements e consente di valutare l'Hit Ratio della cache da parte degli statement SQL. La vista pg_stat_statements e' una delle piu' utili per monitorare le prestazioni di PostgreSQL e' quindi fortemente consigliato installare la relativa EXTENSION.
La terza query determina le tabelle maggiormente accedute e ne valuta l'Hit Ratio sulla Cache. Viene indicato in modo distinto l'Hit Ratio della tabella e degli indici, per questi ultimi l'Hit Ratio dovrebbe essere sempre superiore al 99%.
Postgres ha un numero elevato di parametri di configurazione che possono essere modificati per effettuare il tuning della prestazioni. L'ultima query riporta i parametri presenti e la loro descrizione.
La replica dei dati con Postgres e' molto efficiente ed affidabile:
per questo e' sfruttata in moltissimi database di produzione.
Per controllare lo stato delle repliche e' possibile utilizzare la seguente query sul Primary:
Viene restituita una riga per ogni processo walsender con le informazioni sullo stato del Secondary connesso.
Un'introduzione a PostgreSQL si trova in PostgreSQL RDBMS. Maggiori dettagli tecnici sulle diverse versioni di PostgreSQL e le date di rilascio di ogni versione sono riportate in questo documento.
Il sito PostgreSQL contiene tutta la documentazione ufficiale.
Volete leggere altre pagine come questa?
Provate qui!
Titolo: SQL4DBA - SQL per DBA PostgreSQL
Livello: Esperto
Data:
15 Agosto 2013
Versione: 1.0.4 - 31 Ottobre 2023
Autore: mail [AT] meo.bogliolo.name