Cómo otorgar todos los privilegios al usuario root en MySQL 8.0

110

Intentó

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

Consiguiendo

ERROR 1064 (42000): Tiene un error en su sintaxis SQL; Consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'IDENTIFICADO POR' root 'WITH GRANT OPTION' en la línea 1.

Nota: Lo mismo funciona cuando se probó en versiones anteriores.

También probé

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Consiguiendo

ERROR 1410 (42000): No se le permite crear un usuario con GRANT

El nombre de usuario / contraseña de MySQL (8.0.11.0) es root / root.

Praveen
fuente
¿se está conectando directamente con mysql o usa ssh?
Harald
directamente desde el símbolo del sistema como usuario root
Praveen
1
Vea las diferencias entre 13.7.1.6 GRANT Syntax y 13.7.1.4 GRANT Syntax .
wchiquito
7
Estoy demasiado atascado con el mismo problema. Estoy iniciando el shell mysql usando mysql -u root -p, luego ingresando la contraseña de root. Luego lo intenté GRANT GRANT OPTION ON *.* TO 'root'@'%';y me sale el errorERROR 1410 (42000): You are not allowed to create a user with GRANT
apunta

Respuestas:

198

Comenzando con MySQL 8 ya no puede (implícitamente) crear un usuario usando el GRANTcomando. Utilice CREATE USER en su lugar, seguido de la declaración GRANT :

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Precaución sobre los riesgos de seguridad sobre WITH GRANT OPTION, consulte:

Mike Lischke
fuente
3
Este comando creará un nuevo usuario. Pero quiero otorgar privilegios al usuario root existente. mysql> CREAR USUARIO 'root' @ '%' IDENTIFICADO POR 'root'; Consulta OK, 0 filas afectadas (0.31 seg) mysql> OTORGAR TODOS LOS PRIVILEGIOS ACTIVADOS . PARA 'root' @ '%' CON OPCIÓN DE GRANT; Consulta OK, 0 filas afectadas (0.16 seg) mysql> SELECT User FROM mysql.user; + ------------------ + | Usuario | + ------------------ + | raíz | | mysql.infoschema | | mysql.session | | mysql.sys | | raíz | + ------------------ + 5 filas en conjunto (0.00 seg)
Praveen
¡Ahora dos usuarios con el nombre root están presentes en la tabla de usuarios! Además, no puedo conectarme de forma remota (usuario root). ------------- Detalles: Tipo: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Estado SQL: 08001
Praveen
Extraño. El mensaje de error en su pregunta indica que este usuario no existe. Esta es la única razón por la que sugerí crearlo primero. Y es imposible tener el mismo usuario dos veces en una sola instancia de MySQL. Se diferencian en el nombre o en la parte del anfitrión.
Mike Lischke
2
Estos 2 usuarios se conectan desde diferentes hosts. Corre en su SELECT User, Host FROM mysql.user;lugar.
Mike Lischke
3
Tengo ese error:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi
31

1) Esto funcionó para mí. Primero, cree un nuevo usuario. Ejemplo: usuario foocon contraseñabar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2) Reemplace el siguiente código con un nombre de usuario con 'foo'.

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

Nota: database es la base de datos que desea tener privilegios, . significa todos en todos

3) Inicie sesión como usuario foo

mysql> mysql -u foo -p

Contraseña: bar

4) Asegúrese de que su conexión inicial desde Sequelize esté configurada en foo con pw bar.

J. Doe
fuente
5
Esto de lejos no responde a la pregunta. Se trata de permisos globales y no de permisos específicos de la base de datos.
tmuecksch
29

Veo muchas respuestas (incorrectas), es tan simple como esto:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

Nota: en lugar de uno creado por userusted mismo, puede utilizar rootpara conectarse a la base de datos. Sin embargo, usar la cuenta raíz predeterminada para permitir que una aplicación se conecte a la base de datos no es la forma preferida.

