L’aggiornamento di PostgreSQL a una nuova versione non è un’operazione da prendere alla leggera. Una migrazione ben pianificata evita problemi e garantisce che il database continui a funzionare senza intoppi. In questa guida aggiorniamo PostgreSQL alla versione 17 su un sistema Ubuntu.
Verifiche pre-aggiornamento dei pacchetti installati e dello spazio disponibile
al fine di non avere intoppi in fase di migrazione è bene verificare quali pacchetti che fanno riferimento a postgreSQL sono installati nel nostro sistema e quanto spazio occupano i database (oltre chiaramente ai loro percosi e nomi)
Prima di tutto, vediamo quali versioni di PostgreSQL sono già installate:
dpkg --get-selections | grep postgres
questo il mio output:
postgresql install
postgresql-12 install
postgresql-client-12 install
postgresql-common install
postgresql-common-dev install
postgresql-contrib install
postgresql-plperl-12 install
già da questa prima analisi vedo che nel sistema è installato “postgresql-plperl-12” quindi nel mio caso dovrò aggiornare anche questo componente alla versione 17
verifichiamo quindi quali database sono sulla macchina e la loro dimensione:
sudo pg_lsclusters
che restituisce:
Ver Cluster Port Status Owner Data directory Log file
12 main 5434 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log
a questo punto posso verificare la dimensione del database con il comando:
sudo du -sh /var/lib/postgresql/12/main
nel mio caso si tratta di 5 GB
5.0G /var/lib/postgresql/12/main
controlliamo, come ultima cosa, di avere abbastanza spazio disponibile per la creazione del secondo database con il comando
df -h
che mi restitusce:
Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 1.6M 1.6G 1% /run
/dev/sda2 59G 19G 38G 34% /
tmpfs 7.9G 1.1M 7.9G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
tmpfs 1.6G 0 1.6G 0% /run/user/1000
come evidenziato ho tutto lo spazio di cui ho bisogno, BENE! possiamo iniziare
Aggiornare il sistema e aggiungere il repository PostgreSQL
ottimo veniamo alla parte di aggiornameno e installazione dei nuovi pacchetti, io durante questi aggiornamenti preferisco sempre aggiornare anche i pacchetti di sistema, ma non è un regquisto fondamentale, anche se è sicuramente una cosa “buona e giusta”
aggiorniamo quindi tutti i pacchetti del SO:
sudo apt update && sudo apt upgrade -y
aggiungiamo quindi, se necessario, il repository ufficiale di PostgreSQL, wget e gnupg2:
sudo apt install -y wget gnupg2
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo tee /etc/apt/trusted.gpg.d/postgresql.asc
echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
Aggiorniamo la lista dei pacchetti e installiamo PostgreSQL 17:
sudo apt update
sudo apt install -y postgresql-17 postgresql-client-17
NB: Se il database utilizza PL/Perl, come nel mio caso, installiamo anche il pacchetto corrispondente:
sudo apt install -y postgresql-plperl-17
Ottimo a questo punto facciamo un controllo sui pacchetti installati con “dpkg –get-selections | grep postgres” , giusto per essere sicuri, se il vostro output è simile a questo:

possiamo proseguire
Preparare la migrazione
a questo punto siamo pronti per la migrazione vera e propria: dobbiamo quindi creare il percorso per il nuovo database della versione 17 (ndr: no quel maledetto non lo fa in automatico), modificare il file di configurazione del database originale ( quello della versione 12 nel mio caso) per adeguarci agli standard di migrazione ed e eseguire la migrazione vera e propria
“cominciamo dal comincio” e fermiamo il servizio PostgreSQL:
sudo service postgresql stop
Modifichiamo il file di configurazione per ridurre il carico durante la migrazione, (questo vi eviterà tutta una serie di errori nei quali sono incappato io e che per mio buon cuore vi risparmio):
sudo nano /etc/postgresql/12/main/postgresql.conf
Cerchiamo all’interno del file, con CTRL+W e modifichiamo:
shared_buffers = 1024MB
huge_pages = try

salviamo con il solito CTRL + X, Y, Invio
creiamo quindi i nuovi percorsi per il PostgreSQL 17
sudo mkdir -p /var/lib/postgresql/17/main
sudo chown postgres:postgres /var/lib/postgresql/17/main
sudo chmod 700 /var/lib/postgresql/17/main
OTTIMO! abbiamo tutto, possiamo procedere
Avviare la migrazione
Ora possiamo eseguire l’upgrade vero e proprio dalla versione 12 all ultima disponibile sul sistema ( la 17)
sudo pg_upgradecluster 12 main
il processo fa tutto in automatico, e si mettetevi comodi perchè ci vorrà un po di tempo
Questo processo può richiedere tempo, a seconda delle dimensioni del database. Per monitorare la migrazione in tempo reale, apriamo un secondo terminale e lanciamo:
sudo watch -n 5 du -sh /var/lib/postgresql/17/mainDobbiamo aspettare che la dimensione del nuovo database raggiunga circa quella del precedente, vista nelle fasi iniziali di questa guida (quindi circa 5 GB nel mio caso)
Verificare la migrazione
se tutto è andato per il verso giusto e se abbiamo ricevuto i messaggi di esito positivo della migrazione, una volta terminato l’upgrade, controlliamo lo stato dei cluster:
pg_lsclusters
che a questo punto ci restituirà:
Ver Cluster Port Status Owner Data directory Log file
12 main 5434 down postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log
17 main 5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log
ottimo! abbiamo on-line in nuovo db e offline il vecchio
possiamo a questo puntoi andare a rieditare il file di configurazione, stavolta sulla versione nuova del DB ( la 17) per ripristinare i parametri “shared_buffers” e
“huge_pages” alla versione orinale, se lo desideriamo
sudo nano /etc/postgresql/17/main/postgresql.conf
Cerchiamo all’interno del file, con CTRL+W e modifichiamo:
shared_buffers = 2048MB
huge_pages = on
salviamo con il solito CTRL + X, Y, Invio
ottimo, ci siamo! Non ci resta che riavviare il servizio PostgreSQL per tornare operativi:
sudo service postgresql start
Eliminare il vecchio cluster (opzionale)
a questo punto a me piace fare un po di pulizia, infatti avendo la migrazione creato un secondo database rischiamo di “dimenticarci in giro” la vecchia versione 12 che, in alcuni casi potrebbe essere abbastanza ingombrante e creare quindi problemi di spazio sulla macchina
Cancellare un database in PostgreSQL è davvero facile ed è un processo ( cosi come altri database) senza appello, massima attenzione quindi su quello che stiamo facendo
Se tutto è a posto e vogliamo liberare spazio, possiamo eliminare il vecchio cluster (ovvero la verisone 12) :
sudo pg_dropcluster 12 main --stop
abbiamo finito!!
Conclusione
Seguendo questi passaggi, abbiamo aggiornato PostgreSQL alla versione 17 in sicurezza, minimizzando i rischi e garantendo il corretto funzionamento del database.
