我刚刚在新机器上安装了 Ubuntu 10.04.2 LTS 的新副本。我以 root 身份登录 MySQL:
david@server1:~$ mysql -u root -p123
Run Code Online (Sandbox Code Playgroud)
我创建了一个名为 repl 的新用户。我将主机留空,因此新用户可以从任何位置访问。
mysql> CREATE USER 'repl' IDENTIFIED BY '123';
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我检查了用户表以验证新用户 repl 是否正确创建。
mysql> select host, user, password from mysql.user;
+-----------+------------------+-------------------------------------------+
| host | user | password |
+-----------+------------------+-------------------------------------------+
| localhost | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| server1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| 127.0.0.1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| ::1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| localhost | | |
| server1 | | |
| localhost | debian-sys-maint | *27F00A6BAAE5070BCEF92DF91805028725C30188 |
| % | repl | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+-----------+------------------+-------------------------------------------+
8 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
然后我退出,尝试以用户 repl 登录,但访问被拒绝。
david@server1:~$ mysql -u repl -p123
ERROR 1045 (28000): Access denied for user 'repl'@'localhost' (using password: YES)
david@server1:~$ mysql -urepl -p123
ERROR 1045 (28000): Access denied for user 'repl'@'localhost' (using password: YES)
david@server1:~$
Run Code Online (Sandbox Code Playgroud)
为什么访问被拒绝?
您无法登录的原因repl@'%'
与MySQL 的用户身份验证协议有关。它没有像人们相信的那样涵盖用户模式。
看看你是如何尝试登录的
mysql -u repl -p123
Run Code Online (Sandbox Code Playgroud)
由于您没有指定 IP 地址,mysql 假定主机是 localhost 并尝试通过套接字文件进行连接。这就是错误消息显示的原因Access denied for user 'repl'@'localhost' (using password: YES)
。
人们会认为repl@'%'
会允许repl@localhost
。根据MySQL 执行用户身份验证的方式,这将永远不会发生。这样做有帮助吗?
mysql -u repl -p123 -h127.0.0.1
Run Code Online (Sandbox Code Playgroud)
信不信由你,mysql 会repl@localhost
再次尝试。为什么?mysql 客户端看到127.0.0.1
并再次尝试套接字文件。
像这样尝试:
mysql -u repl -p123 -h127.0.0.1 --protocol=tcp
Run Code Online (Sandbox Code Playgroud)
这将强制 mysql 客户端明确使用 TCP/IP 协议。那么它就别无选择,只能交给 user repl@'%'
。
您应该针对特定于它的本地主机发出问题。
GRANT USAGE ON *.* TO 'repl'@'localhost' IDENTIFIED BY '123';
Run Code Online (Sandbox Code Playgroud)
并尝试连接。