从远程服务器连接到 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的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EC2 - 无法远程连接到 MariaDB

从 Amazon AWS EC2 服务器上的 Node.js 连接到 Redis 服务器时出错

Mysql 无法通过 Amazon EC2 上的套接字连接到本地服务器

从另一台计算机连接到在 Amazon EC2 上的 localhost 上运行的 Web 应用程序

使用 MySQL Workbench 通过 EC2 实例连接到 Amazon RDS 实例

如何从我的 Amazon EC2 实例中连接到 Amazon Redshift 集群