La base de données utilisateur MySQL n'a pas de colonnes de mot de passe - Installation de MySQL sur OSX

172

J'essaye de changer le mot de passe root MySql.

Ce que j'ai fait est ci-dessous.

  1. Installez MySql-5.7.6 ~ .dmg (Community Server) et workbench.
  2. Éteignez le serveur dans les préférences du système OSX.
  3. Accédez à MySql avec la console. La commande étaitmysqld_safe --skip-grant
  4. Exécutez update user set password=password('1111') where user='root';et obtenez un message d'erreur -> ERROR 1054 (42S22): Unknown column 'password' in 'field list'.

FYI, je l'ai fait use mysql;. J'ai donc sélectionné la requête sur la table des utilisateurs et trouvé que la colonne de mot de passe n'existe pas.

C'est vraiment bizarre. Est-il possible que la table utilisateur d'origine n'ait pas de colonne de mot de passe?

Comment puis-je changer le mot de passe, qui n'existe pas?

Merci pour votre réponse: D

Juneyoung Oh
la source
Maintenant, je teste à nouveau et je peux accéder à MySQL sans PW: (Est-il bien de changer (je veux dire modifier la table des utilisateurs et ajouter une colonne de mot de passe via une requête) table utilisateur?
Juneyoung Oh
SET PASSWORD for root @ localhost = password ('new-pass') - fonctionne pour toutes les versions de mysql
SIDU
UPDATE mysql.user SET authentication_string= 'password' WHERE User = 'root'; Parce que le champ 'Password' a été supprimé par mysql et remplacé par authentication_string. Remarque: que la fonction mysql PASSWORD ('password') repose sur l'algorithme MD5 qui a été craqué il y a longtemps à l'aide de l'attaque du jour de naissance. Donc, l'utiliser donne un faux sentiment de sécurité car un attaquant peut simplement coller les hachages qu'il produit dans un site Web public comme hashkiller.co.uk/md5-decrypter.aspx et récupérer votre mot de passe en texte brut.
Dr Deo

Réponses:

556

Dans MySQL 5.7, le champ du mot de passe dans le champ de la table mysql.user a été supprimé, maintenant le nom du champ est 'authentication_string'.

Choisissez d'abord la base de données:

mysql>use mysql;

Et puis montrez les tableaux:

mysql>show tables;

Vous trouverez la table des utilisateurs, voyons maintenant ses champs:

mysql> describe user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(16)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher             | blob                              | NO   |     | NULL                  |       |
| x509_issuer            | blob                              | NO   |     | NULL                  |       |
| x509_subject           | blob                              | NO   |     | NULL                  |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0                     |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0                     |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       |
| plugin                 | char(64)                          | NO   |     | mysql_native_password |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.00 sec)

Surprise! Il n'y a pas de champ nommé «mot de passe», le champ du mot de passe est nommé «chaîne_authentification». Alors, faites simplement ceci:

update user set authentication_string=password('1111') where user='root';

Maintenant, tout ira bien.

Par rapport à MySQL 5.6, les changements sont assez importants: Quoi de neuf dans MySQL 5.7

nodejh
la source
42
Vous monsieur a fait ma journée.
Bisonfan95
3
Cette méthode fonctionne même avec la restriction --skip-grant-tables lors du démarrage de mysqld. Puisque vous êtes un utilisateur anonyme, vous ne pouvez pas changer les mots de passe avec: ALTER USER 'root' @ 'localhost' IDENTIFIED BY 'new-password' ALTER USER 'root' @ '*' IDENTIFIED BY 'new-password' Cela vous donnera vous une erreur d'autorisations utilisateur anonyme.
Bisonfan95
et s'il n'y a pas du tout de tables?
Sahand
1
changer le nom du champ de mot de passe ... une décision qui a causé tant de problèmes à tant de gens ...
talsibony
2
Lors de la réinitialisation du mot de passe root à l'étape 2), changez également le plugin d'authentification en mysql_native_password: use mysql; update user set authentication_string=PASSWORD("") where User='root'; update user set plugin="mysql_native_password" where User='root'; # THIS LINE flush privileges; quit;
Viswa
26

Cette erreur se produit si vous n'avez pas défini le mot de passe lors de l'installation, dans ce cas, le mysql en utilisant le plugin unix-socket .

Mais si supprimez le lien du plugin des paramètres (table mysql.user) aura un autre problème. Cela ne résout pas le problème et crée un autre problème. Pour corriger le lien supprimé et définir le mot de passe ("PWD"), procédez comme suit:

1) Exécutez avec --skip-grant-tablescomme indiqué ci-dessus.

Si cela ne fonctionne pas, ajoutez la chaîne skip-grant-tablesdans la section [mysqld]de /etc/mysql/mysql.conf.d/mysqld.cnf. Alors fais sudo service mysql restart.

2) Exécutez mysql -u root -p, puis (changez "PWD"):

update mysql.user 
    set authentication_string=PASSWORD("PWD"), plugin="mysql_native_password" 
    where User='root' and Host='localhost';    
flush privileges;

quit

alors sudo service mysql restart. Vérifier: mysql -u root -p.

Avant de restartsupprimer cette chaîne du fichier mysqld.cnf, si vous la définissez ici.

