Como conceder todos os privilégios ao usuário root no MySQL 8.0


110

Tentou

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

Obtendo

ERROR 1064 (42000): você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para obter a sintaxe correta para usar próximo a 'IDENTIFIED BY' root 'WITH GRANT OPTION' na linha 1.

Nota: O mesmo funciona quando tentado em versões anteriores.

Também tentei

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

Obtendo

ERROR 1410 (42000): Você não tem permissão para criar um usuário com GRANT

O nome de usuário / senha do MySQL (8.0.11.0) é root / root.


você está se conectando diretamente com o mysql ou usa ssh?
— Harald

diretamente do prompt de comando como usuário root
— Praveen

1
Consulte as diferenças entre 13.7.1.6 Sintaxe GRANT e 13.7.1.4 Sintaxe GRANT .
— wchiquito

7
estou muito preso ao mesmo problema. Estou iniciando o shell mysql usando e mysql -u root -p, em seguida, inserindo a senha de root. Então tentei GRANT GRANT OPTION ON *.* TO 'root'@'%';e recebi o erroERROR 1410 (42000): You are not allowed to create a user with GRANT
— aiman

Respostas:


197

A partir do MySQL 8, você não pode mais (implicitamente) criar um usuário usando o GRANTcomando. Em vez disso, use CREATE USER , seguido pela instrução GRANT :

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

Cuidado com os riscos de segurança WITH GRANT OPTION, consulte:


3
Este comando criará um novo usuário. Mas eu quero conceder privilégios ao usuário root existente. mysql> CREATE USER 'root' @ '%' IDENTIFICADO POR 'root'; Consulta OK, 0 registros afetados (0,31 seg) mysql> GRANT ALL PRIVILEGES ON . PARA 'root' @ '%' COM OPÇÃO DE CONCESSÃO; Consulta OK, 0 linhas afetadas (0,16 seg) mysql> SELECT User FROM mysql.user; + ------------------ + | Usuário | + ------------------ + | root | | mysql.infoschema | | mysql.session | | mysql.sys | | root | + ------------------ + 5 linhas no conjunto (0,00 s)
— Praveen

Agora dois usuários com nome root estão presentes na tabela de usuários !! Além disso, não consigo me conectar remotamente (usuário root). ------------- Detalhes: Tipo: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Estado SQL: 08001
— Praveen

Esquisito. A mensagem de erro em sua pergunta indica que este usuário não existe. Esta é a única razão pela qual sugeri criá-lo primeiro. E é impossível ter o mesmo usuário duas vezes em uma única instância do MySQL. Eles diferem no nome ou na parte do host.
— Mike Lischke

2
Esses 2 usuários se conectam de hosts diferentes. Em SELECT User, Host FROM mysql.user;vez disso, corra .
— Mike Lischke

3
Recebi esse erro:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
— adi

31

1) Isso funcionou para mim. Primeiro, crie um novo usuário. Exemplo: usuário foocom senhabar

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

2) Substitua o código abaixo por um nome de usuário com 'foo'.

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

Nota: database_name é o banco de dados para o qual você deseja ter privilégios . significa tudo em tudo

3) Faça login como usuário foo

mysql> mysql -u foo -p

Senha: bar

4) Certifique-se de que sua conexão inicial do Sequelize está configurada para foo com pw bar.


5
Isso de longe não responde à pergunta. É sobre permissões globais, e não permissões específicas de banco de dados.
— tmuecksch 01 de

29

Eu vejo muitas respostas (erradas), é tão simples quanto isto:

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

Nota: em vez de um auto-criado, uservocê pode usar rootpara se conectar ao banco de dados. No entanto, usar a conta raiz padrão para permitir que um aplicativo se conecte ao banco de dados não é a forma preferida.

