Acceso denegado para el usuario 'root' @ '%'

29

Solía ​​acceder al usuario root en MySQL muy bien. Pero recientemente, ya no puedo hacerlo.

Puedo iniciar sesión bien:

 mysql -u root -p

Aquí está el estado de mysql después de iniciar sesión:

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
--------------

Pero cuando quiero hacer alguna acción, como:

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

Entiendo que %se usa para indicar cualquier host, pero mi estado indica claramente localhost. ¿Alguien tiene una idea de lo que podría estar pasando?

RolandoMySQLDBA
fuente

Respuestas:

17

Creo que tienes usuarios anónimos.

Intenta ejecutar esto:

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

Esto mostrará qué usuarios anónimos existen. Lo más probable es que vea una línea con un usuario en blanco, un host %y una contraseña en blanco como se muestra a continuación:

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     | %           |                                           |
+-----------+-------------+-------------------------------------------+

Entonces, ¿cómo ingresaste? Ejecute esta consulta:

SELECT USER(),CURRENT_USER();

¿Qué te dice esto?

  • USER () informa cómo intentó autenticarse en MySQL
  • CURRENT_USER () informa cómo se le permitió autenticarse en MySQL

La segunda función CURRENT_USER()revela cómo se utilizó el usuario anónimo para iniciar sesión.

¿Qué privilegios tenía cuando inició sesión?

Por favor, corre

SHOW GRANTS;

Esto revelará los privilegios que tenía en el momento en que inició sesión. El hecho de que se le haya bloqueado la creación de una base de datos muestra que no era root sino un usuario con menos privilegios.

Limpie sus subvenciones de usuario.

En cuanto a restablecer la contraseña de root, haga lo siguiente:

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

Aprendí este método eficiente de @ShlomiNoach .

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
10

Yo sé lo que hiciste.

Hacer esto:

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

Probablemente notará que devuelve una 'N' para Grant_priv. Entonces haz esto:

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

Y walla! Espero que ayude.

Kevin Florida
fuente
Además, por razones de seguridad, siempre debe eliminar el usuario raíz después de crear un nuevo dba ... solo asegúrese de que OTORGUE TODOS LOS PRIVILEGIOS y al final CON LA OPCIÓN DE OTORGAMIENTO ... ese bit es importante.
Kevin Florida
¡Esto, combinado con el cierre y la reapertura de la conexión (en mi caso de HeidiSQL), funcionó!
xorinzor
4

Después de ingresar como rootusuario, verifique sus privilegios:

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

Después de verificar sus privilegios, puede intentar otorgarle a otro usuario todos los privilegios, o puede intentar otorgarle al rootusuario todos los privilegios nuevamente:

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

Si su rootusuario no tiene privilegios, puede intentar restaurarlos, entonces:

Detener el mysqldservidor

Reinicie el servidor de esta manera. mysqld_safe --skip-grant-table

Restaurar rootprivilegios con:

 mysql> flush privileges;
 mysql> grant all privileges on *.* to 'root'@'localhost' with grant option;
Atropo
fuente
Esto es lo que obtengo después de las concesiones de show para el comando 'root' @ 'localhost': ERROR 1141 (42000): No se ha definido dicha concesión para el usuario 'root' en el host 'localhost'
¿Cuál es el resultado del segundo comando?
2
Hay una "mejor" forma de hacerlo en Debian, donde no necesita reiniciar el servidor. Solo rootconéctese debian-sys-maint@localhosty use la contraseña /etc/mysql/debian.cnf. Ese usuario tiene TODOS los privilegios en MySQL. Lo bueno es que no necesita reiniciar su servidor.
Anders
Prueba esto. sudo mysql --defaults-file = / etc / mysql / debian.cnf
Anders
0

¿Sus privilegios pueden ser reducidos?

Además, puede intentar crear otra cuenta con privilegios de root.

Y elimine el usuario raíz y vuelva a crear con los privilegios especificados.

Esto puede ser útil: http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

C.5.4.1.2 - LINUX (Crear un archivo con una consulta que crea, un nuevo usuario con todos los privilegios de root)

C.5.4.1.1 - Windows (Hacer un archivo con una consulta que crea, un nuevo usuario con privilegios completos de root)

Consulta: (Crear usuario 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
fuente