bl79
la source
Sur place! Plugin nécessaire = "mysql_native_password" et les privilèges de vidage. Impossible de faire fonctionner cela avec un autre exemple. Merci bl79!
TheRealWebGuy
Je reçoisERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '("MYNEWPASSWORD"), plugin="mysql_native_password"
Chance Smith
votre réponse est géniale! c'est une réponse qui m'a aidé pendant 6 heures de combat
AlexNikonov
plugin = "mysql_native_password" Fait le rick pour moi
Joyner
Fonctionne parfaitement pour moi
Mayank Sharma
23

Un piège dans lequel je suis tombé est qu'il n'y a pas de champ de mot de passe maintenant, il a été renommé ainsi:

update user set password=PASSWORD("YOURPASSWORDHERE") where user='root';

Devrait maintenant être:

update user set authentication_string=password('YOURPASSWORDHERE') where user='root';

Jean C
la source
16

Utilisez la ALTER USERcommande plutôt que d'essayer de mettre à jour une USERligne. Gardez à l'esprit qu'il peut y avoir plus d'un utilisateur `` root '', car les entités utilisateur sont également qualifiées par la machine à partir de laquelle elles se connectent

https://dev.mysql.com/doc/refman/5.7/en/alter-user.html

Par exemple.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password' 
ALTER USER 'root'@'*' IDENTIFIED BY 'new-password' 
O. Jones
la source
2
Pour MySQL 5.7.9, je dois ALTER USER pour fonctionner correctement. Merci.
shin
nous avons besoin de user \ g suivi de la commande ci-dessus. Utilisation de MySql 5.7.12. ty
bobsouza
cette réponse n'a fonctionné que pour moi, sur Ubuntu 16.04, mysql 5.7.19;
A1Gard
Ont-ils changé le caractère générique de @ à *? Grr ... maintenant j'ai plus de questions que quand je suis venu ici.
pguardiario
4

Cela ne fonctionnait avec moi que lorsque je "vidais" après les commandes mentionnées ici. Voici la liste complète des commandes que j'ai utilisées:

Les réponses précédentes peuvent ne pas fonctionner pour les versions ultérieures de mysql. Essayez ces étapes si les réponses précédentes n'ont pas fonctionné pour vous:

1- Cliquez sur l'icône wamp> mysql> console mysql

2- écrire les commandes suivantes, une par une

use mysql;
update user set authentication_string=password('your_password') where user='root';
FLUSH PRIVILEGES;
quit
Amgad
la source
4

Merci de votre aide. Juste au cas où les gens ont encore des problèmes, essayez ceci.

Pour MySQL version 5.6 et moins

Vous avez oublié le mot de passe de votre Mac OS X «ROOT» et devez le réinitialiser? Suivez ces 4 étapes simples:

  1.  Arrêtez le serveur mysqld. En règle générale, cela peut être fait à partir de 'Préférences système'> MySQL> 'Arrêter le serveur MySQL'
  2.  Démarrez le serveur en mode sans échec avec contournement de privilèges Depuis un terminal:      sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  3.  Dans une nouvelle fenêtre de terminal:      sudo /usr/local/mysql/bin/mysql -u root      UPDATE mysql.user SET Password=PASSWORD('NewPassword') WHERE User='root';      FLUSH PRIVILEGES;      \q
  4.  Arrêtez à nouveau le serveur mysqld et redémarrez-le en mode normal.

Pour MySQL version 5.7 et plus

  1.  Arrêtez le serveur mysqld. En règle générale, cela peut être fait à partir de 'System Prefrences' > MySQL > 'Stop MySQL Server'
  2.  Démarrez le serveur en mode sans échec avec contournement de privilèges Depuis un terminal:      sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  3.  Dans une nouvelle fenêtre de terminal:            sudo /usr/local/mysql/bin/mysql -u root      UPDATE mysql.user SET authentication_string=PASSWORD('NewPassword') WHERE User='root';      FLUSH PRIVILEGES;      \q      
  4.  Arrêtez à nouveau le serveur mysqld et redémarrez-le en mode normal.
eli
la source
Cela m'aide lors de l'installation de mysql <5.7
Ankit Agarwal
3

Pour ce problème, j'ai utilisé une méthode simple et grossière, renommer le nom du champ en mot de passe, la raison en est que j'utilise le logiciel premium mac navicat dans l'erreur d'opération visuelle: Colonne inconnue 'mot de passe' dans 'liste des champs', le le logiciel lui-même utilise un mot de passe pour que je ne puisse pas fonctionner facilement. Par conséquent, je racine dans la ligne de commande de la base de données, exécutez

Use mysql;

Et puis modifiez le nom du champ:

ALTER TABLE user CHANGE authentication_string password text;

Après tout normal.

luyishisi
la source
0

Cause fondamentale: root n'a pas de mot de passe, et votre instruction de connexion python doit refléter cela.

Pour résoudre l'erreur 1698, remplacez votre mot de passe de connexion python par «».

Remarque: la mise à jour manuelle du mot de passe de l'utilisateur ne résoudra pas le problème, vous obtiendrez toujours l'erreur 1698

Jameskchau
la source
0

rappelez-vous que le mot de passe doit être défini davantage même après le redémarrage de mysql comme ci-dessous

SET PASSWORD = PASSWORD('root');
Pravin
la source