Acceso denegado para el usuario 'root' @ 'localhost' al intentar otorgar privilegios. ¿Cómo otorgo privilegios?

166

He examinado varias preguntas similares y estoy demostrando que he comprobado los conceptos básicos. Aunque, por supuesto, eso no significa que no me haya perdido algo totalmente obvio. :-)

Mi pregunta es: ¿por qué se me niega el acceso a un usuario con los privilegios para hacer lo que estoy tratando de hacer y dónde ya he escrito la contraseña y se me ha otorgado acceso? (En aras de la exhaustividad, intenté escribir la contraseña incorrecta solo para asegurarme de que el cliente MySQL me negaría el acceso al inicio del programa).

Antecedentes:

Iniciando sesión en el shell de la máquina que ejecuta el servidor MySQL a través de ssh, inicio sesión como root:

[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

Increíble. Mi lectura de las respuestas a preguntas similares sugiere que debería asegurarme de que los privilegios estén al día con lo que está en las tablas de subvenciones.

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> 

A continuación, asegúrese de ser quien creo que soy:

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

... y realmente realmente asegúrate de:

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

Hasta aquí todo bien. ¿Qué privilegios tengo ahora?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Ahora que es un poco difícil de leer, intentemos de esta manera (también verá que hay un usuario 'root' no localhost):

mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
*************************** 2. row ***************************
                 Host: [HOSTNAME].com
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
 2 rows in set (0.00 sec)

¡Increíble! MySQL cree que soy root @ localhost y root @ localhost tiene todos esos privilegios. Eso significa que debería poder hacer lo que quiero, ¿verdad?

mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

¿Cómo podría haber arruinado algo tan básico?

Nota al margen: para cualquiera que quiera sugerir que no tengo un usuario llamado root con todos los privilegios, eso es genial y algo que consideraré hacer una vez que pueda darle algunos privilegios a otro usuario.

¡Gracias!

Steven Scotten
fuente
2
Estoy experimentando lo mismo de forma remota (y seleccione * DE mysql.user donde user = 'root' y host = '%' muestra los mismos privilegios que tiene el suyo). SIN EMBARGO, FUNCIONA EN LOCALHOST a pesar de que la fila en mysql.user con host = '%' es idéntica a la fila con host = 'localhost' aparte de ese campo. Estoy ejecutando 5.0.45 en Windows Server 2003. ¡Cualquier respuesta es gratamente aceptada!
Richard Fawcett
3
¡+1 para una pregunta tan organizada!
Dewsworld
1
asegúrese de haber abierto cmd ejecutado como administrador
Lijo
1
Acabo de tener un espacio entre -py la contraseña. Sé que es tonto, pero podría ayudar a alguien.
Vinay W

Respuestas:

57

Observe cómo la salida de

SHOW GRANTS FOR 'root'@'localhost';

no dijo 'TODOS LOS PRIVILEGIOS' pero tuve que explicar qué tiene root @ localhost.

OTORGAR TODOS LOS PRIVILEGIOS fallará, porque un usuario no puede otorgar lo que no tiene, y el servidor parece pensar que algo no está aquí ...

Ahora, ¿qué falta entonces?

En mi sistema, obtengo esto:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: 
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y <----------------------------- new column in 5.5
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: <------------------------------- new column in 5.5
 authentication_string: <------------------------------- new column in 5.5
1 row in set (0.00 sec)

También hay nuevas tablas en 5.5, como mysql.proxies_user: asegúrese de tenerlas.

Al instalar una nueva instancia de servidor mysql, el script de instalación creará todas las tablas mysql. * Con la estructura adecuada.

Al actualizar desde una versión anterior, asegúrese de utilizar el procedimiento de actualización adecuado (mysql_upgrade), que agregará las tablas / columnas que faltan.

Es solo una suposición, pero parece que mysql_upgrade no se realizó para esta instancia, causando el comportamiento visto.

Marc Alff
fuente
77
Esta es información útil, pero ¿cómo soluciono el problema?
augurar
2
@augurar, Run mysql_upgrade
Marc Alff
O verifique si tiene otro usuario con 'TODOS LOS PRIVILEGIOS' y cambie a ese y cambie los privilegios para el localhost. Por ejemplo, tenía todos los privilegios en [email protected] y la raíz @ localhost no.
Carabus Manuel
72

También tuve el mismo problema con esto, pero en Windows después de actualizar a MySQL 5.5 desde MySQL 5.1. Ya intenté cambiar, crear y restablecer la contraseña mencionada aquí , aquí , aquí y aquí , sin idea. Todavía recibo el mismo error:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Puedo conectarme normalmente, mostrar todas las bases de datos, hacer selecciones e inserciones, crear y agregar usuarios, pero cuando se trata de GRANT, estoy jodido. Los errores de acceso denegado se muestran nuevamente.

Logré resolver este problema arreglando los privilegios mediante el siguiente comando en el directorio bin / del servidor MySQL como se menciona aquí :

C:\MySQL Server 5.5\bin> mysql_upgrade

Entonces, el problema desapareció. Espero que esta solución también funcione en Linux, ya que generalmente MySQL proporciona el mismo comando tanto en Linux como en Windows.

Ario
fuente
2
gracias ... en mac OS con mysql instalado a través de homebrew ejecuta el siguiente comandocd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras
30
Si está en CentOs o ha instalado MySQL a través de un administrador de paquetes, este es probablemente el comando que debe ejecutar: ¡ /usr/bin/mysql_upgrade -u root -pingrese la contraseña y Bob's Your Uncle!
Zjoia
Después de luchar aquí y allá con tantos comentarios, este me ayudó. Muchas gracias
siddhusingh
Sé que esto es más antiguo, pero esto me ayudó mucho y quería agregar un comentario más para los futuros visitantes: si le niegan el ACCESO al intentar ejecutar mysql_upgrade, intente ejecutarlo así: mysql_upgrade -p
blizz
2
Lo que encontré es que si exportó bases de datos de MySQL <= 5.1 mysqldump ... --all-databasesy luego las importó a su MySQL> = 5.5, sus usuarios habrán sido reemplazados (por supuesto), pero roottendrá el mismo problema que OP. Y mysql_upgradeno funcionará, debe agregar una --forcebandera, es decir mysql_upgrade -u root -p --force. Espero que ayude a alguien aquí.
gregoltsov
62

Esto puede ocurrir cuando intenta otorgar todos los privilegios en todas las tablas a otro usuario, porque la tabla mysql.users se considera fuera de los límites para un usuario que no sea root.

Sin embargo, lo siguiente debería funcionar:

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

Tenga en cuenta que usamos `%`. * En lugar de *. *

Anuj Gupta
fuente
28
Por favor explique esto. ¿Por qué '%'.*funciona pero no *.*?
Pacerier
Esta es la forma correcta de hacerlo. Debe iniciar sesión en MySQL como root y luego intentar otorgar privilegios.
Nav
Recibo el error 1044 acceso denegado :( ayúdame por favor
Bhaumik Thakkar
Gracias, estaba intentando acceder a mysql desde una aplicación de python usando pymysql. Se produjo un error al decir "El host no puede conectarse a este servidor MariaDB", se resolvió al agregar un nuevo usuario dado [aquí] ( stackoverflow.com/questions/19101243/… ), luego se obtuvo otro error que decía "acceso denegado para el usuario" , y lo resolvió por su método.
Balraj Bains
1
Si usa en '%'.*lugar de `%`.*no funciona. Usted DEBE usar`%`.*
Rosario Russo
7

Esto me sucedió cuando intenté instalar una versión de MySQL más alta que la que viene con la distribución.

Borré la versión anterior y luego instalé la nueva (rpm -e ... luego rpm -i MySQL-server *) Pero no me di cuenta de que los archivos en / var / lib / mysql todavía eran de la versión anterior (con diferencias como explicado por Marc Alff - ¡gracias!)

Podría haber hecho un mysql_upgrade, pero como quería comenzar desde cero lo hice:

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

Luego establezca la contraseña de root (/ usr / bin / mysqladmin -u root password), y todo funcionó como se esperaba con los comandos GRANT ...

phil_w
fuente
Gracias, esto me ayudó. Afortunadamente, no importó si borré todos los DB ...
Jarrod Mosen
5

Básicamente, este error se produce cuando no ha especificado una contraseña, significa que tiene una contraseña incorrecta que figura en algún archivo de opciones.

Lea este DOC sobre cómo asignar y administrar contraseñas a las cuentas.

Además, verifique si el permiso en la carpeta /var/lib/mysql/mysql es 711 o no.

Mithun Sasidharan
fuente
Esto funcionó para mí. Parece que mysql no crea permisos para 'user' @ 'localhost'. Así que tuve que crear ese usuario y asegurarme de que tuviera una contraseña.
Jerinaw
Los permisos estaban mal! Estoy asombrado. Muchas gracias por escribir eso.
Adam
5

Tuve el mismo problema, es decir, todos los privilegios otorgados para root:

SHOW GRANTS FOR 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*[blabla]' WITH GRANT OPTION

... pero aún no está permitido crear una tabla:

 create table t3(id int, txt varchar(50), primary key(id));
ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'

Bueno, fue causado por un molesto error del usuario, es decir, no seleccioné una base de datos. Después de emitir USE dbname funcionó bien.

tzp
fuente
5

En Debian ( Wheezy , 7.8) con MySQL 5.5.40, descubrí SELECT * FROM mysql.user WHERE User='root'\Gque los Event_privcampos y 'Trigger_priv` estaban presentes pero no establecidos en Y.

Correr mysql_upgrade(con o sin --force) no hizo ninguna diferencia; Necesitaba hacer un manual:

update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'

Entonces finalmente podría usar:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION

... y luego usarlo con mayor precisión en una base de datos individual / cuenta de usuario.

William Turrell
fuente
1
Esto también resolvió el problema para mí, pero solo después de descubrir que necesita ENJUAGAR PRIVILEGIOS; luego y vuelva a iniciar sesión para configurar la opción de concesión.
Hendrik
5

Es posible que haya llegado a esta pregunta con MySQL versión 8 instalada (como yo) y no ha encontrado una respuesta satisfactoria. Ya no puede crear usuarios como este en la versión 8:

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;

El mensaje de error bastante confuso que obtienes es: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Para crear usuarios en la versión 8, debe hacerlo en dos pasos:

CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]';
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;

Por supuesto, si lo prefiere, también puede proporcionar un número limitado de privilegios (en lugar de GRANT ALL PRIVILEGES), p. Ej.GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

glorifobia
fuente
3

Escribir SHOW GRANTS FOR 'root'@'localhost';me mostró una contraseña oculta, así que inicié sesión en mysql de ese sistema usando HeidiSQL en otro sistema (usando rootcomo nombre de usuario y la contraseña correspondiente) y escribí
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

y funcionó cuando volví al sistema e inicié sesión usando
mysql -uroot -pthepassword;

Nav
fuente
2

Tuve el mismo problema y me llevó mucho tiempo leer las publicaciones de SO y la documentación de Google. Finalmente encontré esto en las Preguntas frecuentes de Cloud SQL :

Google Cloud SQL no admite privilegios SUPER, lo que significa que las GRANT ALL PRIVILEGESdeclaraciones no funcionarán. Como alternativa, puede usarGRANT ALL ON `%`.*

kurdtpage
fuente
1

Para aquellos que todavía se encuentran con esto como yo, vale la pena verificar para asegurarse de que el intento GRANTno exista:

SHOW GRANTS FOR username;

En mi caso, el error no fue en realidad porque hubo un error de permiso, sino porque GRANTya existía.

mopo922
fuente
1

Una solución simple que siempre funciona para mí cuando se enfrentan a errores de "acceso denegado" mysql: uso sudo.

sudo mysql -u root

Entonces existen los permisos necesarios para los GRANTcomandos.

sospechoso
fuente