Reset password

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Procédure de récupération d'accès — mot de passe root MySQL/MariaDB
Prérequis Accès root au système d'exploitation (redémarrage du service)
Voir aussi Mysql · Mysqladmin · Mysql config editor

Cette page décrit la procédure de réinitialisation du mot de passe root de MySQL/MariaDB en cas de perte d'accès administrateur à la base — spécifique au SGBD MySQL, à ne pas confondre avec une réinitialisation de mot de passe système ou celle d'un autre SGBD.

Le principe repose sur le mode --skip-grant-tables : démarrer temporairement le serveur sans vérification des droits, pour pouvoir se connecter sans mot de passe et modifier le compte root, avant de revenir à un fonctionnement normal.

Avertissement sécurité : en mode --skip-grant-tables, n'importe quelle connexion au serveur a un accès complet, sans authentification. Ajouter systématiquement --skip-networking pour n'autoriser que les connexions locales via le socket Unix pendant l'opération, et effectuer cette procédure sur un serveur non exposé/isolé le temps de la manipulation.

1. Arrêter le service et redémarrer en mode dégradé

systemctl stop mysqld
mysqld_safe --skip-grant-tables --skip-networking &

(Nom du service à adapter selon la distribution/le SGBD : mysqld ou mysql pour MySQL, mariadb pour MariaDB — à vérifier avec systemctl status.)

2. Se connecter sans mot de passe

mysql

Dans MySQL 5.7.6 et versions ultérieures (et sur MariaDB), le mode --skip-grant-tables désactive aussi la prise en compte des privilèges en mémoire : il faut recharger les tables de droits avant de pouvoir exécuter un ALTER USER, sans quoi la commande échoue :

FLUSH PRIVILEGES;

3. Changer le mot de passe root

Méthode moderne (MySQL 5.7.6+ / MariaDB récent), à privilégier :

ALTER USER 'root'@'localhost' IDENTIFIED BY 'nouveau_mot_de_passe';
FLUSH PRIVILEGES;

Méthode historique (MySQL 5.6 et antérieur — dépréciée, ne fonctionne plus sur les versions récentes) :

UPDATE mysql.user SET Password = PASSWORD('nouveau_mot_de_passe') WHERE User = 'root';
FLUSH PRIVILEGES;

4. Redémarrer normalement

mysqld_safe --skip-grant-tables --skip-networking &   -- arrêter ce process (Ctrl+C ou kill du PID mysqld_safe)
systemctl start mysqld

Cas particulier : compte verrouillé sans mot de passe perdu

Si le mot de passe root est connu mais que ses privilèges ont été altérés par erreur (ex. droit GRANT OPTION retiré), la même procédure --skip-grant-tables permet de les restaurer sans passer par une réinitialisation complète du mot de passe :

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Voir aussi

  • Mysql — page hub
  • Mysqladmin — commande password, utilisable une fois l'accès restauré
  • Mysql config editor — pour éviter de perdre le mot de passe la prochaine fois (stockage dans un login-path plutôt qu'en mémoire humaine)