【问题标题】:Remote Connections Mysql Ubuntu远程连接 Mysql Ubuntu
【发布时间】:2013-03-17 18:41:53
【问题描述】:

由于某种原因,我无法远程连接到我的 MySQL 服务器。我已经尝试了所有方法,但仍然出现错误。

root@server1:/home/administrator# mysql -u monty -p -h www.ganganadores.cl
Enter password:
ERROR 1045 (28000): Access denied for user 'monty'@'server1.ganganadores.cl' (using password: YES)

现在,我已经尝试运行了

 GRANT ALL ON *.* to monty@localhost IDENTIFIED BY 'XXXXX'; 
 GRANT ALL ON *.* to monty@'%' IDENTIFIED BY 'XXXXXX';` 

还是什么都没有! 我做错了什么?

编辑my.cnf 已将绑定 ip 注释掉。

【问题讨论】:

  • 你用的是什么版本的 MySQL?
  • 服务器版本:5.5.29-0ubuntu0.12.10.1 (Ubuntu)
  • 这个命令返回什么? ubuntu~$ sudo lsof -i -P | grep :3306

标签: mysql ubuntu remoting


【解决方案1】:

要将 MySQL 暴露给 localhost 以外的任何内容,您必须具有以下行

适用于 mysql 5.6 及以下版本

/etc/mysql/my.cnf 中取消注释并分配给您的计算机 IP 地址而不是环回

适用于 mysql 5.7 及以上版本

/etc/mysql/mysql.conf.d/mysqld.cnf 中取消注释并分配给您的计算机 IP 地址而不是环回

#Replace xxx with your IP Address 
bind-address        = xxx.xxx.xxx.xxx

或者添加一个 bind-address = 0.0.0.0如果你不想指定IP

然后使用新的 my.cnf 条目停止并重新启动 MySQL。运行后转到终端并输入以下命令。

lsof -i -P | grep :3306

这应该会在 xxx 的实际 IP 中返回类似这样的内容

mysqld  1046  mysql  10u  IPv4  5203  0t0  TCP  xxx.xxx.xxx.xxx:3306 (LISTEN)

如果上述语句正确返回,您将能够接受远程用户。但是,要让远程用户以正确的权限连接,您需要在 localhost 和 '%' 中创建该用户。

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

那么,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

最后,

FLUSH PRIVILEGES; 
EXIT;

如果您没有像上面那样创建相同的用户,当您在本地登录时,您可能会继承基本 localhost 权限并遇到访问问题。如果您想限制 myuser 的访问权限,那么您需要阅读 GRANT 语句语法 HERE 如果您完成了所有这些并且仍然有问题发布一些额外的错误输出和 my.cnf 适当的行。

注意:如果 lsof 未返回或未找到,您可以根据您的 Linux 发行版安装它HERE。您不需要 lsof 来使事情正常工作,但是当事情没有按预期工作时,它非常方便。

更新:如果即使在 my.cnf 中添加/更改 bind-address 后仍不起作用,请在最初声明的位置进行更改:

/etc/mysql/mariadb.conf.d/50-server.cnf

【讨论】:

  • 谢谢,尽管我第一次正确地遵循了这些步骤,但我再次按照你发布的步骤进行操作,并且工作起来就像一个魅力!
  • 对于与lsof -i -P | grep :3306 苦苦挣扎的其他人,这不起作用,但在没有确认的情况下远程连接仍然可以正常工作,如果您没有看到正确的输出,请忽略。
  • @Mike Slutsky 感谢您的注意,我编辑了我的答案。如果 lsof 尚未安装,您可以安装它。
  • 许多系统上的 FWIW sudo lsof -i -P 将比 lsof -i -P 有用得多(假设您以非特权用户身份登录)。
  • lsof -i -P | grep :3306 不返回任何内容!
【解决方案2】:

在apesa的优秀帖子上加几点:

1) 你可以使用下面的命令来查看mysql服务器正在监听的ip地址

netstat -nlt | grep 3306

sample result:

tcp 0  0  xxx.xxx.xxx.xxx:3306  0.0.0.0:*   LISTEN

2) 如果由于某种原因更改没有立即生效,请使用FLUSH PRIVILEGES 强制加载授权表

GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
FLUSH PRIVILEGES; 
EXIT;

user == 用于连接 mysql ex.root 的用户
passwd == 你用来连接mysql的密码

3)如果在mysql服务器机器上启用了netfilter防火墙(sudo ufw enable),请执行以下操作以打开端口3306进行远程访问:

sudo ufw allow 3306

使用检查状态

sudo ufw status

4) 建立远程连接后,可以在客户端或服务器机器上使用命令对其进行验证

netstat -an | grep 3306
netstat -an | grep -i established

【讨论】:

  • 这节省了我一整天的时间!感谢sudo ufw status!!
  • netstat -nlt | grep 3306 返回空
  • @João Pimentel Ferreira 确保 mysql 首先运行,使用命令“/etc/init.d/mysql status”进行验证
  • 感谢sudo ufw allow 3306
【解决方案3】:

MySQL 只监听 localhost,如果要启用远程访问,则需要在 my.cnf 文件中进行一些更改:

sudo nano /etc/mysql/my.cnf

我们需要注释掉 bind-address 和 skip-external-locking 行:

#bind-address = 127.0.0.1
# skip-external-locking

做完这些修改后,我们需要重启mysql服务:

sudo service mysql restart

【讨论】:

  • 请务必评论skip-external-locking
  • 我没有注释掉skip-external-locking,它仍然有效。
  • 我必须在 /etc/mysql/mysql.conf.d 中更改它
  • 我的是这个位置:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
【解决方案4】:

如果在 Windows 上测试,别忘了打开 3306 端口。

【讨论】:

  • 啊,你真是个天才,如果你在 Linux 上使用 Windows 子系统,这一点非常重要,你需要为通过 Windows 防火墙的入站流量打开端口 3306,以上都不是检查 MySQL 是否正在监听子系统的工作
【解决方案5】:

您使用的是 ubuntu 12(相当旧的)

首先,打开/etc/mysql/mysql.conf.d/mysqld.cnf文件(Ubuntu 14.04及更早版本为/etc/mysql/my.cnf

在 [mysqld] 下找到该行, 绑定地址 = 127.0.0.1 并将其更改为, 绑定地址 = 0.0.0.0 或者评论一下

然后,重新启动 Ubuntu MySQL Server systemctl restart mysql.service

现在 Ubuntu Server 将允许远程访问 MySQL Server,但您仍然需要配置 MySQL 用户以允许从任何主机访问。

用户必须是 'username'@'%' 并拥有所有必需的授权

为确保 MySQL 服务器监听所有接口,运行 netstat 命令如下。

netstat -tulnp | grep mysql

希望这行得通!

【讨论】:

  • 就我而言,我是“bind-address = 0.0.0.0”并重新启动mysql服务。
【解决方案6】:

就我而言,我使用的是 MySql Server 版本:8.0.22

我必须添加

bind-address        = 0.0.0.0

并将这一行更改为

mysqlx-bind-address = 0.0.0.0

在文件中 /etc/mysql/mysql.conf.d

然后通过运行重新启动 MySQL

sudo service mysql restart

【讨论】:

    【解决方案7】:

    当我尝试将 Mysql 连接到远程服务器时,我遇到了同样的问题。我发现我必须将绑定地址更改为数据库服务器的当前私有 IP 地址。 但是当我尝试在my.cnf 文件中添加bind-address =0.0.0.0 行时,当我尝试创建数据库时它不理解该行。

    通过搜索,我找到了原来声明 bind-address 的地方。

    实际声明在:/etc/mysql/mariadb.conf.d/50-server.cnf

    因此我直接在那里更改了绑定地址,然后一切似乎都正常了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多