启用远程MySQL连接:ERROR 1045(28000):拒绝用户访问

Mik*_*ain 131 mysql

在Windows XP上运行的MySQL 5.1.31.

本地 MySQL服务器(192.168.233.142)我可以以root身份连接如下:

>mysql --host=192.168.233.142 --user=root --password=redacted
Run Code Online (Sandbox Code Playgroud)

远程计算机(192.168.233.163),我可以看到mysql端口是打开的:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从远程计算机连接到mysql时,我会收到:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

我在mysql.user中只有2个条目:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]
Run Code Online (Sandbox Code Playgroud)

我还需要做些什么来启用远程访问?

编辑

正如下面的Paulo所建议的,我尝试用特定于IP的条目替换%的mysql.user条目,因此我的用户表现在看起来像这样:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]
Run Code Online (Sandbox Code Playgroud)

然后我重新启动了机器,但问题仍然存在.

小智 204

你必须把它作为root:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;
Run Code Online (Sandbox Code Playgroud)

;

其中IP是您要允许访问的IP,USERNAME是您用来连接的用户,PASSWORD是相关密码.

如果您想允许从任何IP访问%而不是您的IP

然后你只需要放

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

或者重新启动mysql服务器就是这样.

  • 答案中没有解释,但用帐户密码替换"PASSWORD".我尝试了上面只改变'USERNAME`和`IP`,直到我改变了'PASSWORD`它才对我起作用. (8认同)
  • http://stackoverflow.com/a/21151255/470749也帮助了我,因为我想我的绑定地址设置需要被注释掉.授予远程权限不足以让它发挥作用. (4认同)

小智 84

在授予远程访问权限之后我得到了相同的错误,直到我这样做:

/etc/mysql/my.cnf

在较新版本的mysql中,文件的位置是 /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

(注释此行:bind-address = 127.0.0.1)

然后跑service mysql restart.

  • 这工作完美.别忘了重启mysql. (13认同)
  • 或者,将其更改为bind-address = 0.0.0.0 (5认同)
  • 只注释掉`bind-address`对我来说不起作用.`bind-address = 0.0.0.0`或`bind-address = <server_ip>`有效. (2认同)

Rav*_*ant 56

默认情况下,MySQL服务器远程访问被禁用.提供对用户的远程访问的过程是.

  1. 转到我的sql bin文件夹或将其添加到 PATH
  2. 登录到root mysql -uroot -proot(或者根密码是什么.)
  3. 成功后你会得到 mysql>
  4. 为该用户提供所有授权访问权限.

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)

这里IP是你想允许远程访问的%IP地址,如果我们把任何IP地址都可以远程访问.

例:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.25 sec)
Run Code Online (Sandbox Code Playgroud)

这适用于其他用户.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助


Mik*_*ain 21

Paulo的帮助引导我找到解决方案.它是以下的组合:

  • 密码包含美元符号
  • 我试图从Linux shell连接

bash shell将美元符号视为扩展到环境变量的特殊字符,因此我们需要使用反斜杠对其进行转义.顺便说一下,在美元符号是密码的最后一个字符的情况下,我们不必这样做.

例如,如果您的密码是"pas $ word",那么从Linux bash我们必须按如下方式连接:

# mysql --host=192.168.233.142 --user=root --password=pas\$word
Run Code Online (Sandbox Code Playgroud)

  • 除上述内容外,请检查/etc/mysql/my.cnf并注释bind-address = 127.0.0.1 (4认同)
  • 或者,可以使用单引号来防止扩展$:`mysql --host = 192.168.233.142 --user = root --password ='pas $ word'` http://stackoverflow.com/a/6697781/500942 (2认同)

Vam*_*a B 8

你有防火墙吗?确保端口3306已打开.

在Windows上,默认情况下创建的mysql root帐户只允许从localhost访问,除非您在安装期间选择了从远程计算机启用访问的选项.

使用'%'作为主机名创建或更新所需的用户.

例如:

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)

  • 服务器回复"ERROR 1045(28000):访问被拒绝"...如果防火墙块将超时... (5认同)

Pau*_* H. 5

  1. 再试flush privileges一次。

  2. 尝试重新启动服务器以重新加载授权。

  3. 尝试创建一个主机为“ 192.168.233.163”的用户。“%”似乎不允许全部(很奇怪)

  • 尝试创建另一个用户,并且不要忘记设置所有授予:`CREATE USER'monty'@'%'IDENTIFIED BY'some_pass'; *。*将所有特权授予*。*到Monty'@'%',并提供格兰特选项;` (4认同)