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!
fonte
-p
e a senha. Eu sei que é bobagem, mas pode ajudar alguém.Respostas:
Observe como a saída de
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:
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.
fonte
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:
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 :
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.
fonte
cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
/usr/bin/mysql_upgrade -u root -p
digite a senha e o Bob's Your Uncle!mysqldump ... --all-databases
e depois importou para o MySQL> = 5.5, seus usuários foram substituídos (é claro), mas vocêroot
terá o mesmo problema do OP. Emysql_upgrade
não vai funcionar - você tem que adicionar--force
sinalizador, iemysql_upgrade -u root -p --force
. Espero que ajude alguém aqui.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:
Observe que usamos `%`. * Em vez de *. *
fonte
'%'.*
funciona, mas não*.*
?'%'.*
vez de`%`.*
não funcionar. Você DEVE usar`%`.*
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:
Em seguida, defina a senha root (/ usr / bin / mysqladmin -u root password) e tudo funcionou conforme o esperado com os comandos GRANT ...
fonte
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.fonte
Eu tive o mesmo problema, ou seja, todos os privilégios concedidos para root:
... mas ainda não tem permissão para criar uma tabela:
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.
fonte
No Debian ( Wheezy , 7.8) com o MySQL 5.5.40, descobri
SELECT * FROM mysql.user WHERE User='root'\G
que osEvent_priv
campos '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.
fonte
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:
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:
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
fonte
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 (usandoroot
como nome de usuário e a senha correspondente) e digiteiGRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;
e funcionou quando voltei ao sistema e entrei usando
mysql -uroot -pthepassword;
fonte
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).
fonte
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 :
fonte
Para aqueles que ainda se deparam com isso como eu, vale a pena conferir para garantir que a tentativa
GRANT
ainda não exista:No meu caso, o erro não foi realmente porque houve um erro de permissão, mas porque o
GRANT
já existia.fonte
Uma solução simples que sempre funciona para mim quando se depara com erros de "acesso negado" do mysql: use
sudo
.Em seguida, existem as permissões necessárias para os
GRANT
comandos.fonte