Acesso negado para o usuário ‘root’ @ ‘localhost’ ao tentar conceder privilégios. Como faço para conceder privilégios?

Eu olhei para uma série de perguntas semelhantes e 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 nego access a um usuário com os privilégios para fazer o que estou tentando fazer e onde já digitei a senha e recebi o access? (Para completar, tentei digitar a senha errada apenas para ter certeza de que o cliente MySQL me negaria access no início do programa.)

Fundo:

Conectado ao shell da máquina rodando o servidor MySQL via ssh, logo-me 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 para perguntas semelhantes sugere que eu deveria ter certeza de que os privilégios estão 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 eu sou quem penso que sou:

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

… e realmente certifique-se:

 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 desta forma (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 acha que eu sou root @ localhost e root @ localhost tem todos esses privilégios. Isso significa que eu deveria ser capaz de fazer o que eu 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: para qualquer um que queira sugerir que eu não tenho um usuário chamado root com todos os privilégios, isso é ótimo e algo que considerarei fazer uma vez que eu possa dar a outro usuário alguns privilégios.

Obrigado!

    Observe como a saída de

     SHOW GRANTS FOR 'root'@'localhost'; 

    não disse ‘ALL PRIVILEGES’ mas teve que soletrar o que root @ localhost tem.

    GRANT ALL PRIVILEGES irá falhar, porque um usuário não pode conceder o que ele / ela não tem, e o servidor parece pensar que algo não está aqui …

    Agora, o que está faltando então?

    No meu sistema, eu entendo isso:

     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) 

    Há também novas tabelas no 5.5, como mysql.proxies_user: certifique-se de tê-las.

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

    Ao atualizar de uma versão antiga, certifique-se de que o procedimento de atualização apropriado (mysql_upgrade) seja usado, o que adicionará as tabelas / colunas ausentes.

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

    Eu também tive o mesmo problema com isso, mas no Windows depois de atualizar para o MySQL 5.5 do MySQL 5.1. Eu já tentei alterar, criar e redefinir a senha mencionada aqui , aqui , aqui e aqui , sem 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 quando se trata de GRANT, estou estragado. O erro de access negado é exibido novamente.

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

     C:\MySQL Server 5.5\bin> mysql_upgrade 

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

    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 diferente de root.

    O seguinte, no entanto, deve funcionar:

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

    Note que usamos `%`. * Ao invés de *. *

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

    Eu apaguei a versão antiga e instalei a nova (rpm -e … então 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 eu 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 como esperado com os comandos GRANT …

    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 é permitido 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 de usuário irritante, ou seja, eu não selecionei um database. Depois de emitir o dbname do USE , funcionou bem.

    Digitando SHOW GRANTS FOR 'root'@'localhost'; mostrou-me alguma senha obscura, então eu entrei no mysql desse sistema usando HeidiSQL em outro sistema (usando root como nome de usuário e senha correspondente) e digitei
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

    e funcionou quando voltei para o sistema e me conectei usando
    mysql -uroot -pthepassword;

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

    Leia este documento de entendimento sobre como atribuir e gerenciar senhas para contas.

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

    No Debian ( Wheezy , 7.8) com o MySQL 5.5.40, eu encontrei SELECT * FROM mysql.user WHERE User='root'\G mostrava que os Event_priv e ‘Trigger_priv’ estavam presentes, mas não definidos como Y.

    Executar mysql_upgrade (com ou sem --force ) não fez 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, em seguida, use-o com mais precisão em um database / conta de usuário individual.

    Eu corro para isso quando eu tentei adicionar privilégios para performance_schema, que é bug mysql http://bugs.mysql.com/bug.php?id=44898 (solução alternativa para adicionar –single-transaction).

    Para aqueles que ainda se deparam com isso como eu fiz, vale a pena verificar se a tentativa de GRANT ainda não existe:

     SHOW GRANTS FOR username; 

    No meu caso, o erro não foi, na verdade, porque houve um erro de permissão, mas porque o GRANT já existia.

    Eu tive o mesmo problema e demorou muito para ler as postagens do SO e a documentação do Google. Eu finalmente encontrei isso a partir do FAQ do Cloud SQL :

    O Google Cloud SQL não suporta privilégios SUPER, o que significa que as instruções GRANT ALL PRIVILEGES não funcionarão. Como alternativa, você pode usar GRANT ALL ON `%`.*

    Você pode ter chegado a esta questão com o MySQL versão 8 instalado (como eu) e não encontrou uma resposta satisfatória. Você não pode mais criar usuários assim 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ê precisa fazer isso em duas etapas:

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

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