从远程服务器连接到 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.cnfskip 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 IP
或 Anywhere
作为源。完成所有步骤后,两者都可以正常工作。
创建一个新用户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> sudo service mysql restart
完成这些步骤后,我可以从我的计算机上愉快地连接:
$localprompt> 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 AWS EC2 服务器上的 Node.js 连接到 Redis 服务器时出错
Mysql 无法通过 Amazon EC2 上的套接字连接到本地服务器
从另一台计算机连接到在 Amazon EC2 上的 localhost 上运行的 Web 应用程序