Privilegios alternativos (tenga cuidado y recuerde el principio de privilegio mínimo):

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

Si de alguna manera se encontrara con el siguiente error:

ERROR 1130 (HY000): El host '1.2.3.4' no puede conectarse a este servidor MySQL

Necesita agregar / cambiar las siguientes dos líneas /etc/mysql/my.cnfy reiniciar mysql:

bind-address           = 0.0.0.0
skip-networking
Nebulosa
fuente
¿Podría explicar por qué no funciona en lugar de simplemente quejarse? De esa manera puedo ayudarte o publicar información adicional.
Nebulastic
Esta respuesta ni siquiera aborda la cuestión del privilegio del usuario root .
Joseph 8
Actualizó la respuesta en consecuencia.
Nebulastic
1
La mejor respuesta, ahora es GRANT ALL ONpara MySQL 8.0. También creo que, en lugar de deshabilitar bind-address, puedes enlazar 127.0.0.1e incluir --protocol=tcpen cualquier comando. El rendimiento a largo plazo también es mejor que con localhost.
Jesse Nickles
3

Mis especificaciones:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

Lo que funcionó para mí:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

Respuesta en ambas consultas:

Query OK, O rows affected (0.10 sec*)

NB: Creé una base de datos (db_name) anteriormente y estaba creando una credencial de usuario con todos los privilegios otorgados a todas las tablas en la base de datos en lugar de usar el usuario raíz predeterminado que leí en alguna parte es una mejor práctica.

Nuel Makara
fuente
3

El usuario especificado simplemente no existe en su MySQL (por lo tanto, MySQL está tratando de crearlo con GRANT como lo hizo antes de la versión 8, pero falla con las limitaciones, introducidas en esta versión).

MySQL es bastante tonto en este punto, por lo que si tiene 'root' @ 'localhost' e intenta otorgar privilegios a 'root' @ '%', los trata como usuarios diferentes, en lugar de una noción generalizada para el usuario root en cualquier host, incluido localhost.

El mensaje de error también es engañoso.

Entonces, si recibe el mensaje de error, verifique a sus usuarios existentes con algo como esto

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

y luego cree el usuario faltante (como aconsejó Mike) o ajuste su comando GRANT a la especificación real del usuario existente.

Sergey Podushkin
fuente
¡Esta fue una solución válida para mí! Simplemente no pude escribir la línea user @ con precisión. Asegúrese de verificar esto antes de probar las otras soluciones sugeridas. Para mí fue: CREATE USER 'user'@'%domain.com' y luego, cuando emití la declaración GRANT fallida, mi sintaxis estaba desfasada en uno '.'. Se veía así GRANT .... TO 'usuario'@'%.domain.com'. Olvidé poner el '.' en mi declaración de creación y marcó la diferencia en la solución de este problema.
wallisds
2

Solo mis dos centavos sobre el tema. Estaba teniendo exactamente el mismo problema al intentar conectarme desde MySQL Workbench. Estoy ejecutando una máquina virtual bitnami-mysql para configurar una caja de arena local para el desarrollo.

El tutorial de Bitnami decía ejecutar el comando 'Otorgar todos los privilegios':

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

Claramente, esto no estaba funcionando, finalmente lo hice funcionar usando la respuesta de Mike Lischke.

Lo que creo que sucedió fue que el usuario root @% tenía las credenciales incorrectas asociadas. Entonces, si ha intentado modificar los privilegios del usuario y no ha tenido suerte, intente:

  1. Dejar caer al usuario.
  2. Vuelva a crear el usuario.
  3. Asegúrese de tener el enlace correcto en su archivo de configuración my.cnf. En mi caso, he comentado la línea ya que es solo para un entorno de caja de arena.

Desde la consola Mysql:

Lista de usuarios (útil para ver a todos sus usuarios):

select user, host from mysql.user;

Eliminar usuario deseado:

