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

Posted

技术标签:

【中文标题】从远程服务器连接到 Amazon EC2 上的 mysql【英文标题】:Connect to mysql on Amazon EC2 from a remote server 【发布时间】:2012-04-03 16:37:59 【问题描述】:

我想从我的本地机器连接到 EC2 上的数据库,但我无法做到并且已经尝试了所有方法 - 我正在使用此命令连接到 EC2:

mysql -uUSERNAME -hEC2_IP -pPASSWORD

产生这个错误

错误 2003 (HY000):无法连接到“IP”上的 MySQL 服务器 (110)

我已经用

修改了 my.cnf
skip networking
bind-address            = 0.0.0.0

仍然无法连接到数据库

【问题讨论】:

您可以通过 SSH 连接到 EC2 实例吗?如果是这样,那么当您尝试在本地连接到 mysql 数据库时会发生什么,即从安装数据库的同一 EC2 实例? 可以参考Here 【参考方案1】:

正如上面的回复中提到的,它可能与 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

我希望这对你有用。

【讨论】:

删除/注释掉 bind-address= 是我的解决方案 这也是我的解决方案。在检查并确认了所有其他可能的设置之后,我终于得到了这个答案。谢谢! 这是实际的解决方案。它应该被接受为答案 是的,这是使用 EC2 //MySql 数据库时的正确答案。我似乎大约每 6 个月访问一次此页面。谢谢!【参考方案2】:

可能有以下原因之一:

    您需要在 Amazon 安全组中创建一个条目以允许远程 从您的机器访问 Amazon EC2 实例。 :- 我相信这一点 由您完成,因为从您的问题看来,您已经完成了 带有 0.0.0.0 的条目,允许每个人访问机器。 MySQL 不允许用户从远程计算机连接:- 通过 默认 MySql 创建具有管理员访问权限的 root 用户 ID。但是根 id 的访问仅限于本地主机。这意味着root用户 如果您尝试访问 MySql,则具有正确密码的 ID 将不起作用 从远程机器。要解决这个问题,您需要 允许 root 用户或其他一些 DB 用户从远程访问 MySQL 机器。我不建议允许 root 用户 id 访问数据库 从远程机器。您可以使用通配符 % 来指定任何远程计算机。 检查机器的本地防火墙是否未启用。如果它启用 然后确保端口 3306 已打开。

请通过以下链接:How Do I Enable Remote Access To MySQL Database Server?

【讨论】:

并确保将规则添加到与您的实例关联的组。我因此浪费了好几个小时。 当你在windows服务器上安装mysql服务器时,它会要求你授予3306端口的访问权限,但这还不够,如果你从公共网络访问,它会要求私有网络和域网络,需要添加3306端口的公共访问,这就是我刚才不能访问mysql的原因。 This 文章帮助了我。【参考方案3】:

更新: 2017 年 2 月

这里是远程访问 MySQL 的完整步骤(已部署 在 Amazon 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;

在此之后,可以通过输入您实例的公共 dns/ip 作为 MySQL 主机地址、用户名作为 jerry 和密码作为 jerrypassword 来远程访问 MySQL dB。 (端口默认设置为 3306)

【讨论】:

嗨,Jerry,我按照您的建议一步一步完成了所有操作。但仍然无法访问 AWS EC2 实例上的远程数据库。我已在此链接 ***.com/questions/42112414/… 上发布了我的问题 您是否执行了步骤 3 中的所有脚本?我注意到你没有在那个问题中提到所有脚本 创建用户后.. 尝试 mysql -u yournewuser -p mysql 从同一台服务器.. 你能登录吗? 编辑文件 /etc/my.cnf 在这里什么都不做。我不得不编辑 /etc/mysql/mysql.conf.d/mysqld.cnf (ubuntu 16.04 -> sudo apt install mysql-server)。 在 Ubuntu 16.04 AWS 中,我在 /opt/lampp/etc# vi my.cnf 找到了 my.cnf【参考方案4】:

可能是您没有配置分配给您的 EC2 实例的 Amazon Security Group 以接受端口 3306(MySQL 的默认端口)上的传入请求。

如果是这种情况,您只需单击几下按钮即可轻松打开安全组的端口:

1) 登录您的 AWS 控制台并转到“EC2”

2) 在“网络和安全”下的左侧菜单中,转到“安全组”

3) 检查有问题的安全组

4) 点击“入站标签”

5) 从下拉列表中选择“MYSQL”并点击“添加规则”

可能不是原因,但值得一试......

【讨论】:

谢谢,这正是我的解决方案。 所以其他人认为这不会影响他们,默认的“所有流量,所有,所有,sg-....”不允许它,可能是因为源值.但是另外一行“MYSQL,TCP,3306,0.0.0.0/0”起作用了 我已经为 PostgreSQL 端口 5432 这样做了,请指定远程数据库连接的终端命令..【参考方案5】:

跟踪此问题的一个有用步骤是确定 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

天啊!这表明我调整的设置是错误的配置文件,所以我这次编辑了 RIGHT 文件,用 netstat 确认它,并且正在运行。

【讨论】:

这正是解决方案。主要问题是找到正确的 my.cnf 文件,在这种情况下在 sudo grep -R bind /etc/mysql 中搜索该文件 这是一个很大的帮助。谢谢!【参考方案6】:

ubuntu的一些配置,需要在这个文件中修改bind-address:

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

【讨论】:

这个建议对我有帮助【参考方案7】:

虽然这个问题似乎已经得到解答,但您可以得到的另一个常见问题是 DB 用户配置错误。这是一个 mysql 管理和权限问题:

    EC2_DB 使用 IP 10.55.142.100 启动 EC2_web 使用 IP 10.55.142.144 启动 EC2_DB 和 EC2_WEB 位于同一个安全组中,可通过您的数据库端口 (3306) 进行访问 EC2_DB 有一个 mysql DB,可由 DB root 用户 ('root'@'localhost') 在本地访问 EC2_DB mysql DB 有远程用户'my_user'@'%' IDENTIFIED BY PASSWORD 'password' 从 EC2_WEB 对 mysql 的 bash 调用失败:mysql -umy_user -p -h ip-10-55-142-100.ec2.internal 主机对显式 IP、公共 DNS 等的引用也是如此。

第 6 步失败,因为 mysql 数据库的用户权限错误。它需要这个:

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

我想% 可以适用于任何远程服务器,但我没有发现这种情况。

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

【讨论】:

【参考方案8】:

更改/etc/mysql/my.cnf:

bind-address            = 127.0.0.1 to 0.0.0.0

使用 '%' host 创建用户并重启:

/etc/init.d/mysql restart

为我工作! :)

【讨论】:

【参考方案9】:

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。

请勿进行任何其他更改,例如“跳过网络”。这应该工作

谢谢

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

我知道这是一篇旧帖子,但是...

我遇到了这个问题,并且我已经确定我的问题实际上不是 EC2 实例。似乎它可能是 MySQL 客户端驱动程序软件中的错误。我还没有进行彻底的研究,但我已经在 EC2 实例上安装了 MySQL Workbench,而且 IT 也不稳定——它间歇性地无法连接(错误是“连接取消”)。 This link 暗示了一个可能在堆栈下方的错误,而不是 EC2。

当然,我还没有做详尽的研究,我的帖子实际上可能不合时宜,但无论如何值得注意和/或探索,恕我直言。

【讨论】:

【参考方案12】:

解决这个问题的三个步骤:

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

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

    在 windows 防火墙中将 mysql 端口(默认为 3306)添加到例外。

这将开始接受远程连接。

【讨论】:

【参考方案13】: 使用管理员用户启动 MYSQL mysql -u admin-user -p(在提示时输入密码) 创建一个新用户: 创建用户 'newuser'@'%' IDENTIFIED BY 'password'; (% -> 任意主机) 授予权限: GRANT SELECT、DELETE、INSERT、UPDATE ON db_name.* TO 'newuser'@'%'; 刷新特权;

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

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

bind_address=0.0.0.0

【讨论】:

【参考方案14】:

以下是我与安装在 Ec2 上的 MySQL 进行远程连接所遵循的步骤:

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

    bind-address            = 127.0.0.1
    
    to
    
    bind-address            = 0.0.0.0
    

    创建新用户以从任何机器远程连接到 mysql。如果您只想从特定 IP 远程访问 mysql,请提及机器 ip 而不是“%”。

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

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

最后通过远程机器与 MySQL 连接

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

【讨论】:

【参考方案15】:

简单的破解

    我们的 EC2 MYSQL 服务器将托管在remotehost:3306,使用

port forwarding 我们可以将此远程端口转发到我们的localhost:3307

使用MYSQL工作台连接`localhost:3307'

    确保编辑您的 ec2 实例的入站规则以允许流量进入

端口 3306

【讨论】:

【参考方案16】:

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

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

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

    创建一个新用户myuser,对某个特定用户具有有限的权限 数据库mydb(基本上按照Amazon tutorial中的说明进行操作):

    $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';`
    

    这是关键步骤,没有它,我的本地地址在尝试远程连接时被拒绝(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地址)

    为了更好的衡量,我退出了 mysql 到 shell 并重新启动了 msyql 服务器:

    $EC2prompt&gt; sudo service mysql restart

    完成这些步骤后,我可以从我的计算机上愉快地连接:

    $localprompt&gt; mysql -h myinstancename.amazonaws.com -P 3306 -u myuser -p

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

【讨论】:

【参考方案17】:

在创建像 'myuser'@'localhost' 这样的用户时,用户被限制为只能从 localhost 进行连接。创建一个仅用于远程访问的用户,并使用您将连接到 MySQL 服务器的远程客户端 IP 地址。如果您可以承担允许来自所有远程主机的连接的风险(通常在使用动态 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)

【讨论】:

【参考方案18】:

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

【讨论】:

【参考方案19】:

我遇到的错误是我的数据库网络设置允许出站 流量到网络 - 但入站 只能来自选定的 IP 地址。

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

【讨论】:

【参考方案20】:

适用于 AWS EC2 Ubuntu 18.x 和 20.x

    转到 EC2 控制台。 然后是安全组。 与您的实例关联的安全组 编辑入站规则 添加新规则。选择 MySQL/Aurora,然后选择 Source toanywhere。 最后按照 Digital Ocean 的本教程学习如何设置优化的远程数据库连接。

教程链接: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql-on-ubuntu-18-04

【讨论】:

以上是关于从远程服务器连接到 Amazon EC2 上的 mysql的主要内容,如果未能解决你的问题,请参考以下文章