web-dev-qa-db-fra.com

Accès refusé à l'utilisateur 'root' @ '%'

J'avais l'habitude d'accéder très bien à l'utilisateur root dans MySQL. Mais récemment, je n'en suis plus capable.

Je peux me connecter correctement:

 mysql -u root -p

Voici l'état de mysql après la connexion:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (i686) using readline 6.2

Connection id:      37
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.28-0ubuntu0.12.04.3 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         4 min 16 sec

Threads: 1  Questions: 112  Slow queries: 0  Opens: 191  
Flush tables: 1  Open tables:  6  Queries per second avg: 0.437
--------------

Mais quand je veux faire une action, telle que:

mysql> CREATE DATABASE moyennegenerale;
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'moyennegenerale'

Je comprends % est utilisé pour signifier tout hôte, mais mon statut indique clairement localhost. Quelqu'un a-t-il une idée de ce qui pourrait se passer?

29
jules testard

Je pense que vous avez des utilisateurs anonymes

Essayez d'exécuter ceci:

SELECT user,Host,password FROM mysql.user WHERE user='';

Cela montrera quels utilisateurs anonymes existent. Très probablement, vous verrez une ligne avec un utilisateur vide, Host %, Et un mot de passe vide comme indiqué ci-dessous:

mysql> select user,Host,password from mysql.user;
+-----------+-------------+-------------------------------------------+
| user      | Host        | password                                  |
+-----------+-------------+-------------------------------------------+
| lwdba     | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | %           | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| Vanilla   | localhost   |                                           |
| mywife    | %           |                                           |
|           | %           |                                           | <<<--- LOOK !!!
| replicant | 10.64.113.% | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| kumar     | %           |                                           |
+-----------+-------------+-------------------------------------------+

Alors, comment vous êtes-vous connecté? Exécutez cette requête:

SELECT USER(),CURRENT_USER();

Qu'est-ce que cela vous dit?

  • SER () indique comment vous avez tenté de vous authentifier dans MySQL
  • CURRENT_USER () indique comment vous avez été autorisé à vous authentifier dans MySQL

La deuxième fonction CURRENT_USER() révèle comment l'utilisateur anonyme a été utilisé pour se connecter.

Quels privilèges aviez-vous lorsque vous vous êtes connecté?

Veuillez exécuter

SHOW GRANTS;

Cela dévoilera les privilèges dont vous disposiez au moment de votre connexion. Le fait que vous ayez été empêché de créer une base de données montre que vous n'étiez pas root mais un utilisateur disposant de privilèges inférieurs.

Veuillez nettoyer vos subventions utilisateur.

En ce qui concerne la réinitialisation du mot de passe root, veuillez procéder comme suit:

echo "SET PASSWORD FOR root@localhost=PASSWORD('password');" > /var/lib/mysql/rootpwd.sql
service mysql restart
rm -f /var/lib/mysql/rootpwd.sql

J'ai appris cette méthode efficace de @ShlomiNoach .

Essaie !!!

18
RolandoMySQLDBA

Je sais ce que tu as fait.

Faites ceci:

SELECT `User`, `Grant_priv` FROM `mysql`.`user` WHERE `User` = 'root';

Vous remarquerez probablement qu'il renvoie un "N" pour Grant_priv. Faites donc ceci:

UPDATE `mysql`.`user` SET `Grant_priv` = 'Y' WHERE `User` = 'root';
FLUSH PRIVILEGES;
SELECT `User`, `Grant_priv` FROM `mysql`.`user`;

Et walla! J'espère que cela pourra aider.

10
Kevin Florida

Après avoir entré en tant qu'utilisateur root, vérifiez vos privilèges:

 mysql> show grants for 'root'@'localhost';

Après avoir vérifié vos privilèges, vous pouvez essayer de donner tous les privilèges à un autre utilisateur, ou vous pouvez essayer de donner à nouveau à l'utilisateur root tous les privilèges:

 mysql> grant all privileges on *.* to 'root'@'localhost';

Si votre utilisateur root n'a pas de privilèges, vous pouvez essayer de les restaurer, alors:

Arrêtez le serveur mysqld

Redémarrez le serveur de cette façon mysqld_safe --skip-grant-table

Restaurez les privilèges root avec:

 mysql> flush privileges;
 mysql> grant all privileges on *.* to 'root'@'localhost' with grant option;
4
Atropo

Vos privilèges peuvent être réduits?

Vous pouvez également essayer de créer un autre compte avec des privilèges root.

Et supprimez l'utilisateur root et recréez avec les privilèges spécifiés.

Cela peut être utile: http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

C.5.4.1.2 - LINUX (Créer un fichier avec une requête qui crée, un nouvel utilisateur avec des privilèges root complets)

C.5.4.1.1 - Windows (Créer un fichier avec une requête qui crée, un nouvel utilisateur avec des privilèges root complets)

Requête: (Créer un utilisateur root)

  CREATE USER 'new_root'@'%' IDENTIFIED BY '***';
  GRANT ALL PRIVILEGES ON *.* TO 'new_root'@'%' IDENTIFIED BY '***' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

MySQL Manual Create User: http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

0
Jan Czarny