782

这应该很简单,但我无法让它为我的生活工作。
我只是想远程连接到我的 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' 的条目与主机为 '%' 的另一个条目完全相同。

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

4

27 回答 27

973

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

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' 和 User='' 的条目。因为该条目的主机值“localhost”比“%”更具体,所以在从 localhost 连接时优先使用它而不是新条目!正确的程序是插入第二个条目,其中 Host='localhost' 和 User='some_user',或删除 Host='localhost' 和 User='' 的条目。删除条目后,请记住发出 FLUSH PRIVILEGES 语句以重新加载授权表。另见第 5.4.4 节,“访问控制,第 1 阶段:连接验证”。

于 2009-10-13T12:47:06.640 回答
336

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

于 2013-09-16T05:56:03.537 回答
130

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

我的设置

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

解决方案

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

    • 端口(默认为 'port = 3306')
    • 绑定地址(默认为 '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'
于 2014-06-11T19:31:34.580 回答
84

只需执行以下步骤:

1a)连接到mysql(通过本地主机)

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;

于 2014-03-24T09:27:50.980 回答
79

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

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

转到权限 > 添加新用户

在此处输入图像描述

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

在此处输入图像描述

于 2013-06-21T11:42:26.970 回答
30

该消息*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 客户端的条目解决了这个问题。

于 2012-03-13T13:37:26.997 回答
28

简单的方法:

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

然后

FLUSH PRIVILEGES;

完毕!

于 2018-11-24T08:05:40.633 回答
17

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

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

于 2009-10-13T12:56:36.890 回答
15

这适用于任何未来的远程 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
于 2020-06-03T13:14:40.483 回答
6

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

点击用户管理器: 在此处输入图像描述

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

在此处输入图像描述

于 2017-09-27T13:09:15.797 回答
5

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

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

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

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

于 2017-10-12T21:49:00.953 回答
3

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

 FLUSH PRIVILEGES;
于 2016-02-21T10:52:44.357 回答
3

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

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

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

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

解决错误之前

解决问题后

编码快乐!!

于 2019-11-21T18:29:47.450 回答
3

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

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

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

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

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

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

于 2021-03-23T17:32:49.220 回答
2

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

flush privileges;

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

于 2017-11-22T05:54:36.343 回答
2

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

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

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

我希望它对你也有帮助。

于 2018-05-19T06:35:41.840 回答
1

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

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

于 2014-12-04T22:37:53.387 回答
1

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

于 2016-06-22T14:18:20.070 回答
1

如果您有 WAMP Server + Windows 10 并且您将其用于开发而不是右键单击 Wamp 图标 => Wamp Settings=>Check Allow Virtual Hosts other than 127* 在此处输入图像描述

于 2020-05-08T09:59:17.537 回答
0

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

绑定地址 = 127.0.0.1

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

看这个你可以有想法。

这是真正的溶胶

于 2014-02-04T07:31:11.020 回答
0

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

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

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

于 2018-05-16T22:21:47.467 回答
0

这适用于DirectAdmin

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

完成的。your_database_username现在您可以通过&访问此数据库your_database_password
很简单!

于 2018-12-10T07:37:03.443 回答
0
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

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

于 2019-03-20T21:20:35.610 回答
0

CPANEL 解决方案

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

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

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

于 2019-04-29T03:00:10.857 回答
-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 帐户也可以工作。

于 2018-04-30T03:43:14.140 回答
-2

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

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

于 2015-08-31T07:17:38.147 回答
-5

这里的所有答案都不适用于我的情况,所以我邀请这可能会在未来帮助其他用户。这也可能是我们代码中的问题,而不仅仅是 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
于 2015-07-21T05:14:30.903 回答