Acesso negado para o usuário 'root' @ 'localhost' ao tentar conceder privilégios. Como concedo privilégios?

166

Analisei várias perguntas semelhantes e, por isso, estou demonstrando que verifiquei o básico. Embora, é claro, isso não signifique que eu não tenha perdido algo totalmente óbvio. :-)

Minha pergunta é: por que me foi negado o acesso a um usuário com privilégios para fazer o que estou tentando fazer e onde já digitei a senha e recebi acesso? (Por uma questão de integridade, tentei digitar a senha errada apenas para garantir que o cliente MySQL me negasse acesso no início do programa.)

Fundo:

Conectado ao shell da máquina executando o servidor MySQL via ssh, efetuo login 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> 

Impressionante. Minha leitura das respostas a perguntas semelhantes sugere que devo garantir que os privilégios estejam atualizados com o que está nas tabelas de concessão

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

mysql> 

Em seguida, verifique se sou quem penso que sou:

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

... e realmente realmente se certificar:

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

mysql> 

Por enquanto, tudo bem. Agora, quais privilégios eu tenho?

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)

Agora isso é um pouco difícil de ler, então vamos tentar dessa maneira (você também verá que existe um usuário 'root' não 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)

Impressionante! O MySQL pensa que eu sou root @ localhost e root @ localhost tem todos esses privilégios. Isso significa que eu devo poder fazer o que quero, certo?

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)

Como eu poderia ter estragado algo tão básico?

Nota lateral: para quem quer sugerir que eu não tenho um usuário chamado root com todos os privilégios, isso é ótimo e algo que considerarei fazer depois que eu puder conceder alguns privilégios a outro usuário.

Obrigado!

Steven Scotten
fonte
2
Estou experimentando o mesmo remotamente (e selecione * FROM mysql.user onde user = 'root' e host = '%' mostram os mesmos privilégios que o seu). No entanto, ele funciona no LOCALHOST, mesmo que a linha no mysql.user com host = '%' seja idêntica à linha com host = 'localhost' além desse campo. Estou executando o 5.0.45 no Windows Server 2003. Todas as respostas aceitas com gratidão!
Richard Fawcett
3
+1 para uma pergunta tão organizada!
Dewsworld 13/09/2013
1
Verifique se você tem opend cmd por executar como administrador
Lijo
1
Eu só tinha um espaço entre -pe a senha. Eu sei que é bobagem, mas pode ajudar alguém.
Vinay W

Respostas:

57

Observe como a saída de

SHOW GRANTS FOR 'root'@'localhost';

não disse 'TODOS OS PRIVILEGIOS', mas precisou especificar o que root @ localhost possui.

CONCEDER TODOS OS PRIVILÉGIOS falhará, porque um usuário não pode conceder o que não possui e o servidor parece pensar que algo não está aqui ...

Agora, o que está faltando então?

No meu sistema, recebo o seguinte:

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)

Também existem novas tabelas no 5.5, como mysql.proxies_user: verifique se você as possui.

Ao instalar uma nova instância do servidor mysql, o script de instalação criará todas as tabelas mysql. * Com a estrutura apropriada.

Ao atualizar de uma versão antiga, verifique se o procedimento de atualização adequado (mysql_upgrade) é usado, o que adicionará as tabelas / colunas ausentes.

É apenas um palpite, mas parece que o mysql_upgrade não foi feito para esta instância, causando o comportamento visto.

Marc Alff
fonte
7
Esta é uma informação útil, mas como soluciono o problema?
augurar
2
@augurar, Execute mysql_upgrade
Marc
Ou verifique se você tem outro usuário com 'TODOS OS PRIVILEGIOS' e mude para esse e altere os privilégios do host local. Por exemplo, eu tinha todos os privilégios em [email protected] e o root @ localhost não.
Carabus Manuel
72