drop user '{{ username }}'@'%';

Crear usuario y otorgar permisos:

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;

Ejecute este comando:

FLUSH PRIVILEGES;

Busque su archivo de configuración de mysql 'my.cnf' y busque una línea que se vea así:

bind-address=127.0.0.1

y comentarlo usando un '#':

#bind-address=127.0.0.1

Luego reinicia tu servicio mysql.

¡Espero que esto ayude a alguien que tenga el mismo problema!

Armando Juárez
fuente
1

Esto funcionó para mí:

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES
CERO
fuente
1

Compruebe que su nombre de usuario y el dominio es el mismo que creó antes. Mysql selecciona la cuenta por las dos columnas en la tabla de usuario. Si es diferente, mysql puede pensar que desea crear una nueva cuenta por concesión, que no es compatible después de la versión 8.0.

zenglong chen
fuente
1

Mis especificaciones:

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

Lo que funcionó para mí:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';
尹劍平
fuente
Aunque funcionaría en su situación específica. Esta sintaxis SQL actualiza a un usuario y no establece una cuenta de usuario. Tampoco otorga privilegios.
Nebulastic
0

Bueno, tuve el mismo problema. Incluso si la ruta tenía '%' no se podía conectar de forma remota. Ahora, al echar un vistazo al my.iniarchivo (archivo de configuración en Windows) bind-address, se perdió la declaración.

Entonces ... puse esto bind-address = *después [mysqld]y reinicié el servicio. ¡Ahora funciona!

Caos51
fuente
En realidad, esta es la respuesta más cercana a la correcta.
Joseph 8
0

1. conceder privilegios

mysql> OTORGAR TODOS LOS PRIVILEGIOS. PARA 'root' @ '%' CON OPCIÓN DE GRANT;

mysql> PRIVILEGIOS DE FLUSH

2. consulte la tabla de usuarios:

mysql> usar mysql

mysql> seleccionar host, usuario de usuario ingrese la descripción de la imagen aquí

3.Modificar el archivo de configuración

mysql default bind ip: 127.0.0.1, si queremos visitar los servicios de forma remota, simplemente elimine la configuración

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4.finalmente reinicia los servicios

brew services reiniciar mysql

devo chen
fuente
Aunque esto funcionaría, nunca reiniciaría una instancia de mysql en producción al otorgar ciertos privilegios. En su lugar, intente eliminar los privilegios.
Nebulastic
-1

Esto puede funcionar:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';
Anup Joshi
fuente
1
En lugar de descartar el código, también explique por qué es la solución adecuada. El objetivo es educar para que el OP sepa qué hacer la próxima vez, no simplemente resolver el problema inmediato.
The Tin Man
-1

Tuve este mismo problema, lo que me llevó aquí. En particular, para el desarrollo local, quería poder mysql -u root -pprescindir sudo. No quiero crear un nuevo usuario. Quiero usarlo rootdesde una aplicación web PHP local.

El mensaje de error es engañoso, ya que no había nada de malo con los 'root'@'%'privilegios de usuario predeterminados .

En cambio, como varias personas mencionaron en las otras respuestas, la solución fue simplemente establecer en bind-address=0.0.0.0lugar de bind-address=127.0.0.1en mi /etc/mysql/mysql.conf.d/mysqld.cnfconfiguración. De lo contrario, no se requirieron cambios.

Joseph8th
fuente
Esto ni siquiera responde completamente a la pregunta.
Nebulastic
-2

Tuve el mismo problema en CentOS y esto funcionó para mí (versión: 8.0.11):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
usuario3563950
fuente
ERROR 1064 (42000): Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar near '. TO 'root' @ '%' 'en la línea 1
GDefender
mysql> OTORGAR TODOS LOS PRIVILEGIOS. A raíz'@'%'; ERROR 1064 (42000): Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar near '. TO 'root' @ '%' 'en la línea 1 mysql>
PGOEL