Privilégios alternativos (tenha cuidado e lembre-se do princípio do privilégio 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'@'*';

Se, de alguma forma, você encontrasse o seguinte erro:

ERROR 1130 (HY000): Host '1.2.3.4' não tem permissão para se conectar a este servidor MySQL

Você precisa adicionar / alterar as duas linhas a seguir /etc/mysql/my.cnfe reiniciar o mysql:

bind-address           = 0.0.0.0
skip-networking

Você poderia explicar por que não funciona em vez de apenas reclamar? Assim posso te ajudar ou postar informações adicionais.
— Nebulosa

Esta resposta nem mesmo aborda a questão do privilégio do usuário root .
— Joseph8 de

Atualizou a resposta de acordo.
— Nebulosa

1
Melhor resposta, agora é GRANT ALL ONpara MySQL 8.0. Além disso, acredito que em vez de desativar bind-addressvocê pode vincular 127.0.0.1e incluir --protocol=tcpem qualquer comando. O desempenho a longo prazo também é melhor do que com localhost.
— Jesse Nickles

3

Minhas especificações:

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

O que funcionou para mim:

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

Resposta em ambas as consultas:

Query OK, O rows affected (0.10 sec*)

NB: Eu criei um banco de dados (db_name) anteriormente e estava criando uma credencial de usuário com todos os privilégios concedidos a todas as tabelas no banco de dados em vez de usar o usuário root padrão que li em algum lugar é uma prática recomendada.


3

O usuário especificado simplesmente não existe em seu MySQL (portanto, o MySQL está tentando criá-lo com GRANT como fazia antes da versão 8, mas falha com as limitações, introduzidas nesta versão).

O MySQL é muito burro neste ponto, então se você tiver 'root' @ 'localhost' e tentar conceder privilégios para 'root' @ '%', ele os tratará como usuários diferentes, ao invés de noção generalizada para usuário root em qualquer host, incluindo localhost.

A mensagem de erro também é enganosa.

Então, se você está recebendo a mensagem de erro, verifique seus usuários existentes com algo assim

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

e, em seguida, crie o usuário ausente (como Mike aconselhou) ou ajuste o comando GRANT para a especificação do usuário existente.


Esta foi uma solução válida para mim! Eu simplesmente não consegui digitar a linha user @ com precisão. Certifique-se de verificar isso antes de tentar as outras soluções sugeridas. Para mim era: CREATE USER 'user'@'%domain.com' e então quando eu emiti a instrução GRANT com falha, minha sintaxe estava errada por um '.'. Parecia com GRANT .... TO 'user'@'%.domain.com'. Esqueci de colocar o '.' na minha declaração de criação e fez toda a diferença na correção deste problema.
— wallisds de

2

Apenas meus 2 centavos sobre o assunto. Eu estava tendo exatamente o mesmo problema ao tentar me conectar do MySQL Workbench. Estou executando uma máquina virtual bitnami-mysql para configurar uma área restrita local para desenvolvimento.

O tutorial de Bitnami dizia para executar o comando 'Conceder todos os privilégios':

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

Isso claramente não estava funcionando, finalmente consegui fazer funcionar usando a resposta de Mike Lischke.

O que eu acho que aconteceu foi que o usuário root @% tinha as credenciais erradas associadas a ele. Portanto, se você tentou modificar os privilégios do usuário e sem sorte, tente:

  1. Eliminando o usuário.
  2. Crie o usuário novamente.
  3. Certifique-se de ter a ligação correta em seu arquivo de configuração my.cnf. No meu caso, comentei a linha, pois é apenas para um ambiente de sandbox.

No console Mysql:

Listar usuários (útil para ver todos os seus usuários):

select user, host from mysql.user;

Abandone o usuário desejado:

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

Criar usuário e conceder permissões:

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

Execute este comando:

FLUSH PRIVILEGES;

Localize seu arquivo de configuração mysql 'my.cnf' e procure por uma linha semelhante a esta:

bind-address=127.0.0.1

e comente usando um '#':

#bind-address=127.0.0.1

Em seguida, reinicie o serviço mysql.

Espero que isso ajude alguém com o mesmo problema!


1

Isso funcionou para mim:

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

1

Verifique se o seu nome de usuário e domínio é o mesmo criado antes. Mysql seleciona a conta pelas duas colunas na tabela do usuário. Se for diferente, mysql pode pensar que você deseja criar uma nova conta por concessão, que não é suportada após a versão 8.0.


1

Minhas especificações:

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

O que funcionou para mim:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';

Embora funcione em sua situação específica. Essas partes da sintaxe sql atualizam um usuário e não definem uma conta de usuário. Também não concede privilégios.
— Nebulosa

0

Bem, eu simplesmente tive o mesmo problema. Mesmo se a rota tivesse '%', não poderia se conectar remotamente. Agora, dando uma olhada no my.iniarquivo (arquivo de configuração no Windows), obind-address instrução foi perdida.

Então ... coloquei isso bind-address = *depois [mysqld]e reiniciei o serviço. Agora funciona!


Na verdade, esta é a mais próxima da resposta correta.
— Joseph8 de

0

1. conceder privilégios

mysql> GRANT ALL PRIVILEGES ON. PARA 'root' @ '%' COM OPÇÃO DE CONCESSÃO;

mysql> FLUSH PRIVILEGES

2. verifique a tabela do usuário:

mysql> use mysql

mysql> selecione host, usuário a partir do usuário insira a descrição da imagem aqui

3. Modifique o arquivo de configuração

mysql default bind ip : 127.0.0.1, se quisermos visitar serviços remotamente, apenas delete config

#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 reinicie os serviços

brew services reiniciar mysql


Embora isso funcione, eu nunca reiniciaria uma instância do mysql em produção ao conceder certos privilégios. Em vez disso, tente liberar privilégios.
— Nebulosa

-1

Isso pode funcionar:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';

1
Em vez de descartar o código, explique também por que é a solução apropriada. O objetivo é educar para que o OP saiba o que fazer da próxima vez, não apenas resolver o problema imediato.
— o Tin Man

-1

Eu tive esse mesmo problema, que me trouxe até aqui. Em particular, para o desenvolvimento local, eu queria poder viver mysql -u root -psem sudo. Não quero criar um novo usuário. Desejo usar rootde um aplicativo da web PHP local.

A mensagem de erro é enganosa, pois não havia nada de errado com o padrão'root'@'%' privilégios de usuário .

Em vez disso, como várias pessoas mencionaram nas outras respostas, a solução foi simplesmente definir em bind-address=0.0.0.0vez de bind-address=127.0.0.1na minha /etc/mysql/mysql.conf.d/mysqld.cnfconfiguração. De outra forma, nenhuma mudança foi necessária.


Isso nem mesmo responde totalmente à pergunta.
— Nebulosa

-2

Tive o mesmo problema no CentOS e funcionou para mim (versão: 8.0.11):

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

ERROR 1064 (42000): você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para a sintaxe correta a ser usada próximo a '. PARA 'root' @ '%' 'na linha 1
— GDefender

mysql> GRANT ALL PRIVILEGES ON. PARA 'root' @ '%'; ERROR 1064 (42000): você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para a sintaxe correta a ser usada próximo a '. TO 'root' @ '%' 'na linha 1 mysql>
— PGOEL
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.