Eu também tive o mesmo problema com isso, mas no Windows após a atualização para o MySQL 5.5 do MySQL 5.1. Eu já tentei alterar, criar e redefinir a senha mencionada aqui , aqui , aqui e aqui , nenhuma pista. Ainda obtenho o mesmo erro:

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

Consigo me conectar normalmente, mostrar todos os bancos de dados, selecionar e inserir, criar e adicionar usuários, mas, no que diz respeito ao GRANT, estou ferrado. O erro de acesso negado aparece novamente.

Eu consegui resolver esse problema corrigindo os privilégios pelo seguinte comando no diretório bin / do servidor MySQL, conforme mencionado aqui :

C:\MySQL Server 5.5\bin> mysql_upgrade

Então, o problema desapareceu. Espero que esta solução funcione também no Linux, já que geralmente o MySQL fornece o mesmo comando no Linux e no Windows.

Aryo
fonte
2
thanx .. no Mac OS com mysql instalado através homebrew execute o seguinte comandocd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
Zoras
30
Se você está em um CentOs ou instalou o MySQL por meio de um gerenciador de pacotes, é provável que este seja o comando que você deve executar: /usr/bin/mysql_upgrade -u root -pdigite a senha e o Bob's Your Uncle!
Zjoia
Depois de lutar aqui e ali com tantos comentários, esse me ajudou. Muito obrigado
siddhusingh
Eu sei que isso é mais antigo, mas isso me ajudou muito e eu gostaria de adicionar mais um comentário para futuros visitantes: se você estiver recebendo o ACCESS DENIED tentando executar o mysql_upgrade, tente executá-lo assim: mysql_upgrade -p
blizz
2
O que eu descobri é que se você exportou bancos de dados do MySQL <= 5.1 via mysqldump ... --all-databasese depois importou para o MySQL> = 5.5, seus usuários foram substituídos (é claro), mas você rootterá o mesmo problema do OP. E mysql_upgradenão vai funcionar - você tem que adicionar --forcesinalizador, ie mysql_upgrade -u root -p --force. Espero que ajude alguém aqui.
gregoltsov
62

Isso pode acontecer quando você tenta conceder todos os privilégios em todas as tabelas para outro usuário, porque a tabela mysql.users é considerada fora dos limites para um usuário que não seja root.

No entanto, o seguinte deve funcionar:

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

Observe que usamos `%`. * Em vez de *. *

