PostgreSQL 17 🐟 Nuove funzionalita'

La versione PostgreSQL 17 introduce nuove funzionalita' all'RDBMS Open Source piu' avanzato ed oggi [NdA 2024-04-01] e' il giorno giusto per parlarne: ecco quindi pubblicato questo documento!

In generale la versione 17 e' un'evoluzione della versione precedente con nuove funzionalita' (eg. logon trigger) ma anche con migliori prestazioni ed un costante miglioramento degli aspetti di gestione delle basi dati.

In questo documento sono riportati in dettaglio i principali nuovi elementi introdotti nella versione 17 riportando esempi pratici di utilizzo:

Ma le novita' non sono solo queste... continuate a leggere!

Backup incrementale

Al comando pg_basebackup e' stata aggiunta l'opzione --incremental=PATH_TO_MANIFEST per supportare backup fisici incrementali. Il nuovo comando pg_combinebackup consente di ricostruire la data directory partendo da un full backup ed applicando tutti i backup incrementali.
Per utilizzare questa funzionalita' e' necessario impostare summarize_wal = on che e' un parametro che richiede il solo reload della configurazione.

Postgres consente da tempo il Point in time recovery (PITR) con l'applicazione dei WAL... pero' vi sono casi di database di modeste dimensioni ma con un forte uso di transazioni in cui l'applicazione dei WAL e' molto onerosa. Il pg_basebackup incrementale puo' essere molto utile in questi casi.

Login trigger

Agli event trigger e' stato aggiunto l'evento di login che consente di eseguire azioni al momento della connessione dell'utente.

In realta' il comando ALTER USER ... SET gia' copriva molte delle esigenze di configurazione delle utenze in Postgres ma con il trigger e' possibile una maggior dinamicita' nelle impostazioni.

CREATE TABLE user_login_log (
  "user" text,
  "session_start" timestamp with time zone
);

CREATE OR REPLACE FUNCTION init_session()
  RETURNS event_trigger SECURITY DEFINER
  LANGUAGE plpgsql AS
$$
DECLARE
  hour integer = EXTRACT('hour' FROM current_time at time zone 'utc');
  rec boolean;
BEGIN
IF hour BETWEEN 4 AND 5 THEN
  RAISE EXCEPTION 'Login forbidden';
END IF;
IF hour BETWEEN 1 AND 6 THEN
  RAISE WARNING E'Insomniac user connected: \n %', session_user;
END IF;

-- Avoid secondary...
SELECT pg_is_in_recovery() INTO rec;
IF rec THEN
  RETURN;
END IF;
INSERT INTO public.user_login_log VALUES (session_user, current_timestamp);

END;
$$;

CREATE EVENT TRIGGER init_session
  ON login
  EXECUTE FUNCTION init_session();
ALTER EVENT TRIGGER init_session ENABLE ALWAYS;

MAINTAIN privilege

A lungo attesi sono stati finalmente aggiunti il privilege MAINTAIN ed il ROLE pg_maintain.
Con il privilegio MANTAIN su una tabella e' possibile eseguire i comandi VACUUM, ANALYZE, REINDEX, REFRESH MATERIALIZE VIEW, CLUSTER, LOCK TABLE che in precedenza erano riservati al solo proprietario della tabella o ai superutenti.
L'assegnazione del ruolo pg_maintain estende questo diritto su ogni tabella.

Con questi privilegi e' piu' semplice demandare attivita' di manutezione di tabelle evitando cosi' di dover distribuire i privilegi di amministratore o di proprietario di oggetti.

Statistiche Checkpointer

Alcune statistiche sul comportamento del processo di checkpoint in realta' erano gia' presenti nella vista di sistema pg_stat_bgwriter ma ora e' stata definita una nuova vista dedicata:

select num_timed, num_requested, buffers_written, 
       write_time, sync_time, stats_reset
 from pg_stat_checkpointer;

Naturalmente e' stata modificata anche la vista pg_stat_bgwriter.

Funzioni JSON

PostgreSQL supporta da tempo il formato JSON. Il datatype JSON e' stato introdotto nella 9.2 (2012-09), l'efficiente datatype JSOB nella 9.4 ed ogni nuova versione ha aggiunto nuove funzionalita' per il trattamento dei JSON.

Nella versione PG17 vengono aggiunte nuove funzioni: JSON(), JSON_SCALAR(), JSON_SERIALIZE() le nuove funzioni di query: JSON_EXISTS(), JSON_QUERY(), JSON_VALUE() e la funzione JSON_TABLE() che trasforma i dati JSON in una tabella relazionale.

Subscription failover

La logical replication e' un'importante funzionalita' introdotta nella versione 10 che riceve continui aggiornamenti ed estensioni. Dalla versione 17 e' possibile indicare, nello statement di CREATE o di ALTER, l'ulteriore parametro failover che indica se e' possibile sincronizzare i replication slot con gli standby.
L'impostazione di default e' false, quindi mantiene lo stesso comportamento delle versioni precedenti. Con l'impostazione a true la replica logica potra' proseguire anche in caso di switch sui secondari.

Varie ed eventuali

Quelle riportate fino ad ora non sono le uniche variazioni importanti della versione 17 di PostgreSQL. Altre novita' interessanti sono:

Avro' dimenticato qualcosa? Certamente si!
In realta' manca ancora qualcosa, perche' la prevista aggiunta della funzione XML_PARSE_HUGE per superare il limite di 10MB supportato dal libxml2 e' stata poi ritirata per non essere sommersi da un miliardo di risate!

Ecco il contenuto completo della matrice delle nuove funzionalita' di PostgreSQL 17:
April the 1st is too early!

Il riferimento finale e' la documentazione ufficiale [NdE per quando ci sara'... al momento documentazione e' in sviluppo] e l'ottimo prospetto riassuntivo di pgPedia.

PostgreSQL e' in costante evoluzione! Per il passato recente: le novita' della versione 16, le novita' della versione 15, ... mentre un documento completo con le versioni di tutti i Software che ritengo piu' significativi, ed ovviamente anche di PostgreSQL, e' il famigerato Il tuo server puzza!

Per il futuro... in realta' il futuro di PostgreSQL e' gia' adesso perche' gli sviluppi per la versione 17 sono gia' iniziati [NdA 2023-07] ed ad aprile 2024 si arrivera' al Feature Freeze in cui vengono fissate le nuove funzionalita' che verranno aggiunte nella versione. Arriveranno quindi le prime Beta e quindi una o piu' RC (Release Candidate) a seconda delle necessita'. Probabilmente un poco prima, ma quasi sicuramente entro il 2024-11 la nuova versione PG17 sara' disponibile come produzione [NdA i rilasci delle nuove versioni generalmente avvengono in corrispondenza all'ultimo rilascio delle minor releases dell'anno, che occorre il secondo giovedi di Novembre, ma sono possibili leggeri anticipi].

Breaking news

Oggi [NdA 2024-09-26] la versione PostgreSQL 17 e' stata rilasciata in produzione!

Non sono molte le variazioni rispetto alla versione iniziale di questa pagina... A mio avviso l'unica correzione di rilievo e' l'implementazione del comandi di MERGE e SPLIT delle partizioni la cui implementazione e' stata regredita in agosto. Peccato perche' sarebbero stati molto utili anche se utilizzavano lock esclusivi.


Titolo: PostgreSQL 17 - Nuove funzionalita'
Livello: Avanzato (3/5)
Data: 1 Aprile 2024 🐟
Versione: 1.1.0 - 26 Settembre 2024
Autore: mail [AT] meo.bogliolo.name