Dopo un aggiornamento di Debian 12 (Bookworm) può succedere che MySQL non si avvii più e che nei log compaia un riferimento a MariaDB, anche se sul server è installato solo MySQL Community Server 8.0. In questa guida vediamo come riconoscere il problema, capirne la causa e risolverlo in pochi minuti, senza toccare i dati dei database.

Il sintomo: mysql.service in stato failed

Il servizio risulta fallito e il log riporta l’errore Can't read dir of '/etc/mysql/mariadb.conf.d/':

# service mysql status
× mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; preset: enabled)
     Active: failed (Result: exit-code)
     Status: "Server startup in progress"

mysqld: Can't read dir of '/etc/mysql/mariadb.conf.d/' (OS errno 2 - No such file or directory)
mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/mysql/my.cnf at line 29.
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
systemd[1]: Failed to start mysql.service - MySQL Community Server.

Controllando i pacchetti installati, MySQL è regolarmente presente (pacchetti mysql-community-server 8.0 dal repository ufficiale Oracle):

dpkg -l | grep mysql

La causa: l’alternativa my.cnf punta a mariadb.cnf

Su Debian il file /etc/mysql/my.cnf non è un file vero e proprio, ma un collegamento gestito da update-alternatives. Più pacchetti possono registrare la propria versione e, in modalità automatica, vince quella con la priorità più alta.

Durante l’aggiornamento è stato installato (e poi rimosso) il pacchetto mariadb-common, che registra /etc/mysql/mariadb.cnf con priorità 500, più alta di /etc/mysql/mysql.cnf (priorità 300). Il pacchetto è stato rimosso ma non eliminato del tutto (stato rc), quindi la sua configurazione è rimasta attiva. Alla riga 29 di quel file c’è l’inclusione di /etc/mysql/mariadb.conf.d/, una cartella che non esiste: MySQL legge la configurazione, non trova la directory e si interrompe.

Buona notizia: i dati in /var/lib/mysql non sono stati toccati. È solo un problema di configurazione.

Diagnosi: verificare dove punta my.cnf

ls -l /etc/mysql/my.cnf /etc/alternatives/my.cnf
update-alternatives --display my.cnf
sed -n '25,32p' /etc/mysql/my.cnf
dpkg -l | grep -i mariadb

Se il problema è questo, l’output sarà simile al seguente:

/etc/alternatives/my.cnf -> /etc/mysql/mariadb.cnf
/etc/mysql/my.cnf -> /etc/alternatives/my.cnf

my.cnf - modalità automatica
  la versione migliore del collegamento è /etc/mysql/mariadb.cnf
  il collegamento attualmente punta a /etc/mysql/mariadb.cnf
/etc/mysql/mariadb.cnf - priorità 500
/etc/mysql/my.cnf.fallback - priorità 100
/etc/mysql/mysql.cnf - priorità 300

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

rc  mariadb-common   1:10.11.18-0+deb12u1   all   MariaDB common configuration files

Soluzione passo passo

1. Fare un backup della configurazione

cp -a /etc/mysql /root/etc-mysql-backup-$(date +%F)

2. Eliminare i residui di mariadb-common

Il purge rimuove mariadb.cnf e la relativa voce in update-alternatives:

apt purge mariadb-common

3. Ripuntare my.cnf su mysql.cnf

update-alternatives --remove my.cnf /etc/mysql/mariadb.cnf 2>/dev/null
update-alternatives --set my.cnf /etc/mysql/mysql.cnf

4. Verificare la configurazione

update-alternatives --display my.cnf
cat /etc/mysql/my.cnf
my_print_defaults mysqld

Ora my.cnf deve puntare a /etc/mysql/mysql.cnf e includere /etc/mysql/conf.d/ e /etc/mysql/mysql.conf.d/. Se my_print_defaults mysqld stampa i parametri senza errori, la configurazione è corretta.

5. Avviare MySQL

systemctl start mysql
systemctl status mysql
journalctl -u mysql -n 50 --no-pager

Se my.cnf non è un collegamento simbolico

Se /etc/mysql/my.cnf è un file normale oppure /etc/mysql/mysql.cnf non esiste, si può ricreare la configurazione a mano:

mv /etc/mysql/my.cnf /etc/mysql/my.cnf.mariadb.bak
cat > /etc/mysql/my.cnf <<'EOF'
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
EOF
mkdir -p /etc/mysql/conf.d
systemctl start mysql

Soluzione rapida provvisoria

Se serve rimettere online il database subito, basta creare la cartella mancante. È però solo un tampone: MySQL continuerebbe a leggere la configurazione pensata per MariaDB, quindi è meglio applicare la soluzione completa appena possibile.

mkdir /etc/mysql/mariadb.conf.d && systemctl start mysql

Come evitare che si ripresenti

Conviene capire quale aggiornamento ha installato MariaDB, consultando lo storico di apt:

grep -i -B3 -A3 mariadb /var/log/apt/history.log*

Per impedire che mariadb-common venga reinstallato in futuro si può bloccarlo con un pin APT a priorità negativa:

cat > /etc/apt/preferences.d/no-mariadb <<'EOF'
Package: mariadb-*
Pin: release *
Pin-Priority: -1
EOF

Dopo ogni aggiornamento importante è buona abitudine controllare anche lo stato dell’alternativa con update-alternatives --display my.cnf.

Domande frequenti

Perdo i dati dei database?

No. Il problema riguarda solo i file di configurazione in /etc/mysql; i dati in /var/lib/mysql restano intatti.

Perché Debian ha scelto mariadb.cnf?

Perché l’alternativa my.cnf era in modalità automatica e mariadb.cnf ha priorità 500, più alta dei 300 di mysql.cnf. Con update-alternatives --set la scelta diventa manuale e non cambia più da sola.

Vale anche per Ubuntu?

Sì, il meccanismo di update-alternatives per my.cnf è lo stesso su Ubuntu e sulle altre distribuzioni derivate da Debian.

Conclusione

L’errore “Can’t read dir of /etc/mysql/mariadb.conf.d/” dopo un aggiornamento di Debian non indica un danno a MySQL, ma una configurazione residua di MariaDB rimasta attiva tramite update-alternatives. Eliminando mariadb-common con apt purge e reimpostando my.cnf su mysql.cnf, MySQL torna a funzionare regolarmente.

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *