Mot de passe root de MySQL perdu

À tout ceux qui ont oublié le mot de passe du super-user requis pour administrer MySQL (et qui ont également un accès root à la machine qui héberge le serveur de base de données), voici un tutoriel qui va permettre de réinitialiser ce mot de passe sans tout péter :

  1. La première étape indispensable est d’arrêter MySQL, d’où le besoin d’avoir des privilèges élevés sur la machine hôte.
  2. Bloquez tous les accès externes à MySQL via iptables  si vous être trop lent au clavier 🙂
  3. Lancez MySQL avec le paramètre –skip-grant-tables , cela a pour effet de désactiver toute politique d’accès, en d’autre terme c’est tournée gratuite pour tout le monde, d’où le blocage de l’étape 2.
  4. Tapez mysql -u root , et hop vous avez la main sans avoir eu à taper de mot de passe
  5. Dans ce mode de fonctionnement, les commandes de gestion des accès ne fonctionnent pas : il n’est donc pas envisageable d’utiliser l’une de ces commandes : GRANT  ou REVOKE . En revanche on peut désormais taper sur la table mysql (la table système) avec les commandes de base : SELECT et UPDATE. Pour réinitialiser les mots de passe root, vous pouvez utiliser cette requête SQL en remplaçant le mot de passe :
    UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
    FLUSH PRIVILEGES;
  6. Étape finale. En théorie, l’instruction FLUSH PRIVILEGES  recharge les accès, et il n’est donc plus possible de se connecter au serveur MySQL sans s’identifier. Pour ma part, j’ai redémarré le serveur MySQL en mode « normal », je ne perds rien si ce n’est 10 petites secondes.

MySQL propose une solution alternative plus rapide, en permettant d’exécuter un fichier SQL au démarrage du serveur avec bien évidemment les privilèges root. La technique est donc identique sauf qu’au lieu de taper la requête SQL en console, on la prépare dans un fichier, qui est ensuite lancé avec le switch –init-file=fichier_reinitialisation.sql. Il n’est plus nécessaire alors d’utiliser le paramètre –skip-grant-table, mais gare à ne pas se tromper dans la requête.

Voir aussi