Importante:
Qui trovate la versione piu' recente di questa pagina.
Questa pagina e' stata mantenuta perche' fa riferimento statement utili con versioni
precedenti di PostgreSQL anche se non piu' supportate.
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:
a volte le stesse informazioni sul contenuto della base dati
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 le connessioni presenti. Maggiori informazioni si possono estrarre con una query SQL sulla base dati:
Nella versione 9.2 e' cambiata un poco la logica del contenuto di alcune colonne. Anziche' la query corrente (che risultava essere IDLE nella maggior parte dei casi) e' riportata nella tabella PG_STAT_ACTIVITY l'ultima query eseguita, mentre la colonna STATE riporta se lo statement e' ancora in esecuzione oppure IDLE. Ecco la selezione aggiornata alla versione 9.2:
Dalla versione 9.6 sono state aggiunte maggiori informazioni sullo stato di attesa. Poiche' la colonna waiting e' stata rimossa anche questo cambiamento non e' compatibile con la query precedente. Ecco la selezione aggiornata all'ultima versione di PostgreSQL:
Nella versione 10 e' stata aggiunta la colonna backend_type.
Le colonne a disposizione nell 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!
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. Decidere poi se punire 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: B-tree, Hash, GiST (Generalized Search Tree), GIN (Generalized Inverted Index), ... In realta' i file sono sempre piu' di uno ma sono dettagli di implementazione. Lo spazio viene liberato con le operazioni di VACUUM (automatiche nelle versioni piu' recenti). Lo spazio puo' essere organizzato in tablespace, ma generalmente si utilizza il solo tablespace di default.
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 puo' essere utile riconoscere qual'e' la tabella di cui fanno parte:
La gestione della concorrenza e del versionamento dei dati utilizza l'MVCC (Multi-Version Concurrency Control)
in Postgres 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).
Nelle versioni piu' recenti il vacuum viene eseguito in automatico: 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.
Attenzione che le colonne della pg_stat_statements vengono cambiate spesso...
nelle versioni precedenti alla 13
al posto di total_exec_time va utilizzato total_time.
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.3 - 31 Ottobre 2020
Autore: mail [AT] meo.bogliolo.name