主机'xxx.xx.xxx.xxx'不允许连接到此MySQL服务器

con*_*t47 624 mysql mysql-error-1130

这应该是死的简单,但我不能让它为我的生活工作.
我只是想远程连接到我的MySQL服务器.

连接为

mysql -u root -h localhost -p  
Run Code Online (Sandbox Code Playgroud)

工作正常,但尝试

mysql -u root -h 'any ip address here' -p
Run Code Online (Sandbox Code Playgroud)

因错误而失败

ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server
Run Code Online (Sandbox Code Playgroud)

mysql.user表中,主机'localhost'的用户'root'与主机'%'的另一个条目完全相同.

我在我的智慧结束,并不知道如何继续.欢迎任何想法.

Yan*_*ton 753

可能是安全预防措施.您可以尝试添加新的管理员帐户:

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

虽然Pascal和其他人已经注意到让具有这种访问权限的用户对任何IP开放都不是一个好主意.如果需要管理用户,请使用root,并将其保留在localhost上.对于任何其他操作,请指定您需要的权限,并限制用户的可访问性,如Pascal在下面建议的那样.

编辑:

来自MySQL FAQ:

如果您无法弄清楚拒绝访问的原因,请从用户表中删除所有包含通配符的Host值的条目(包含'%'或'_'字符的条目).一个非常常见的错误是插入一个新的条目,其中Host ='%'和User ='some_user',认为这允许您指定localhost从同一台机器连接.这不起作用的原因是默认权限包括Host ='localhost'和User =''的条目.因为该条目具有比'%'更具体的主机值'localhost',所以当从localhost连接时,它优先于新条目使用!正确的过程是插入第二个条目,其中Host ='localhost'和User ='some_user',或删除具有Host ='localhost'和User =''的条目.删除条目后,请记住发出FLUSH PRIVILEGES语句以重新加载授权表.另请参见第5.4.4节"访问控制,第1阶段:连接验证".

  • 很好的抓住Yannick,但我不建议他授予非root用户所有权限.也许减少了一套? (17认同)
  • 嗯,这确实不是一个好主意,但允许'root'从所有主机连接是完全相同的,因为它处于相同的权限级别. (3认同)
  • 我认为提供所有主机对 root 的访问并不是一个合适的解决方案。相反,我创建了一个新用户并授予了一组减少的权限,我使用的权限集在 MySQL Workbench 上被描述为“DBManager”。我还只允许本地网络中的特定主机组进行访问,特别是 192.168.0.% (3认同)
  • 我想你错过了我的观点Pascal.关键是'root'用户已经具有这些权限,并且他想让任何ip认证为该用户.因此,如果这真的是他想要的,那么创建新管理员用户(具有完全相同的权限)的默认示例是他正在尝试的替代方案. (2认同)
  • 那是对的Yannick,我快速阅读并将删除我的评论.但是,AFAIK,MySQL的权限工作正常如此:1.也许OP手动修改了授权表,然后需要刷新权限.2.也许他没有为root使用适当的授权语法.添加另一个管理用户可能是一种解决方法,但它不会解决真正的问题恕我直言. (2认同)
  • 谢谢。使用 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 帮助我解决了错误 (2认同)
  • 不要忘记``FLUSH PRIVILEGES;```来应用更改 (2认同)

Adi*_*att 251

必须通过phpMyAdmin或命令提示符创建一个new MySQL User并分配如下所示的权限Query prompt:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

完成所有四个查询后,它应该连接 username / password

  • 完成上述步骤后,必须重新启动mysql才能为我工作. (4认同)

Wil*_*ill 108

我的错误消息类似,并说即使我使用root,' 主机XXX也不允许连接到此MySQL服务器 '.以下是确保root具有正确权限的方法.

我的设置:

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

  1. 打开'etc/mysql/my.cnf'下的文件
  2. 检查:

    • 端口(默认为'port = 3306')
    • bind-address(默认情况下,这是'bind-address = 127.0.0.1';如果你想打开所有,那么只需注释掉这一行.对于我的例子,我会说实际的服务器是在10.1.1.7)
  3. 现在访问实际服务器上的MySQL数据库(假设您的远程地址是123.123.123.123,端口3306为用户'root',我想更改数据库'dataentry'的权限.请记住更改IP地址,端口和数据库名称到你的设置)

    mysql -u root -p
    Enter password: <enter password>
    mysql>GRANT ALL ON *.* to root@'123.123.123.123' IDENTIFIED BY 'put-your-password';
    mysql>FLUSH PRIVILEGES;
    mysql>exit
    
    Run Code Online (Sandbox Code Playgroud)
  4. sudo service mysqld restart

  5. 您现在应该能够远程连接到您的数据库.例如,我正在使用MySQL Workbench并输入'Hostname:10.1.1.7','Port:3306','Username:root'

  • `FLUSH PRIVILEGES`应该允许您不需要重新启动. (5认同)
  • 我能够在不重新启动`mysql`服务的情况下完成此操作 (3认同)

Him*_*der 67

您需要从任何主机名授予对用户的访问权限.

这是您从phpmyadmin添加新权限的方式

转到权限>添加新用户

在此输入图像描述

选择任意主机以获取所需的用户名

在此输入图像描述

  • cli命令会做什么? (5认同)

min*_*s23 59

只需执行以下步骤:

1)连接到mysql

mysql -uroot -p
Run Code Online (Sandbox Code Playgroud)

2)创建用户

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

3)授予权限

 GRANT ALL PRIVILEGES ON \*.\* TO 'user'@'%' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

4)冲洗特权

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

  • 应该 \*.\*? (11认同)
  • ERROR 1045(28000):用户'root'@'localhost'拒绝访问(使用passwoYES)Y (3认同)

Den*_*lin 25

该消息*Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server是MySQL服务器对MySQL客户端的回复.注意它是如何返回IP地址而不是主机名.

如果您尝试连接mysql -h<hostname> -u<somebody> -p并且它使用IP地址返回此消息,则MySQL服务器无法在客户端上执行反向查找.这很关键,因为它是如何将MySQL客户端映射到授权的.

确保您可以nslookup <mysqlclient>从MySQL服务器执行此操作.如果这不起作用,那么DNS服务器中没有条目.或者,您可以在MySQL服务器的HOSTS文件中放入一个条目(<ipaddress> <fullyqualifiedhostname> <hostname>< - 此处的顺序可能很重要).

我的服务器主机文件中的一个条目允许反向查找MySQL客户端解决了这个问题.


use*_*975 17

简单方法:

Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 
Run Code Online (Sandbox Code Playgroud)

然后

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

完成了!


Pas*_*ent 16

如果手动修改授权表(使用INSERT,UPDATE等),则应执行FLUSH PRIVILEGES语句以告知服务器重新加载授权表.

PS:我不建议允许任何主机连接任何用户(特别是不root使用).如果您将mysql用于客户端/服务器应用程序,则更喜欢子网地址.如果您将mysql与Web服务器或应用程序服务器一起使用,请使用特定的IP.


sou*_*ARI 11

这适用于任何未来的远程 mysql 连接!

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Run Code Online (Sandbox Code Playgroud)

导航到以 bind-address 指令开头的行。它应该是这样的:

    bind-address            = 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

以 root 终端登录到您的 mysql

    mysql -u root -p
    -- root password

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

    CREATE USER 'username'@'%' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    EXIT;
Run Code Online (Sandbox Code Playgroud)

最后使用以下命令授予该机器独占权限以远程连接到数据库。

    sudo ufw allow from remote_IP_address to any port 3306
Run Code Online (Sandbox Code Playgroud)


Bab*_*New 8

如果您使用 MySQL WorkBench,则可以轻松实现此目的:

  1. 从菜单中选择服务器 -> 用户和权限 在此输入图像描述

  2. 点击左下角的“添加帐户” 在此输入图像描述

  3. 在表单中填写用户名、匹配的主机(% 表示每个主机)和密码 在此输入图像描述

  4. 点击右下角的“应用” 在此输入图像描述

之后你就可以出发了。然后,如果您想优化配置,可以使用“管理角色”选项卡来设置用户可以使用的命令(SELECT、ALTER 等),并使用“架构权限”选项卡来限制用户交互具体模式。


Bab*_*New 6

只需使用MySql的GUI工具(SQLyog)提供的界面:

点击用户管理器: 在此处输入图片说明

现在,如果您想为任何其他远程 PC 授予访问权限,只需确保如下图所示,Host 字段值为 %(这是通配符)

在此处输入图片说明


Eri*_*ane 5

这里的大多数答案都显示您创建具有两个主机值的用户:一个用于localhost,另一个用于%

请注意,除了 root 等内置本地用户之外,您不需要执行此操作。如果您只是想创建一个可以从任何地方登录的新用户,您可以使用

CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;
Run Code Online (Sandbox Code Playgroud)

它会工作得很好。(正如其他人提到的,向任何域的用户授予管理权限都是一个糟糕的主意。)