【问题标题】:Host 'xxx.xx.xxx.xxx' is not allowed to connect to this MySQL server主机 'xxx.xx.xxx.xxx' 不允许连接到这个 MySQL 服务器
【发布时间】:2017-10-09 23:49:09
【问题描述】:

这应该很简单,但我无法让它为我的一生工作。
我只是想远程连接到我的 MySQL 服务器。

  • 连接为:
    mysql -u root -h localhost -p  
  • 工作正常,但正在尝试:
    mysql -u root -h 'any ip address here' -p
  • 失败并出现错误:
    ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server

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

我束手无策,不知道如何进行。 欢迎任何想法。

【问题讨论】:

  • 出于安全考虑,在大多数情况下无法以 root 身份登录..

标签: mysql mysql-error-1130


【解决方案1】:

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

  1. 从菜单中选择服务器 -> 用户和权限

  2. 在左下角,点击“添加帐户”

  3. 用用户名、主机匹配(% 表示每个主机)和密码填写表格

  4. 点击右下角的“应用”

在这之后你就可以走了。然后,如果要优化配置,可以使用“管理角色”选项卡设置用户可以使用的命令(SELECT、ALTER 等)和“架构权限”选项卡将用户交互限制为特定的架构。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,我在 2 分钟内解决了我只是通过 cpanel 将 ip 列入白名单

    假设您正在尝试从服务器 A 连接服务器 B 的数据库。 转到Server B Cpanel->Remote MySQL->输入Server A IP地址就可以了。

    【讨论】:

      【解决方案3】:

      只需执行以下步骤:

      1a) 连接到 mysql(通过 localhost)

      mysql -uroot -p
      

      1b) 如果 mysql 服务器在 Kubernetes (K8s) 中运行并通过 NodePort 访问

      kubectl exec -it [pod-name] -- /bin/bash
      mysql -uroot -p
      
      1. 创建用户

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

      2. 授予权限

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

      3. 刷新权限

        FLUSH PRIVILEGES;

      【讨论】:

      • ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwoYES)Y
      • 应该 \*.\* 是 *.* 吗?
      • 这也适用于 docker 的类似问题吗? devops.stackexchange.com/q/12449/23443
      • mysql docker容器怎么办?
      【解决方案4】:

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

          sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
      

      导航到以绑定地址指令开头的行。它应该是这样的:

          bind-address            = 0.0.0.0
      

      以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;
      

      最后通过以下命令授予该机器远程连接数据库的独占权限。

          sudo ufw allow from remote_IP_address to any port 3306
      

      【讨论】:

        【解决方案5】:

        如果你有 WAMP Server + Windows 10 并且你将它用于开发而不是右键单击 Wamp 图标 => Wamp Settings => Check Allow Virtual Hosts other than 127*

        【讨论】:

          【解决方案6】:

          嗯,以上答案对我没有任何帮助。经过大量研究,我找到了解决方案。虽然我可能会迟到,但这可能会帮助其他人。

          从终端登录到您的 SQL 服务器

           mysql -u root -p
           -- root password
          GRANT ALL ON *.* to root@'XX.XXX.XXX.XX' IDENTIFIED BY 'password';
          

          这应该可以解决权限问题。

          编码愉快!!

          【讨论】:

            【解决方案7】:

            CPANEL 解决方案

            转到 Cpanel,查找 Remote MySQL。 在输入字段中添加 IP:

            主机(允许使用 % 通配符)

            评论以记住IP是什么。 对我来说就是这样。

            【讨论】:

              【解决方案8】:
              CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
              FLUSH PRIVILEGES;
              

              这个错误是因为没有root密码,当你尝试从外部连接时,这可能发生在你身上。

              【讨论】:

                【解决方案9】:

                这适用于 DirectAdmin

                1. 转到您的DirectAdmin
                2. 转到您的MySQL Management
                3. 选择您的database
                4. Accesse Host 选项卡下,有一个字段。 您应该使用xxx.xx.xxx.xx 填写此字段。
                5. 点击Add Host

                完成。现在您可以通过 your_database_usernameyour_database_password 访问此数据库。
                如此简单!

                【讨论】:

                  【解决方案10】:

                  简单的方法:

                  Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 
                  

                  然后

                  FLUSH PRIVILEGES;
                  

                  完成!

                  【讨论】:

                  • % 表示什么?
                  • 一切都一样。您可以像示例:WHERE CustomerName LIKE 'a%' - 查找以“a”开头的任何值
                  【解决方案11】:

                  我的错误信息类似,说“Host XXX is not allowed to connect to this MySQL server”,即使我使用的是 root。以下是确保 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
                    
                  4. sudo 服务 mysqld 重启

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

                  【讨论】:

                  • 您可以跳过use dataentry 行(因为大多数人不会创建该数据库)。
                  • 我能够做到这一点,而无需在最后重新启动 mysql 服务
                  • FLUSH PRIVILEGES 应该让你不需要重新启动。
                  • 这对我来说适用于具有 FLUSH PRIVILEGES 的 Windows 10 上的 MySQL 5.5,无需重新启动服务。在 Windows 上,服务的属性应该标识用于配置的 my.ini 文件(属性 | 常规 | 可执行文件的路径)
                  • 我假设通过指定 bind-address="0.0.0.0" 它会监听所有接口并且远程连接会起作用,但我错了。是的,netstat 显示 mysql 正在侦听 0.0.0.0(所有接口),但我在问题标题中收到错误消息。一旦我完全删除了绑定地址行,它就开始工作了。很奇怪。
                  【解决方案12】:

                  只需从您的主机控制面板中找到更好的方法(我在这里使用 DirectAdmin)

                  只需转到控制面板中的目标服务器数据库,在我的例子中: MySQL管理->选择您的数据库->您会发现:“访问主机”,只需在此处添加您的远程主机即可!

                  我猜想在 plesk 等其他 C.panels 上也有类似的选项。

                  希望对你也有帮助。

                  【讨论】:

                    【解决方案13】:

                    这个答案可能对某人有所帮助......

                    所有这些答案都没有帮助,然后我意识到我忘了检查一件关键的事情.. 端口 :)

                    我在另一个端口上运行的 docker 容器中运行 mysql。我在端口 3306 上指向我的主机,我有一个 mysql 服务器在其上运行。我的容器在端口 33060 上公开了服务器。所以一直以来,我都在看错误的服务器!呵呵!

                    【讨论】:

                      【解决方案14】:

                      问题:root@localhost 无法连接到 openSUSE 42.2-1.150.x86_64 上全新安装的 mysql-community-server。 Mysql 拒绝连接 - 句号。

                      解决方案:

                      $ ls -l /var/lib/mysql/mysql/user.*
                      -rw-rw---- 1 mysql mysql     0 Apr 29 19:44 /var/lib/mysql/mysql/user.MYD
                      -rw-rw---- 1 mysql mysql  1024 Apr 29 19:44 /var/lib/mysql/mysql/user.MYI
                      -rw-rw---- 1 mysql mysql 10684 Apr 29 19:44 /var/lib/mysql/mysql/user.frm
                      

                      文件 user.MYD 的大小为 0(真的吗?!)。 我从另一个工作系统复制了所有 3 个文件。

                      $ /usr/sbin/rcmysql stop
                      $ cd /var/lib/mysql/mysql/
                      $ scp root@othersytem:/var/lib/mysql/mysql/user.* ./
                      $ /usr/sbin/rcmysql start
                      $ cd -
                      $ mysql -u root -p
                      

                      我能够登录。然后,只需重新应用所有架构权限即可。 此外,如果您禁用了 IPv6,请暂时重新启用它,以便 root@::1 帐户也可以工作。

                      【讨论】:

                        【解决方案15】:

                        如果这是最近安装的 mysql,那么在更改任何其他内容之前,请尝试执行此命令,然后重试:

                        flush privileges;
                        

                        仅此一项就解决了我在 Ubuntu 16.04、mysql 5.7.20 上的问题。 YMMV。

                        【讨论】:

                          【解决方案16】:

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

                          请注意,除了像 root 这样的内置 localhost 用户外,您不需要这样做。如果您只是想创建一个可以从任何地方登录的新用户,您可以使用

                          CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
                          GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;
                          

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

                          【讨论】:

                            【解决方案17】:

                            只需使用MySql的GUI Tool(SQLyog)提供的界面即可:

                            点击用户管理器:

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

                            【讨论】:

                              【解决方案18】:

                              如果您碰巧在 Windows 上运行;一个简单的解决方案是运行 MySQL 服务器实例配置向导。它位于开始菜单中的 MYSQL 组中。在倒数第二个屏幕上,单击“允许从远程计算机进行 root 访问”框。

                              【讨论】:

                                【解决方案19】:

                                简单的方法是用root帐户登录phpmyadmin,进入mysql数据库并选择用户表,编辑root帐户并在主机字段中添加%通配符。然后通过 ssh 刷新权限

                                 FLUSH PRIVILEGES;
                                

                                【讨论】:

                                • 这帮助我结合了这个:GRANT ALL PRIVILEGES ON . TO 'root'@'%' WITH GRANT OPTION;
                                【解决方案20】:

                                这里的所有答案都不适用于我的情况,所以我来宾这可能会在未来帮助其他用户。这也可能是我们代码中的问题,而不仅仅是 MySQL 中的问题。

                                如果您使用的是VB.NET

                                代替这段代码:

                                 Dim server As String = My.Settings.DB_Server
                                 Dim username As String = My.Settings.DB_Username
                                 Dim password As String = My.Settings.DB_Password
                                 Dim database As String = My.Settings.DB_Database
                                
                                 MysqlConn.ConnectionString = "server=" & server & ";" _
                                 & "user id=" & username & ";" _
                                 & "password=" & password & ";" _
                                 & "database=" & database
                                
                                 MysqlConn = New MySqlConnection()
                                

                                您需要将MysqlConn = New MySqlConnection() 移动到第一行。所以会是这样的

                                 MysqlConn = New MySqlConnection()
                                
                                 Dim server As String = My.Settings.DB_Server
                                 Dim username As String = My.Settings.DB_Username
                                 Dim password As String = My.Settings.DB_Password
                                 Dim database As String = My.Settings.DB_Database
                                
                                 MysqlConn.ConnectionString = "server=" & server & ";" _
                                 & "user id=" & username & ";" _
                                 & "password=" & password & ";" _
                                 & "database=" & database
                                

                                【讨论】:

                                • 在回答之前先正确阅读问题。您的回答无关紧要,根本没有帮助!
                                【解决方案21】:

                                如果你试图在没有定义连接字符串的情况下执行 mysql 查询,你会得到这个错误。

                                您可能忘记在执行之前定义连接字符串。你检查过吗? (抱歉英语不好)

                                【讨论】:

                                  【解决方案22】:

                                  必须创建一个new MySQL User 并通过 phpMyAdmin 或命令提示符在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;
                                  

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

                                  【讨论】:

                                  • 在完成上述步骤后必须重新启动 mysql 才能为我工作。
                                  • 你必须创建 username@localhost 吗?只创建 username@% 还不够吗?我的意思是,如果你只是创建 username@%,你会无法从 localhost 连接到该用户吗?
                                  • 是的,如果权限以某种方式不同,那么创建@localhost 是有意义的,但在这里它们是相同的,并且可能会比任何事情都更令人困惑(例如在没有意识到的情况下更改密码)其他存在,并且您的登录可能正在点击那个)。
                                  • 作为一个初学者,它真的帮助了我
                                  • 感谢它解决了我在 windows 容器化 laravel 应用程序中的“SQLSTATE[HY000] [1130] 主机 'DESKTOP-xxx.xx' 不允许连接到这个 MariaDB 服务器”
                                  【解决方案23】:

                                  你可以做的就是打开 mysql.cfg 文件,你必须将 Bind-address 更改为此

                                  绑定地址 = 127.0.0.1

                                  然后重启mysql,你就可以将该服务器连接到这个了。

                                  看这个你可以有想法。

                                  this is real sol

                                  【讨论】:

                                  • 这是相关的,但不是同一个问题。最初收到的错误表明客户端成功连接到 MySQL 服务器,但随后身份验证失败。如果 bind-address 设置为 127.0.0.1,则会收到连接被拒绝错误。
                                  • 但这是允许所有主机连接到服务器的地址吗?
                                  • 但是如果你有客户端用户并且你不允许创建具有所有权限的用户,那么授予用户所有权限对于那个 bcoz 来说不是明智的选择,那么解决方案是什么。?跨度>
                                  【解决方案24】:

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

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

                                  转到权限 > 添加新用户

                                  为所需的用户名选择任何主机

                                  【讨论】:

                                  • 先生!非常感谢您的回答,它对我有用;简单快捷!
                                  • 我认为这需要添加到 MAMP for Mac 帮助文件中。 2021 年仍然有效
                                  【解决方案25】:

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

                                  如果您尝试与mysql -h&lt;hostname&gt; -u&lt;somebody&gt; -p 连接,并且它返回此消息和 IP 地址,则 MySQL 服务器无法在客户端上进行反向查找。这很关键,因为这就是它将 MySQL 客户端映射到授权的方式。

                                  确保您可以从 MySQL 服务器执行nslookup &lt;mysqlclient&gt;。如果这不起作用,则 DNS 服务器中没有条目。或者,您可以在 MySQL 服务器的 HOSTS 文件中添加一个条目(&lt;ipaddress&gt; &lt;fullyqualifiedhostname&gt; &lt;hostname&gt;

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

                                  【讨论】:

                                  • "是 MySQL 服务器对 MySQL 客户端的回复。"谢谢,我想知道错误来自哪里,我的机器或服务器。我有错误“ERROR 1130 (HY000):”等。
                                  【解决方案26】:

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

                                  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;
                                  

                                  尽管 Pascal 和其他人已经指出,让具有这种访问权限的用户对任何 IP 开放并不是一个好主意。如果您需要管理用户,请使用 root,并将其保留在 localhost 上。对于任何其他操作,请准确指定您需要的权限,并按照 Pascal 的建议限制用户的可访问性。

                                  编辑:

                                  来自 MySQL 常见问题解答:

                                  如果你不知道为什么会得到 访问被拒绝,从用户中删除 表所有具有主机的条目 包含通配符的值(条目 包含 '%' 或 '_' 字符)。一种 很常见的错误是插入一个新的 Host='%' 的条目和 user='some_user',认为这个 允许您指定 localhost 从同一台机器连接。这 这不起作用的原因是 默认权限包括 Host='localhost' 和 用户=''。因为那个条目有一个主机 价值'localhost'更多 比 '%' 具体,它用于 偏好新条目时 从本地主机连接!正确的 过程是插入第二个条目 使用 Host='localhost' 和 user='some_user',或者删除 Host='localhost' 和 用户=''。删除条目后, 记得发出 FLUSH PRIVILEGES 语句重新加载授权表。 另见第 5.4.4 节,“访问 控制,第一阶段:连接 验证”。

                                  【讨论】:

                                  • 很好地抓住了 Yannick,但我不建议他将所有权限授予非 root 用户。也许是简化集?
                                  • 嗯,这确实不是一个好主意,但允许“root”从所有主机连接是完全相同的,因为它处于相同的权限级别。
                                  • 我想你错过了我的观点帕斯卡。关键是“root”用户已经拥有这些权限,并且他想让任何 ip 作为该用户进行身份验证。因此,如果这确实是他想要的,那么创建新管理员用户(具有完全相同的权限)的默认示例是他正在尝试的替代方法。
                                  • 没错,Yannick,我读得很快,我会删除我的评论。但是,AFAIK,权限在 MySQL 中运行良好,因此: 1. 也许 OP 手动修改了授权表,然后需要刷新权限。 2. 也许他没有为 root 使用正确的授权语法。添加另一个管理用户可能是一种解决方法,但它不会解决真正的问题恕我直言。
                                  • 我觉得提供从所有主机到 root 的访问权限并不是一个合适的解决方案。相反,我创建了一个新用户并授予了一组减少的权限,我使用的一组在 MySQL Workbench 上被描述为“DBManager”。我也只允许本地网络中的特定主机组访问,特别是 192.168.0.%
                                  【解决方案27】:

                                  如果您手动修改授权表(使用 INSERT、UPDATE 等),您应该执行 FLUSH PRIVILEGES 语句告诉服务器重新加载授权表。

                                  PS:我不建议允许 any 主机为 any 用户连接(尤其是root 使用)。如果您将 mysql 用于客户端/服务器应用程序,则首选子网地址。如果您将 mysql 与 Web 服务器或应用程序服务器一起使用,请使用特定的 IP。

                                  【讨论】:

                                    猜你喜欢
                                    • 2012-11-12
                                    • 2012-06-07
                                    相关资源
                                    最近更新 更多