【问题标题】:Connect to mysql on Amazon EC2 from a remote server从远程服务器连接到 Amazon EC2 上的 mysql
【发布时间】: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

标签: mysql amazon-ec2


【解决方案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】:

可能有以下原因之一:

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

  1. EC2_DB 使用 IP 10.55.142.100 启动
  2. EC2_web 使用 IP 10.55.142.144 启动
  3. EC2_DB 和 EC2_WEB 位于同一个安全组中,可通过您的数据库端口 (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 数据库的用户权限错误。它需要这个:

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】:

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

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

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

            3. 在 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 进行远程连接所遵循的步骤:

                1. 在 /etc/mysql/mysql.conf.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
                

                【讨论】:

                  【解决方案15】:

                  简单的破解

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

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

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

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

                  端口 3306

                  【讨论】:

                    【解决方案16】:

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

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

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

                    3. 创建一个新用户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';`
                      
                    4. 这是关键步骤,没有它,我的本地地址在尝试远程连接时被拒绝(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&gt; sudo service mysql restart

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

                      $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

                            1. 转到 EC2 控制台。
                            2. 然后是安全组。
                            3. 与您的实例关联的安全组
                            4. 编辑入站规则
                            5. 添加新规则。选择 MySQL/Aurora,然后选择 Source toanywhere。
                            6. 最后按照 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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2017-06-26
                              • 2016-01-20
                              • 1970-01-01
                              • 2020-01-16
                              • 1970-01-01
                              • 2013-01-17
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多