LatestLinuxPrimoPiano

Resettare la password di root di MySql 8

[Sistema Linux – Ubuntu 22.04 – Mysql Ver 8.0.42]

Per prima cosa occorre avviare Mysql in modalità safe. Per far ciò occorre prima fermare Mysql con il seguente comando:

sudo service mysql stop

N.B. ho utilizzato sudo ipotizzando che ti sia loggato al sistema con un utente diverso da root, io invece ho effettuato tutte le operazioni da root per questo da ora in poi ometterò il sudo.

Negli articoli che ho trovato si fa riferimento non solo a Mysql, ma anche a MariaDB i cui comandi dovrebbero essere identici, ma non ho avuto modo di sperimentarli personalmente. Per MariaDB il comando quindi dovrebbe essere

sudo service mariadb stop

A questo punto si può avviare Mysql in safe mode con il comando

mysqld_safe --skip-grant-tables &

se non usiamo & questo comando non ci restituisce il prompt, quindi occorre che apriamo e continuiamo da un’altra finestra di terminale.

Se dovessimo ricevere il seguente errore

2017-02-10T17:05:44.870970Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2017-02-10T17:05:44.872874Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2017-02-10T17:05:44.874547Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

Possiamo risolverlo creando la directory ed assegnandola all’utente mysql in questo modo

mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld

Un secondo problema potrebbe essere quello di ricevere l’errore

190822 20:37:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

Mysql usa un file di configurazione in /etc/mysql/mysql.conf.d/mysqld_safe_syslog.cnf in cui occorre commentare la seconda riga in questo modo

[mysqld_safe]
#syslog

Questi problemi probabilmente si verificano perché operiamo come utente root, invece dovremmo operare come utente mysql, ma chi la conosce la password di mysql?

Una volta avviato Mysql in modalità safe possiamo accedervi senza password con il comando

mysql -u root mysql

A questo punto possiamo resettare la password di root ma anche qui ho incontrato qualche difficoltà: innanzitutto ricordiamoci che siamo in modalità safe e quindi il comando seguente non può essere usato.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

Occorre fare un update sulla tabella user, ma non esiste nella tabella user un campo password, in questa versione di Mysql la password viene memorizzata nel campo authentication_string e il valore della password non sarà memorizzato in chiaro, ma secondo l’algoritmo di cifratura caching_sha2_password.

mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
4 rows in set (0.01 sec)
mysql> select user, authentication_string from user where user = 'root';
+------+------------------------------------------------------------------------+
| user | authentication_string                                                  |
+------+------------------------------------------------------------------------+
| root | $xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------+------------------------------------------------------------------------+
1 row in set (0.00 sec)

(nel risultato dell’ultima query ho sostituito la stringa con una sequenza di x)

Come fare quindi? L’idea che ho trovato è di “sbiancare” la password e cambiarla successivamente con il comando precedente una volta avviato Mysql in modalità standard.

Quindi:

mysql> UPDATE user SET authentication_string=null WHERE User='root';

A questo punto ricarichiamo le tabelle del nostro database:

mysql> FLUSH PRIVILEGES;

Possiamo ora terminare la modalità safe di Mysql ed uscire da Mysql.

mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)

mysql> quit;
Bye

Facciamo ripartire Mysql in modalità standard con

service mysql start

Entriamo in Mysql come root e con password che sappiamo essere null. Quindi quando ci chiederà la password basterà dare invio.

mysql -u root -p

Come già detto prima ora possiamo impostare la password di root con il comando standard

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

Ora possiamo ricontrollare quanto fatto ripetendo la query precedente per verificare l’effetto delle operazione effettuate:

mysql> select user, authentication_string from user where user = 'root';
+------+------------------------------------------------------------------------+
| user | authentication_string                                                  |
+------+------------------------------------------------------------------------+
| root | $yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy |
+------+------------------------------------------------------------------------+
1 row in set (0.00 sec)

(nel risultato dell’ultima query ho sostituito la stringa con una sequenza di y)

Prima di chiudere il tutto ricordiamoci di rimettere a posto il file /etc/mysql/mysql.conf.d/mysqld_safe_syslog.cnf su cui avevamo commentato la seconda riga.


Ringrazio tutti coloro che con i loro articoli hanno contribuito alla risoluzione del mio problema.

Bibbliografia:

https://gmadv.it/it/linux/come-resettare-la-password-di-root-in-mariadb-e-mysql/#:~:text=a%20questo%20punto%20per%20resettare,memorizzarla%20in%20un%20posto%20sicuro!

https://stackoverflow.com/questions/42153059/mysqld-safe-directory-var-run-mysqld-for-unix-socket-file-dont-exists

https://stackoverflow.com/questions/57616900/mysqld-safe-mysqld-from-pid-file-mysqld-pid-ended

https://gamagelakshani.medium.com/change-mysql-8-0-password-in-mac-f43f15267f7b

Lascia un commento

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