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.