Anuj Gupta
fonte
28
Por favor, explique isso. Por que '%'.*funciona, mas não *.*?
Pacerier
Este é o caminho certo para fazê-lo. Você precisa fazer login no MySQL como root e tentar conceder privilégios.
Nav
Estou recebendo erro 1044 acesso negado :( Me ajude por favor
Bhaumik Thakkar
Obrigado, estava tentando acessar o mysql de um aplicativo python usando o pymysql. Ocorreu um erro ao dizer "O host não tem permissão para conectar-se a este servidor MariaDB", resolveu isso adicionando um novo usuário fornecido [aqui] ( stackoverflow.com/questions/19101243/… ) e, em seguida, ocorreu outro erro ao dizer "acesso negado ao usuário" e resolvido pelo seu método.
quer
1
Se você usar em '%'.*vez de `%`.*não funcionar. Você DEVE usar`%`.*
Rosario Russo
7

Isso aconteceu comigo quando tentei instalar uma versão mais alta do MySQL do que a que vinha com a distribuição.

Apaguei a versão antiga e instalei a nova (rpm -e ... e rpm -i MySQL-server *) Mas não percebi que os arquivos em / var / lib / mysql ainda eram da versão mais antiga (com diferenças como explicado por Marc Alff - obrigado!)

Eu poderia ter feito um mysql_upgrade, mas como eu queria começar do zero, fiz:

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

Em seguida, defina a senha root (/ usr / bin / mysqladmin -u root password) e tudo funcionou conforme o esperado com os comandos GRANT ...

phil_w
fonte
Obrigado, isso me ajudou. Felizmente, ele não importa se eu obliterada todos os bancos de dados ...
Jarrod Mosen
5

Basicamente, esse erro ocorre quando você não especificou uma senha, significa que você tem uma senha incorreta listada em algum arquivo de opções.

Leia este DOC para entender como atribuir e gerenciar senhas a contas.

Além disso, verifique se a permissão na pasta /var/lib/mysql/mysql é 711 ou não.

Mithun Sasidharan
fonte
Isso funcionou para mim. Parece que o mysql não cria permissões para 'user' @ 'localhost'. Então, eu tive que criar esse usuário e garantir que ele tivesse uma senha.
21714 Jerinaw
As permissões estavam erradas! Estou impressionado. Muito obrigado por postar isso.
Adam
5

Eu tive o mesmo problema, ou seja, todos os privilégios 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

... mas ainda não tem permissão para criar uma tabela:

 create table t3(id int, txt varchar(50), primary key(id));
ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'

Bem, isso foi causado por um erro irritante do usuário, ou seja, eu não selecionei um banco de dados. Depois de emitir USE dbname , funcionou bem.

tzp
fonte
5

No Debian ( Wheezy , 7.8) com o MySQL 5.5.40, descobri SELECT * FROM mysql.user WHERE User='root'\Gque os Event_privcampos 'Trigger_priv` estavam presentes, mas não estavam definidos como Y.

Correr mysql_upgrade(com ou sem --force) não fazia diferença; Eu precisava fazer um manual:

update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'

Então, finalmente, eu poderia usar:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION

… E use-o com mais precisão em um banco de dados / conta de usuário individual.

William Turrell
fonte
1
Isso também resolveu o problema para mim, mas somente depois que descobri que você precisava liberar privilégios; depois, faça o login novamente para definir a opção de concessão.
Hendrik
5

Você pode ter chegado a esta pergunta com o MySQL versão 8 instalada (como eu) e não encontrou uma resposta satisfatória. Você não pode mais criar usuários como este na versão 8:

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;

A mensagem de erro bastante confusa que você recebe é: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Para criar usuários na versão 8, você deve fazer isso em duas etapas:

CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]';
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;

Obviamente, se você preferir, também pode fornecer um número limitado de privilégios (em vez de GRANT ALL PRIVILEGES), por exemploGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

glorifobia
fonte
3

A digitação SHOW GRANTS FOR 'root'@'localhost';me mostrou uma senha obscura; portanto, entrei no mysql desse sistema usando o HeidiSQL em outro sistema (usando rootcomo nome de usuário e a senha correspondente) e digitei
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

e funcionou quando voltei ao sistema e entrei usando
mysql -uroot -pthepassword;

Nav
fonte
2

Eu corro isso quando tentei adicionar privilégios ao performance_schema, que é o bug do mysql http://bugs.mysql.com/bug.php?id=44898 (solução alternativa para adicionar a transação única).

pevik
fonte
2

Eu tive o mesmo problema e demorou muito para ler as postagens de SO e a documentação do Google. Finalmente encontrei isso nas Perguntas frequentes sobre o Cloud SQL :

O Google Cloud SQL não oferece suporte a privilégios SUPER, o que significa que as GRANT ALL PRIVILEGESinstruções não funcionarão. Como alternativa, você pode usarGRANT ALL ON `%`.*

kurdtpage
fonte
1

Para aqueles que ainda se deparam com isso como eu, vale a pena conferir para garantir que a tentativa GRANTainda não exista:

SHOW GRANTS FOR username;

No meu caso, o erro não foi realmente porque houve um erro de permissão, mas porque o GRANTjá existia.

mopo922
fonte
1

Uma solução simples que sempre funciona para mim quando se depara com erros de "acesso negado" do mysql: use sudo.

sudo mysql -u root

Em seguida, existem as permissões necessárias para os GRANTcomandos.

suspeito
fonte