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

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

  • 连接为:

    mysql -u root -h localhost -p
  • 工作正常,但尝试:

    mysql -u root -h 'any ip address here' -p
  • 失败并出现错误:

    错误1130(00000):不允许主机xxx.xx.xxx.xxx连接到此MySQL服务器

mysql.user表中,用户“root”与主机“localhost”的条目与主机“%”的条目完全相同。

我束手无策,不知道如何继续。任何想法都欢迎

2295965 次浏览

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

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 FAQ:

如果你不明白为什么拒绝访问,从用户中删除表中包含Host的所有条目包含通配符的值(条目包含'%'或'_'字符)。A非常常见的错误是插入一个新的使用Host='%'和用户='some_user',认为这允许您指定localhost从同一台机器连接。The这不起作用的原因是默认权限包括使用Host='localhost'和User=".因为该条目有一个Host价值“localhost”更多特定于'%',它用于优先考虑新条目时从localhost!正确的过程是插入第二个条目使用Host='localhost'和User='some_user',或删除使用Host='localhost'和User="。删除条目后,记得发布一个FLUSH特权重新加载授权表的语句。参见第5.4.4节,“访问控制,阶段1:连接验证”。

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

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

消息*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客户端映射到授权的方式。

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

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

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

这是您如何从phpmyadmin添加新权限

Goto特权>添加新用户

输入图片描述

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

输入图片描述

必须创建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.cfg文件,你必须改变绑定地址

绑定地址=127.0.0.1

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

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

这是真正的溶胶

只需执行以下步骤:

  1. 连接到MySQL(通过localhost)

    mysql -uroot -p
    • 如果MySQL服务器在库伯内特斯(K8s)中运行并通过NodePort访问

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

    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  2. 授予权限

    GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
  3. 刷新权限

    FLUSH PRIVILEGES;

尽管我使用的是root,但我的错误消息类似并显示“主机XXX不允许连接到此MySQL服务器”。以下是如何确保root具有正确的权限。

我的圈套

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

解决方案

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

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

    mysql -u root -pEnter 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 service mysqld restart

  5. You should now be able to remote connect to your database. For example, I'm using MySQL Workbench and putting in 'Hostname:10.1.1.7', 'Port:3306', 'Username:root'

我也面临着同样的问题,它在2分钟内为我解决了我只是通过cPanel白名单ip

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

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

如果您正在使用VB.NET

而不是这段代码:

 Dim server As String = My.Settings.DB_ServerDim username As String = My.Settings.DB_UsernameDim password As String = My.Settings.DB_PasswordDim 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_ServerDim username As String = My.Settings.DB_UsernameDim password As String = My.Settings.DB_PasswordDim database As String = My.Settings.DB_Database
MysqlConn.ConnectionString = "server=" & server & ";" _& "user id=" & username & ";" _& "password=" & password & ";" _& "database=" & database

如果您尝试使用定义连接字符串执行mysql查询,您将收到此错误。

可能你forgat定义连接字符串执行前。你检查了吗?(英文不好)

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

 FLUSH PRIVILEGES;

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

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

点击用户管理器:输入图片描述

现在,如果您想为任何其他远程PC授予访问权限,只需确保,就像下面的图片一样,主机字段值为%(这是通配符)

在此处输入图片描述

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

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

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

并且它会很好地工作。(正如其他人所提到的,将管理权限授予来自任何域的用户是一个可怕的想法。)

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

flush privileges;

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

问题:root@localhost无法连接到openSUSE 42.2-1.150上的新安装的mysql社区服务器。x86_64。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.MYD0大小(真的吗?!)。我从另一个工作系统复制了所有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 帐户也可以工作。

这个答案可能会帮助一些人…

所有这些答案都没有帮助,然后我意识到我忘记检查一件至关重要的事情…端口:)

我在运行在不同端口上的docker容器中运行mysql。我指着我在端口3306上的主机,我在上面运行了一个mysql服务器。我的容器暴露了端口33060上的服务器。所以一直以来,我都找错服务器了!

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

在我的情况下,只需转到控制面板中的目标服务器DB:MySQL管理->选择您的数据库->您会发现:“访问主机”,只需在此处添加您的远程主机并立即工作!输入图片描述

我想在其他C.panels上也有类似的选择,比如plesk等。

我希望这对你也有帮助。

简单方法:

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

然后

FLUSH PRIVILEGES;

搞定!

账号管理员工作;

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

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

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

此错误是因为没有根密码,当您尝试从外部连接时,可能会发生此错误。

CPANEL溶液

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

主机(允许%通配符)

注释以记住这是什么IP。这就是我想要的

嗯,上面的答案对我没有任何作用。经过大量的研究,我找到了一个解决方案。虽然我可能会迟到,但这可能会在未来帮助其他人。

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

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

这应该解决了权限问题。

在解决错误之前

解决问题后

编码愉快!!

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

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

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

导航到以bind地址指令开头的行。它应该如下所示:

    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

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

  1. 从菜单中选择服务器->用户和特权输入图片描述

  2. 在左下方,点击添加帐户输入图片描述

  3. 填写用户名、主机匹配(%表示每个主机)和密码输入图片描述

  4. 点击右下角的应用输入图片描述

之后,您就可以开始了。然后,如果您想完善您的配置,您可以使用“管理角色”选项卡来设置用户可以使用的命令(SELECT、ALTER等)和“架构权限”选项卡来将用户交互限制为特定的架构。

1.从终端,将您连接到MySQL运行容器

docker exec -it your_container_name_or_id bash

2.在您的容器中,将您连接到MySQL数据库

mysql -u your_user -p

输入密码以连接到数据库。

3.执行此SQL脚本以列出所有现有数据库用户:

SELECT host, user FROM mysql.user;

结果将如下所示:

主机用户
127.0.0.1root
::1root
localhostmysql.sys
localhostroot

你应该添加一个新行:

主机用户
%root
CREATE USER 'username'@'%' IDENTIFIED BY 'password';GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;