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

29

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 que cela %signifie tout hôte, mais mon statut indique clairement localhost. Quelqu'un a-t-il une idée de ce qui pourrait se passer?

RolandoMySQLDBA
la source

Réponses:

17

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, un hôte %et un mot de passe vides, 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?

  • USER () 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 que vous aviez 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, procédez 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 !!!

RolandoMySQLDBA
la source
10

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 ça t'as aidé.

Kevin Florida
la source
aussi, pour des raisons de sécurité, vous devez toujours supprimer l'utilisateur root après avoir créé un nouveau dba .. assurez-vous simplement qu'ils accordent TOUS LES PRIVILÈGES puis à la fin AVEC GRANT OPTION .. ce bit est important.
Kevin Florida
Ceci, combiné avec la fermeture et la réouverture de la connexion (dans mon cas depuis HeidiSQL) a fait l'affaire!
xorinzor
4

Après avoir entré en tant rootqu'utilisateur, 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 à rootnouveau tous les privilèges à l' utilisateur:

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

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

Arrêtez le mysqldserveur

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

Restaurer les rootprivilèges avec:

 mysql> flush privileges;
 mysql> grant all privileges on *.* to 'root'@'localhost' with grant option;
Atropo
la source
C'est ce que j'obtiens après le show grant pour la commande 'root' @ 'localhost': ERREUR 1141 (42000): Il n'y a pas une telle allocation définie pour l'utilisateur 'root' sur l'hôte 'localhost'
Quelle est la sortie de la deuxième commande?
2
Il existe une "meilleure" façon de procéder dans Debian, où vous n'avez pas besoin de redémarrer le serveur. Tout comme se rootconnecter comme debian-sys-maint@localhostet utiliser le mot de passe /etc/mysql/debian.cnf. Cet utilisateur a TOUS les privilèges dans MySQL. La bonne chose est que vous n'avez pas besoin de redémarrer votre serveur.
Anders
Essaye ça. sudo mysql --defaults-file = / etc / mysql / debian.cnf
Anders
0

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

David Metcalfe
la source