Primeiro deixe-me mencionar que I'passei por muitas perguntas sugeridas e não encontrei nenhuma resposta relevante. Aqui está o que eu'estou fazendo.
I'm ligado à minha instância EC2 da Amazon. Eu posso fazer login com a raiz do MySQL com este comando:
mysql -u root -p
Então eu criei uma nova conta de usuário com o host % %.
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Concedeu todos os privilégios à conta do usuário:
grant all privileges on *.* to 'bill'@'%' with grant option;
Então eu saio do usuário root e tento entrar com a conta:
mysql -u bill -p
introduziu a palavra-passe correcta e obteve este erro:
ERROR 1045 (28000): Acesso negado para usuário 'bill'@'localhost' (usando senha: SIM)
Quando você correu
mysql -u bill -p
e cometeu este erro
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
mysqld está esperando que você se conecte como bill@localhost
.
Tente criar 'bill@localhost'.
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
Se você quiser se conectar remotamente, você deve especificar o nome DNS, o IP público ou 127.0.0.1 usando TCP/IP:
mysql -u bill -p [email protected]
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP
Uma vez conectado, por favor, execute isto
SELECT USER(),CURRENT_USER();
USER() relata como você tentou autenticar no MySQL
CURRENT_USER() relata como foi permitido autenticar no MySQL a partir da tabela **mysql.user***
Isto lhe dará uma melhor visão de como e porque você foi autorizado a fazer login no mysql. Por que esta visão é importante de saber? Tem a ver com o protocolo de ordenação de autenticação do usuário.
Aqui está um exemplo: Vou criar um utilizador anónimo no meu desktop MySQL
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)
mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| x | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| | % |
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql>
OK, vejam-me entrar como utilizador anónimo:
C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select user(),current_user();
+---------------+----------------+
| user() | current_user() |
+---------------+----------------+
| rol@localhost | @% |
+---------------+----------------+
1 row in set (0.00 sec)
mysql>
O pedido de autenticação é muito rigoroso. Ele verifica do mais específico ao menos. Eu escrevi sobre este estilo de autenticação no DBA StackExchange.
Don'não se esqueça de chamar explicitamente o TCP como o protocolo para o cliente mysql quando necessário.
Quando você digita mysql -u root -p
, você're conectando ao servidor mysql através de um soquete unix local.
No entanto, a concessão que você deu, 'bill'@'%'
só combina com conexões TCP/IP curiosamente.
Se você quiser conceder acesso ao soquete unix local, você precisa conceder privilégios para 'bill'@'localhost' , o que curiosamente não é o mesmo que 'bill'@'127.0.0.1'
Você também pode conectar utilizando TCP/IP com o cliente de linha de comando mysql, como para combinar com os privilégios que você já concedeu, por exemplo, execute mysql -u root -p -h 192.168.1.123
ou qualquer endereço IP local que sua caixa tenha.