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

He analizado varias preguntas similares, por lo que estoy demostrando que he comprobado lo básico. 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 trato de hacer y donde ya he escrito la contraseña y se me ha otorgado acceso? (En aras de la integridad, intenté escribir la contraseña incorrecta solo para asegurarme de que el cliente de MySQL me negara el acceso al inicio del progtwig).

Fondo:

Iniciado 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 actualizados con lo que está en las tablas de concesión.

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

Luego asegúrate de que soy quien creo que soy:

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

… y realmente me aseguro de:

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

Hasta aquí todo bien. Ahora que privilegios tengo?

 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 pude haber arruinado algo tan básico?

Nota al pie: 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 le pueda dar a otro usuario algunos privilegios.

¡Gracias!

Observe cómo el resultado de

 SHOW GRANTS FOR 'root'@'localhost'; 

no dijo “TODOS LOS PRIVILEGIOS”, sino que tuvo que deletrear qué tiene root @ localhost.

GRANT ALL PRIVILEGES fallará, porque un usuario no puede otorgar lo que no tiene, y el servidor parece pensar que algo no está aquí …

Ahora, ¿qué es lo que 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, la secuencia de comandos 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 correcto (mysql_upgrade), que agregará las tablas / columnas que faltan.

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

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 ninguna pista. Todavía obtengo el mismo error:

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

Puedo conectarme normalmente, mostrar todas las bases de datos, seleccionar e insertar, crear y agregar usuarios, pero cuando se trata de GRANT, estoy jodido. Esos errores de acceso denegado aparecen nuevamente.

Logré resolver este problema al arreglar los privilegios con 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.

Esto puede suceder 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 de un usuario que no sea root.

Lo siguiente, sin embargo, debería funcionar:

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

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

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 … then 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 configure la contraseña de root (/ usr / bin / mysqladmin -u contraseña de root), y todo funcionó como se esperaba con los comandos de GRANT …

Tuve el mismo problema, es decir, todos los privilegios concedidos 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 se permite 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 causada por un error de usuario molesto, es decir, no seleccioné una base de datos. Después de emitir USE dbname funcionó bien.

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 root como el nombre de usuario y la contraseña correspondiente) y escribiendo
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

y funcionó cuando volví al sistema y me conecté usando
mysql -uroot -pthepassword;

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

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

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

En Debian ( Wheezy , 7.8) con MySQL 5.5.40, encontré SELECT * FROM mysql.user WHERE User='root'\G mostraba los Event_priv y ‘Trigger_priv’ presentes pero no configurados en Y.

Ejecutar mysql_upgrade (con o sin --force ) no hizo 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 de manera más precisa en una cuenta de usuario / base de datos individual.

Me encuentro con esto cuando intenté agregar privilegios a performance_schema, que es el error mysql http://bugs.mysql.com/bug.php?id=44898 (solución alternativa para agregar –single-transaction).

Para aquellos que todavía tropiezan con esto como yo lo hice, vale la pena verificar para asegurarse de que el bash de GRANT no exista ya:

 SHOW GRANTS FOR username; 

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

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

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

Es posible que haya llegado a esta pregunta con la versión 8 de MySQL instalada (como yo) y no haya encontrado una respuesta satisfactoria. Ya no puedes 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 recibe es: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Para crear usuarios en la versión 8, debes 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 ), por ejemplo, GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER