从远程服务器连接到 Amazon EC2上的 mysql

我想连接到数据库的 EC2从我的本地机器,我不能这样做,并尝试了一切- 我使用这个命令连接到 EC2:

mysql -uUSERNAME -hEC2_IP -pPASSWORD

生成此错误

ERROR2003(HY000) : 无法在“ IP”(110)上连接到 MySQL 服务器

修改了 my.cnf

skip networking
bind-address            = 0.0.0.0

仍然无法连接到数据库

174776 次浏览

可能是您没有将分配给 EC2实例的 亚马逊安全集团配置为接受端口3306(MySQL 的默认端口)上的传入请求。

如果是这种情况,那么您可以轻松地为安全组打开端口,只需点击几个按钮:

1)登入 AWS 控制台,进入「 EC2」

2)在左边「网络及保安」菜单的「保安群组」

3)检查有问题的保安组

4)按「入站标签」

5)从下拉列表中选择“ MYSQL”,然后单击“添加规则”

也许不是原因,但值得一试。

可能有以下原因之一:

  1. 您需要在 AmazonSecurityGroup 中创建一个条目以允许远程 从您的机器访问亚马逊 EC2实例。 :-我相信这一点 是你做的,因为从你的问题来看,似乎你已经做了 一个0.0.0.0的条目,它允许每个人访问机器。
  2. MySQL 不允许用户从远程机器连接:-By 默认的 MySql 通过管理员访问创建 root 用户 id Id 的访问仅限于 localhost,这意味着 root 用户 如果您尝试访问 MySql,使用正确密码的 id 将无法工作 要解决这个问题,你需要 允许 root 用户或其他 DB 用户从远程访问 MySQL 我不建议允许 root 用户 id 访问 DB 您可以使用通配符% 来指定任何远程计算机。
  3. 检查机器的本地防火墙是否启用 然后确保3306端口开启。

请浏览以下连结: 如何启用对 MySQL 数据库服务器的远程访问?

正如上面的响应中提到的,它可能与 AWS 安全组和其他事情有关。但是如果你创建了一个用户并给它远程访问“%”,仍然得到这个错误,检查你的 mysql 配置文件,在 debian 上,你可以在这里找到它:/etc/mysql/my.cnf 并找到这行:

bind-address            = 127.0.0.1

然后改成:

bind-address            = 0.0.0.0

重启 mysql。

关于 debian/ubuntu:

/etc/init.d/mysql restart

我希望这对你有用。

我知道这是一个老职位,但..。

我正在经历这个问题,并且我已经确定我的问题实际上不是 EC2实例。看起来像是 MySQL 客户端驱动程序软件中的一个 bug。我还没有做过彻底的研究,但是我已经在 EC2实例上安装了 MySQL Workbench,而且 IT 也是不稳定的——它间歇性地无法连接(错误是“连接被取消”)。这个链接表明在堆栈下方可能存在一个 bug,而不是 EC2。

当然,我还没有做过详尽的研究,我的文章可能实际上是离题的,但是无论如何值得注意和/或探索,恕我直言。

解决这个问题的方法有三个步骤:

  1. 在 MySQL my.ini/my.cnf 文件中,更改绑定地址以接受来自所有主机的连接(0.0.0.0)。

  2. 在 aws 控制台-ec2特定的安全组中,打开 mysql 端口(默认为3306)以接受来自所有主机的连接(0.0.0.0)。

  3. 在 Windows 防火墙中为异常添加 mysql 端口(默认为3306)。

这将开始接受远程连接。

尽管这个问题似乎得到了回答,但是您可能会遇到的另一个常见问题是 DB 用户配置错误。这是一个 mysql 管理和权限问题:

  1. 使用 IP 10.55.142.100启动 EC2 _ DB
  2. 使用 IP 10.55.142.144启动 EC2 _ web
  3. EC2 _ DB 和 EC2 _ WEBare 位于同一个安全组中,可以跨 DB 端口(3306)访问
  4. EC2 _ DB 有一个 mysql DB,DB root 用户('root'@'localhost')可以在本地访问它
  5. EC2 _ DB mysql DB 有一个远程用户 'my_user'@'%' IDENTIFIED BY PASSWORD 'password'
  6. 从 EC2 _ WEB 对 mysql 的 bash 调用失败: mysql -umy_user -p -h ip-10-55-142-100.ec2.internal以及对显式 IP、公共 DNS 等的主机引用。

步骤6失败了,因为 mysql DB 拥有错误的用户权限:

GRANT ALL PRIVILEGES ON *.* TO 'my_user'@'ip-10-55-142-144.ec2.internal' IDENTIFIED BY PASSWORD 'password'

