主机“ xxx.xx.xxx.xxx”不允许连接到该MySQL服务器


667

这本来应该很简单,但是我无法让它在我的一生中发挥作用。
我只是想远程连接到我的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用户身份登录
。.– AO_

Answers:


815

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

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'插入一个新条目,认为这允许您指定本地主机从同一台计算机进行连接。这样做不起作用的原因是,默认特权包括Host ='localhost'和User =''的条目。由于该条目的主机值'localhost'比'%'更具体,因此从localhost连接时,它优先于新条目使用!正确的过程是使用Host ='localhost'和User ='some_user'插入第二个条目,或使用Host ='localhost'和User =''删除条目。删除条目后,请记住发出FLUSH PRIVILEGES语句以重新加载授权表。另请参见第5.4.4节“访问控制,阶段1:连接验证”。


17
不错,Yannick,但是我不建议他将所有特权授予非root用户。也许减少套?
科里·巴卢

3
好吧,这的确不是一个好主意,但是允许“ root”从所有主机进行连接是完全相同的,因为它具有相同的特权级别。
Yannick Motton,2009年

2
我想你想念我的观点Pascal。关键是“ root”用户已经拥有这些权限,并且他想让任何ip作为该用户进行身份验证。因此,如果这确实是他想要的,那么创建新管理员用户(具有完全相同的权限)的默认示例是他尝试的替代方法。
Yannick Motton,2009年

2
是的,Yannick,我读得很快,将删除我的评论。但是,AFAIK的权限在MySQL中工作正常,因此:1.也许OP手动修改了授权表,然后需要刷新特权。2.也许他没有为root使用正确的授权语法。添加另一个管理用户可能是一种解决方法,但不能解决IMHO的实际问题。
Pascal Thivent 09年

1
我觉得提供所有主机到root的访问权限都不是正确的解决方案。取而代之的是,我创建了一个新用户并授予了减少的特权集,而我使用的特权集在MySQL Workbench上称为“ DBManager”。我还只允许来自本地网络中特定主机组的访问,特别是192.168.0。%
Gustavo Guevara 2014年

271

必须通过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;

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


5
完成上述步骤后,必须重新启动mysql才能为我工作。
收费站,2015年

您必须创建username @ localhost吗?仅创建username @%还不够吗?我的意思是,如果仅创建username @%,将无法从本地主机与该用户建立连接?
Sorin Postelnicu

1
是的@localhost,如果特权有所不同,则创建a 有意义,但是在这里它们是相同的,它可能比任何东西都更加令人困惑(例如,更改一个密码时没有意识到另一个密码的存在,并且您的登录名可能会撞到那个密码) )。
布拉奇利

作为一个初学者,它确实帮助了我
Muhammad Nayab '19

1
感谢它解决了我在Windows容器化laravel应用程序中的“ SQLSTATE [HY000] [1130]主机'DESKTOP-xxx.xx'不允许连接到此MariaDB服务器”
Zulqarnain

117

我的错误消息是类似的,并且说即使我使用root,也不允许主机XXX连接到该MySQL服务器 ”。这是确保root拥有正确权限的方法。

我的设置

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

  1. 在“ etc / mysql / my.cnf”下打开文件
  2. 检查:

    • 端口(默认为“端口= 3306”)
    • 绑定地址(默认情况下为'bind-address = 127.0.0.1';如果您想向所有人开放,则只需注释掉此行。对于我的示例,我会说实际的服务器位于10.1.1.7上)
  3. 现在,在实际服务器上访问MySQL数据库(例如,以用户“ root”的身份在端口3306处的远程地址为123.123.123.123,并且我想更改对数据库“ 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,并输入“主机名:10.1.1.7”,“端口:3306”,“用户名:root”

1
您可以跳过这一use dataentry行(因为大多数人不会创建该数据库)。
杰迪贾2015年

3
我能够做到这一点而无需mysql在最后重启服务
Ryan Tuck

5
FLUSH PRIVILEGES应该允许您不需要重新启动。
亚当B

这适用于Windows 10上带有FLUSH PRIVILEGES的MySQL 5.5,而无需重新启动服务。在Windows上,服务的属性应标识用于配置的my.ini文件(属性|常规|可执行文件的路径)
FreeText

我假设通过指定bind-address =“ 0.0.0.0”,它将在所有接口上侦听,并且可以进行远程连接,但是我错了。是的,netstat显示mysql正在侦听0.0.0.0(所有接口),但是我在问题标题中遇到了错误。一旦我完全删除了绑定地址行,它便开始工作。奇怪的。
Henno

71

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

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

转到特权>添加新用户

在此处输入图片说明

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

在此处输入图片说明


65

只需执行以下步骤:

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

mysql -uroot -p

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

kubectl exec -it [pod-name] -- /bin/bash
mysql -uroot -p

2)创建用户

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

3)授予权限

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

4)冲洗特权

FLUSH PRIVILEGES;

3
错误1045(28000):对用户'root'@'localhost'的访问被拒绝(使用passwoYES)Y
Gank

