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!
fuente
-p
y la contraseña. Sé que es tonto, pero podría ayudar a alguien.Respuestas:
Observe cómo la salida de
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:
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.
fuente
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:
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í :
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.
fuente
cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
/usr/bin/mysql_upgrade -u root -p
ingrese la contraseña y Bob's Your Uncle!mysqldump ... --all-databases
y luego las importó a su MySQL> = 5.5, sus usuarios habrán sido reemplazados (por supuesto), peroroot
tendrá el mismo problema que OP. Ymysql_upgrade
no funcionará, debe agregar una--force
bandera, es decirmysql_upgrade -u root -p --force
. Espero que ayude a alguien aquí.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:
Tenga en cuenta que usamos `%`. * En lugar de *. *
fuente
'%'.*
funciona pero no*.*
?'%'.*
lugar de`%`.*
no funciona. Usted DEBE usar`%`.*
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:
Luego establezca la contraseña de root (/ usr / bin / mysqladmin -u root password), y todo funcionó como se esperaba con los comandos GRANT ...
fuente
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.fuente
Tuve el mismo problema, es decir, todos los privilegios otorgados para root:
... pero aún no está permitido crear una tabla:
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.
fuente
En Debian ( Wheezy , 7.8) con MySQL 5.5.40, descubrí
SELECT * FROM mysql.user WHERE User='root'\G
que losEvent_priv
campos 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.
fuente
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:
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:
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
fuente
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 (usandoroot
como 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;
fuente
Ejecuté esto cuando intenté agregar privilegios a performance_schema, que es el error de mysql http://bugs.mysql.com/bug.php?id=44898 (solución alternativa para agregar - transacción única).
fuente
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 :
fuente
Para aquellos que todavía se encuentran con esto como yo, vale la pena verificar para asegurarse de que el intento
GRANT
no exista:En mi caso, el error no fue en realidad porque hubo un error de permiso, sino porque
GRANT
ya existía.fuente
Una solución simple que siempre funciona para mí cuando se enfrentan a errores de "acceso denegado" mysql: uso
sudo
.Entonces existen los permisos necesarios para los
GRANT
comandos.fuente