我希望 %可以在任何远程服务器上工作,但是我没有发现这种情况。

如果这对你有帮助,请告诉我。

登录到 AWS 管理控制台。导航到 RDS,然后选择 db 实例并转到“ security Groups”。在安全组下添加 CIDR/IP 解决了这个问题。

改变 /etc/mysql/my.cnf:

bind-address            = 127.0.0.1 to 0.0.0.0

用“%”host创建用户并重新启动:

/etc/init.d/mysql restart

我没问题! :)

我回顾了所有以前的答案(以及类似问题的答案) ,但没有成功,所以下面是最终对我有效的方法。关键的步骤是将 mysql 服务器上的特权显式授予本地用户(服务器) ,但是附加了我的本地 IP (myuser@*.*.*.*)。完整的逐步解决办法如下:

  1. 在服务器上注释掉 /etc/mysql/my.cnf中的 bind_address行(例如 EC2实例) bind_address=0.0.0.0也可以,但是不需要 其他人也提到过

  2. 向 EC2实例的安全组添加一个 MYSQL 规则(其他人也提到过) ,端口为3306,源为 My IPAnywhere。在完成所有步骤之后,两者都可以正常工作。

  3. 创建一个新用户 myuser,该用户对某个特定用户具有有限的权限 数据库 mydb(基本上遵循本 亚马逊教程中的说明) :

    $EC2prompt> mysql -u root -p
    [...omitted output...]
    mysql>  CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'your_strong_password';
    mysql>  GRANT ALL PRIVILEGES ON 'mydb'.* TO 'myuser'@'localhost';`
    
  4. Here's the key step, without which my local address was refused when attempting a remote connection (ERROR 1130 (HY000): Host '*.*.*.23' is not allowed to connect to this MySQL server):

    mysql> GRANT ALL PRIVILEGES ON 'mydb'.* TO 'myuser'@'*.*.*.23';
    mysql> FLUSH PRIVILEGES;`
    

    (将 '*.*.*.23'替换为本地 IP 地址)

  5. 另外,我退出 mysql 到 shell 并重新启动 msyql 服务器:

    $EC2prompt> sudo service mysql restart

  6. 在这些步骤之后,我可以很高兴地从我的电脑连接到:

    $localprompt> mysql -h myinstancename.amazonaws.com -P 3306 -u myuser -p

    (用 EC2实例的公共地址替换 myinstancename.amazonaws.com)

在创建像‘ myuser’@‘ localhost’这样的用户时,用户只能从 localhost 进行连接。创建一个只用于远程访问的用户,并使用您的远程客户端 IP 地址,从那里您将连接到 MySQL 服务器。如果您能够承担允许来自所有远程主机的连接的风险(通常在使用动态 IP 地址时) ,那么可以使用“ myuser”@’%”。我这样做了,还从/etc/mysql/mysql.cnf (Ubuntu)中删除了 bind _ address,现在它可以完美地连接了。

mysql> select host,user from mysql.user;
+-----------+-----------+
| host      | user      |
+-----------+-----------+
| %         | myuser    |
| localhost | mysql.sys |
| localhost | root      |
+-----------+-----------+
3 rows in set (0.00 sec)
  • 使用管理员用户启动 MYSQL
    • Mysql-u admin-user-p (在提示符上输入密码)
  • 创建一个新用户:
    • 创建用户‘ newuser’@’%’标识为‘ password’; (%-> anyhost)
  • 授予特权:
    • 对 db _ name 进行授权选择、删除、插入、更新。 * 到‘ newuser’@’%’;
    • 同花特权;

如果您正在运行 EC2实例,不要忘记使用 MYSQL/Aurura 在安全组中添加入站规则。

如果这些步骤不起作用,请检查/etc/mysql/my.cnf 文件并编辑 Bind _ address 参数作为

Bind _ address = 0.0.0.0

更新: 2017年2月

下面是用于远程访问 MySQL 的 完整的步骤(已部署 亚马逊 EC2) :-

1. 将 MySQL 添加到入站规则。

转到 ec2实例的安全组-> 编辑入站规则-> 添加新规则-> 选择 MySQL/Aurora并将源代码转到 Anywhere

2. 将 bind-address = 0.0.0.0添加到 my.cnf

实例控制台:

sudo vi /etc/mysql/my.cnf

这将打开 vi 编辑器。
在 my.cnf 文件中,在 [mysqld]之后添加新行并写下:

bind-address = 0.0.0.0

通过输入 :wq保存文件(输入)

现在重启 MySQL:

