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


68

我想从我的本地计算机连接到EC2上的db,但是我却做不到,并且尝试了所有操作-我正在使用以下命令连接到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实例)时会发生什么?
汤姆·麦克

您可以采取参考这里
帕雷什·巴拉德

Answers:


58

可能是以下原因之一:

  1. 您需要在Amazon Security Group中进行输入,以允许从您的计算机到Amazon EC2实例的远程访问。:-我相信这是由您完成的,因为从您的问题来看,您似乎已经用0.0.0.0进行了输入,从而使每个人都可以访问该计算机。
  2. MySQL不允许用户从远程计算机连接:-默认情况下,MySql创建具有管理员访问权限的root用户ID。但是root ID的访问仅限于localhost。这意味着,如果您尝试从远程计算机访问MySql,则具有正确密码的root用户ID将不起作用。要解决此问题,您需要允许root用户或其他DB用户从远程计算机访问MySQL。我不建议允许root用户ID从远程计算机访问数据库。您可以使用通配符%指定任何远程计算机。
  3. 检查机器的本地防火墙是否未启用。如果启用了它,请确保端口3306是打开的。

请通过以下链接:如何启用对MySQL数据库服务器的远程访问?


并确保将规则添加到与您的实例关联的组中。因此,我浪费了好几个小时。
Maciej Jankowski

在Windows Server上安装mysql服务器时,它会要求您授予端口3306的授予访问权限,但这还不够,它会要求使用私有网络和域网络,如果您从公共网络访问,则需要添加对端口3306。这就是为什么我现在无法访问mysql的原因。
永恒的

87

如以上响应中所述,它可能与AWS安全组等有关。但是,如果您创建了一个用户并将其授予远程访问权限'%',但仍然出现此错误,请在debian上检查您的mysql配置文件,可以在以下位置找到它:/etc/mysql/my.cnf并找到以下行:

bind-address            = 127.0.0.1

并将其更改为:

bind-address            = 0.0.0.0

并重启mysql。

在debian / ubuntu上:

/etc/init.d/mysql restart

希望这对您有用。


2
删除/注释bind-address =是我的解决方案
Mike

这也是我的解决方案。在检查并确认所有其他可能的设置后,我终于得出了这个答案。谢谢!
Art Geigel 2014年

3
这是实际的解决方案。它应该被接受为答案
diegoaguilar

是的,这是使用EC2 // MySql db时的正确答案。我似乎大约每6个月访问一次此页面。谢谢!
乍得

52

更新: 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)


嗨杰里,我也跟着一步一步的一切,你suggested.But仍然无法在AWS EC2 instance.I访问远程数据库已经张贴了我的问题在这个环节 stackoverflow.com/questions/42112414/...
迪内希Belakare

您执行了第3步中的所有票据吗?我注意到您没有提到该问题中的所有脚本
GorvGoyl

创建用户之后。.从同一服务器尝试mysql -u yournewuser -p mysql ..您可以登录吗?
GorvGoyl '17

2
在这里编辑文件/etc/my.cnf无效。我不得不编辑/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu 16.04-> sudo apt install mysql-server)。
布鲁诺

1
在Ubuntu 16.04 AWS中,我在/ opt / lampp / etc#vi my.cnf上找到了my.cnf
Vignesh Chinnaiyan,

30

可能是您尚未将分配给您的EC2实例的Amazon Security Group配置为在端口3306(MySQL的默认端口)上接受传入请求。

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

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

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

3)检查有问题的安全组

4)点击“入站标签”

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

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


谢谢,这正是我的解决方案。
kubilay 2014年

3
因此其他人认为这不会影响他们,因为默认值“所有流量,全部,全部,sg -....”不允许这样做,这可能是因为源值。但是,另一行“ MYSQL,TCP,3306、0.0.0.0 / 0”起作用了
bobtheowl2 2014年

我已经对PostgreSQL端口5432进行了此操作,请指定用于远程数据库连接的终端命令
。–

17

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

所以我为其他可能覆盖我的设置的其他文件添加了config目录,并发现:

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进行了确认,并且可以正常使用。


这正是解决方案。主要问题是找到正确的my.cnf文件,在这种情况下,该文件在sudo grep -R bind / etc / mysql中搜索
DrBug '17

这是一个很大的帮助。谢谢!
艾哈迈德·易卜拉欣

11

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

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

这个建议对我有所帮助
Pavan Jadda

5

尽管此问题似乎已得到解答,但您可以获得的另一个常见问题是数据库用户配置错误。这是一个mysql管理和权限问题:

  1. 通过IP启动EC2_DB 10.55.142.100
  2. EC2_web通过IP启动 10.55.142.144
  3. EC2_DB和EC2_WEB处于同一安全组中,并且可以通过您的数据库端口进行访问(3306)
  4. EC2_DB有一个mysql数据库,数据库根用户('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'

我想认为这%适用于任何远程服务器,但我发现情况并非如此。

请告诉我这是否对您有帮助。


4

变更/etc/mysql/my.cnf

bind-address            = 127.0.0.1 to 0.0.0.0

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

/etc/init.d/mysql restart

为我工作!:)


2

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


1

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

我遇到了这个问题,并且已经确定我的问题实际上不是EC2实例。看来这可能是MySQL客户端驱动程序软件中的错误。我还没有进行深入的研究,但是我尝试在EC2实例上安装MySQL Workbench,并且IT也很不稳定-它间歇性地无法连接(错误是“连接已取消”)。这个连结建议一个可能的错误降低堆栈,而不是EC2。

当然,我还没有进行详尽的研究,我的帖子可能确实不合时宜,但是无论如何,值得注意的是,恕我直言。


1

解决方法是三个步骤:

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

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

  3. 在Windows防火墙内,将mysql端口(默认为3306)添加到例外中。

这将开始接受远程连接。


1
  • 使用管理员用户启动MYSQL
    • mysql -u admin-user -p(在提示时输入密码)
  • 创建一个新用户:
    • 创建用户'newuser'@'%'由'密码'标识;(%-> anyhost)
  • 授予特权:
    • 对db_name进行GRANT SELECT,DELETE,INSERT,UPDATE。*到'newuser'@'%';
    • 冲洗特权;

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

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

bind_address = 0.0.0.0


0

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

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

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

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

    $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退出外壳并重新启动了msyql服务器:

    $EC2prompt> sudo service mysql restart

  6. 完成这些步骤之后,我可以通过以下方式从计算机愉快地进行连接:

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

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


0

在创建“ 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)


0

我遇到的错误是我的数据库网络设置允许到Web的出站流量-但仅从选定的IP地址入站

我添加了一个入站规则,以允许来自我的ec2专用IP的流量有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.