我一直在试图弄清楚为什么当我尝试使用以下命令连接到 MySQL 服务器时不断出现此错误。
$~ mysql -u username -h SQLserver -p
Enter password:
ERROR 1045 (28000): Access denied for user 'username'@'myIP' (using password: YES)
我已完成以下操作:
防火墙中的端口已打开,否则我不会收到错误,它只会超时。MySQL
服务器未使用 skip-networking 或 bind-address
用户名运行,主机为“%”,我可以在本地连接,因此密码是正确的。
GRANT USAGE ON *.* TO username@% IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
我想知道是否有人有想法或之前遇到过这个问题并解决了它?如您所见,我能够在本地登录,但是当我尝试执行 -h server 时出现错误。
mysql> SELECT user(),Current_user();
+--------------------+----------------+
| user() | Current_user() |
+--------------------+----------------+
| username@localhost | username@% |
+--------------------+----------------+
1 row in set (0.00 sec)
评论结果:
mysql> select user, host from mysql.user where user='username';
+----------+------+
| user | host |
+----------+------+
| username | % |
+----------+------+
1 row in set (0.00 sec)
mysql> show grants for 'username';
+----------------------------------------------------------------------------------------------------------------+
| Grants for username@% |
+----------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY PASSWORD '*F42AD03PASSWORDHASHADF4021C86B' |
| GRANT ALL PRIVILEGES ON `DB2`.* TO 'username'@'%' |
+----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
答案1
我似乎从记忆深处回忆起,为了使“用户”@“%”起作用,还必须有一个“用户”@“localhost”。
尝试创建具有相同用户名的 localhost 主机用户。
但我也可能真的错了。
答案2
这可能超出了范围,但我宁愿永远不要让数据库监听公共端口,这可以帮助您避免这个问题。
我使用 [auto]ssh 设置了我需要的所有远程数据库,以监听机器的本地主机,我想访问数据库。这:
autossh N -f -L 3307:127.0.0.1:3306 yourserver
会将您服务器的 127.0.0.1:3306 端口绑定到您调用的机器的本地主机端口 3307。您甚至不需要 sudo 权限即可绑定此端口。
当您使用以下方式访问服务器时
mysql -u user -P 3307 -h 127.0.0.1 -p
您是远程主机上的“localhost”用户,不再需要'user'@'remote'
或'user'@'%'
指令。但不要使用
mysql -u user -P 3307 -h localhost -p
因为这样 mysql 客户端就会尝试连接到套接字,而我们还没有通过这种方式转发,因此无法访问。
虽然 SSH 在建立连接后速度很快,但您应该感觉不到任何开销。autossh
与 ssh 相比,它在断开连接后会无休止地尝试重新建立连接,而 ssh 则会终止。