11
应该 *。* ?
sgarg '16

26

该消息*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>FROM MySQL服务器。如果这不起作用,则DNS服务器中没有任何条目。另外,您可以在MySQL服务器的HOSTS文件中放置一个条目(<ipaddress> <fullyqualifiedhostname> <hostname><-此处的顺序可能很重要)。

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


1
“是从MySQL服务器到MySQL客户端的答复。” 谢谢,我想知道错误是从哪里来的,我的机器还是服务器。我有错误“ERROR 1130(HY000):”等等
PJ深色

20

简单方法:

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

然后

FLUSH PRIVILEGES;

完成了!


%代表什么?
dataviews

1
就像一切。您可以像例子一样:WHERE CustomerName LIKE 'a%'-查找以“ a”开头的任何值
user5510975

16

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

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


4

只需使用MySql的GUI工具(SQLyog)提供的接口即可:

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

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

在此处输入图片说明


4

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

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

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

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


3

一种简单的方法是使用根帐户登录phpmyadmin,转到mysql数据库并选择用户表,然后编辑根帐户,并在主机字段中添加%通配符。然后通过ssh flush特权

 FLUSH PRIVILEGES;

这帮助我结合了这一点:授予所有特权使用授予选项“ root” @“%”;
Lanklaas

2

如果这是最近安装的mysql,则在更改任何其他内容之前,请尝试简单地执行以下命令,然后重试:

flush privileges;

仅此一项就为我在Ubuntu 16.04,mysql 5.7.20上解决了该问题。YMMV。


2

只需从托管控制面板中找到更好的方法即可(我在这里使用DirectAdmin)

只需转到控制面板中的目标服务器数据库,就我而言:MySQL管理->选择您的数据库->您会发现:“访问主机”,只需在此处添加远程主机,它就可以正常工作! 在此处输入图片说明

我猜想其他C.panels(如plesk等)上也有类似的选择。

希望对您也有帮助。


2

好吧,以上答案对我没有任何作用。经过大量研究,我找到了解决方案。尽管我可能会迟到,但这可能会在将来对其他人有所帮助。

从终端登录到您的SQL Server

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

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

解决错误之前

解决问题后

编码愉快!!


1

好吧,您可以做的就是打开mysql.cfg文件,然后将Bind-address更改为此

绑定地址= 127.0.0.1

然后重新启动mysql,您将能够将该服务器连接到该服务器。

看这你可以有想法的形式。

这是真正的溶胶


3
这是相关的,但不是相同的问题。最初收到的错误表明客户端已成功连接到MySQL服务器,但是认证失败。如果将bind-address设置为127.0.0.1,则会收到连接被拒绝的错误。
轴突2014年

但这是允许所有主机连接到服务器的地址吗?
Kishan Bheemajiyani 2014年

但是,如果您有客户端用户并且不允许您创建具有所有权限的用户,那么向该用户授予所有权限将不是该bcoz的明智选择,那么解决方案是什么?
Kishan Bheemajiyani 2014年

1

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


1

如果您有WAMP Server + Windows 10,并且正在使用它进行开发,则右键单击Wamp图标=> Wamp Settings=>Check Allow Virtual Hosts other than 127* 在此处输入图片说明


0

我也面临着同样的问题。我在2分钟内为我解决了该问题,我只是通过cpanel将IP列入白名单

假设您正在尝试从服务器A连接服务器B的数据库。转到服务器B Cpanel->远程MySQL->输入服务器A IP地址,仅此而已。


0

这个答案可能会帮助某人...

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

我在另一个端口上运行的docker容器中运行mysql。我指的是主机端口3306上的主机,该主机上正在运行mysql服务器。我的容器在端口33060上暴露了服务器。因此,所有这些时间,我一直在寻找错误的服务器!h!



0

CPANEL解决方案

转到Cpanel,查找“远程MySQL”。在输入字段中添加IP:

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

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


0

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

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

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

    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

-1

面对这个问题的某人从SQLyog内部遇到此问题的机会极少,这发生了:

我已经连接到远程数据库(从SQLyog内部)并工作了几个小时。之后,我离开系统几分钟,然后回来继续我的工作- 错误1130!我没有尝试过的工作;重新启动SQLyog不能解决它。然后,我重新启动了系统-它仍然无法正常工作。

所以我尝试从终端进行连接-它起作用了。然后在SQLyog上重试它。除了“随机计算机古怪”之外,我无法解释它,但我认为这可能会对某人有所帮助。


-1

如果您在不定义连接字符串的情况下尝试执行mysql查询,则会收到此错误。

可能您在执行之前就放弃定义连接字符串。你检查了吗?(对不起,英语不好)


-1

问题: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帐户也可以使用。


-1

这为DirectAdmin工作;

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

完了 现在,您可以通过your_database_username&访问该数据库your_database_password
很简单!


-3

对于我而言,此处的所有答案均无效,因此,我请您这样做,将来可能会对其他用户有所帮助。这也可能是我们代码中的问题,而不仅仅是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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.