Coloro che abbiano installato MySQL sul proprio PC o server Linux qualche tempo fa stanno incappando oggi in un fastidioso errore simile al seguente: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 467B942D3A79BD29. Il messaggio appare ogni volta che usiamo il gestore di pacchetti per ricercare gli aggiornamenti oppure tentiamo di aggiornare MySQL stesso. In questa rapida guida vedremo come risolvere il problema.

La presente guida è stata testata sul server di TurboLab.it con MySQL 8 su Ubuntu 20.04. La procedura è comunque analoga per qualsiasi altra distribuzione: è sufficiente utilizzare il proprio gestore di pacchetti al posto di apt

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna

Il messaggio di errore completo è simile al seguente:

An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://repo.mysql.com/apt/ubuntu focal InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 467B942D3A79BD29

Viene visualizzato su tutti i sistemi sui quali sia stato installato MySQL utilizzando il repository ufficiale di MySQL invece che tramite il pacchetto fornito dalla propria distribuzione. Si tratta della modalità che io consiglio, e che ho indicato anche nella guida dedicata:

» Leggi: Guida: come installare MySQL per Linux (Ubuntu/CentOS)

Oltre al fastidio di visualizzare questo avviso, la situazione dovrebbe essere corretta al più presto: in questo scenario, infatti, la copia installata di MySQL non viene aggiornata e rimane ferma ad una versione ormai obsoleta

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna - mysql logo spotlight

errore NO_PUBKEY 467B942D3A79BD29: La causa

L'errore dipende dal fatto che MySQL (l'azienda) ha sostituito la chiave crittografica GPG con la quale firma le nuove versioni dei pacchetti (fonte). Di conseguenza, la corrispondente chiave pubblica che avevamo aggiunto precedentemente alla lista di quelle "autorizzate" non combacia più con quella oggi in uso.

Il sistema di aggiornamento integrato nel sistema operativo rileva dunque che la nuova firma crittografica è sconosciuta, e rifiuta l'installazione del nuovo pacchetto emettendo il messaggio in questione.

errore NO_PUBKEY 467B942D3A79BD29: Visualizzare la chiave scaduta

Per prima cosa, impartiamo il seguente comando:

sudo apt-key list

Questo elenca le chiavi installate, fra le quali dovrebbe figurare anche quella di MySQL Release Engineering

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna

Si noti la dicitura [ expired]. Questo ci conferma che la chiave è, appunto, scaduta.

errore NO_PUBKEY 467B942D3A79BD29: Rimuovere la vecchia chiave

Procediamo eliminando la chiave scaduta. Dalla schermata precedente, prendiamo nota della seconda riga, ovvero quella che, nel caso mostrato nello screenshot, riporta A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5.

Ora utilizziamo il testo appena copiato in un comando simile al seguente

sudo apt-key del "A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5"

Attenzione alle virgolette!

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna

Il comando deve rispondere semplicemente OK... ma, purtroppo, risponde OK sia in caso il comando abbia avuto effettivamente successo, sia in caso la chiave sia già stata rimossa o non esista! Per assicurasi che l'operazione sia veramente andata a buon fine è dunque opportuno impartire di nuovo il precedente sudo apt-key list e constatare che la sezione relativa a MySQL Release Engineering sia sparita.

errore NO_PUBKEY 467B942D3A79BD29: Aggiungere la nuova chiave

Siamo ora nelle condizioni ideali per aggiungere la nuova chiave utilizzata da MySQL. Allo scopo, basta impartire:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3A79BD29

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna

Da notare che il server indicato nel comando sopra, keyserver.ubuntu.com, è diverso da quello consigliato nella documentazione ufficiale di MySQL. Quello consigliato nella doc è infatti spesso sovraccarico, e tende a non rispondere. Quello che suggerisco io, gestito da Ubuntu ma compatibile con qualsiasi altra distribuzione, risponde invece sempre puntualmente.

Aggiornare la lista dei pacchetti disponibili

Possiamo ora aggiornare la cache dei pacchetti disponibili impartendo

sudo apt update

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna

Da notare che, ora, il messaggio di errore non si presenta più.

Aggiornare MySQL

Se, fino ad oggi, visualizzavamo il messaggio di errore NO_PUBKEY 467B942D3A79BD29, è altamente probabile che la copia di MySQL installata sia divenuta obsoleta. È dunque importante valutare di svolgere subito l'aggiornamento che, ora, funzionerà correttamente e scaricherà una build aggiornata

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna

Prima di proseguire all'upgrade, è imperativo effettuare un backup del database, di modo da poterlo ripristinare in caso di problemi. Abbiamo visto come farlo in modo ottimale e con un singolo comando in quest'altra guida:

» Leggi: MySQL/mysqldump: creare un file distinto/singolo per ogni database con zzmysqldump (script)

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna - zzmysqldump spotlight

Una volta che il backup è pronto, procediamo con l'upgrade. Personalmente, preferisco cogliere l'occasione e aggiornare tutto il sistema, invece dei singoli pacchetti. Ho mostrato come farlo qui:

» Leggi: Aggiornare Ubuntu: quali differenze fra apt-get update, apt-get upgrade e apt-get dist-upgrade? Il modo migliore è... zzupdate!

Linux (Ubuntu): come risolvere errore NO_PUBKEY 467B942D3A79BD29 MySQL non si aggiorna - zzupdate spotlight

Chi lavori con MySQL da diversi anni ricorderà sicuramente che, in passato, era necessario lanciare manualmente mysql_upgrade dopo ogni installazione di un nuovo pacchetto. Oggi, invece, questa operazione non è più necessaria: il servizio principale di MySQL svolge infatti automaticamente questa operazione in caso fosse necessario. Evviva!