sudo /etc/init.d/mysqld restart

3. 创建远程用户并授予特权。

登录 MySQL:

mysql -u root -p mysql(在此之后输入密码)

现在编写以下命令:

CREATE USER 'jerry'@'localhost' IDENTIFIED BY 'jerrypassword';


CREATE USER 'jerry'@'%' IDENTIFIED BY 'jerrypassword';


GRANT ALL PRIVILEGES ON *.* to jerry@localhost IDENTIFIED BY 'jerrypassword' WITH GRANT OPTION;


GRANT ALL PRIVILEGES ON *.* to jerry@'%' IDENTIFIED BY 'jerrypassword' WITH GRANT OPTION;


FLUSH PRIVILEGES;


EXIT;

之后,可以通过输入实例的 public dns/ip 作为 MySQL Host Address,用户名作为 jerry,密码作为 jerryypassword 来远程访问 MySQL dB。(端口设置为默认为3306)

对于 ubuntu 的一些配置,需要在这个文件中更改绑定地址:

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

跟踪这个问题的一个有用的步骤是确定 MySQL 实际设置了哪个绑定地址。你可以使用 netstat:

netstat -nat |grep :3306

这有助于我集中精力解决问题,因为有多个 mysql 配置文件,而我编辑了错误的配置文件。Netstat 显示 mysql 仍然使用了错误的配置:

ubuntu@myhost:~$  netstat -nat |grep :3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

因此,我为可能覆盖我的设置并找到的任何其他文件的配置目录:

ubuntu@myhost:~$  sudo grep -R bind /etc/mysql
/etc/mysql/mysql.conf.d/mysqld.cnf:bind-address         = 127.0.0.1
/etc/mysql/mysql.cnf:bind-address = 0.0.0.0
/etc/mysql/my.cnf:bind-address = 0.0.0.0

噢!这表明我调整的设置是错误的配置文件,所以这次我编辑了正确的文件,用 netstat 确认了它,然后开始工作。

实例 EC2中 Mysql 的默认 ip Ubuntu 是 127.0.0.1,如果你想改变它只是为了遵循这里已经给出的答案。

我遇到的错误是,我的数据库网络设置允许 出境流量到网络-但 接近中只从选择 IP 地址。

我添加了一个 入站规则来允许来自我的 ec2的私有 IP 的流量,它工作了。

AWS EC2上新 MySQL 5.7的更新

Etc/mysql 中的 my.cnf 文件只包含

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

不要编辑此文件... ... MySQL 将阻止更改

相反,只要去 /etc/mysql/mysql.conf.d/

在那里,您应该找到一个名为 mysqld.cnf的文件

在这里,你会发现

bind-address = 127.0.0.1

改成

bind-address = 0.0.0.0 <OR> <Your IP>

就是这样! 保存文件并重新启动 MYSQL。

不要做任何其他更改,如“跳过网络”。这应该可以工作

谢谢

下面是我使用 Ec2上安装的 MySQL 进行远程连接所遵循的步骤:

  1. 在/etc/mysql/mysql.con.d/mysqld.cnf 中编辑以下行

    bind-address            = 127.0.0.1
    
    
    to
    
    
    bind-address            = 0.0.0.0
    
  2. 创建新用户以从任何计算机远程连接 mysql。如果您只想从特定的 IP 远程访问 mysql,请提及机器 IP 而不是“%”。

CREATE USER 'master'@'%' IDENTIFIED BY 'write-password-here';


GRANT ALL PRIVILEGES ON db_name.* TO 'master'@'%' WITH GRANT OPTION;
  1. 在 Ec2实例的安全组的入站规则中,添加一行值 MYSQL/Aurora、 TCP、3306和 source = 0.0.0.0.0

最后通过以下方法从远程机器连接到 MySQL

mysql -u master -h write-server-ip -p

对于 AWS EC2 Ubuntu 18.x 和20. x

  1. 前往 EC2控制台。
  2. 然后去安全小组。
  3. 与您的实例关联的安全组
  4. 编辑入站规则
  5. 添加新规则。选择 MySQL/Aurora,然后选择 Source to where。
  6. 最后,按照这个教程从数字海洋关于如何设置一个远程数据库连接是优化。

返回文章页面教程链接: Https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql-on-ubuntu-18-04

Simple Hack

  1. 我们的 EC2MYSQL 服务器将托管在 remotehost:3306上,使用

我们可以将这个远程端口转发到我们的 localhost:3307

使用 MYSQL 工作台连接到“ localhost: 3307”

  1. 确保编辑 ec2实例的入站规则以允许通信在

端口3306