从远程服务器连接到Amazon EC2上的mysql
我想从本地机器连接到EC2上的数据库,我无法做到,并尝试了一切 – 我使用这个命令连接到EC2:
mysql -uUSERNAME -hEC2_IP -pPASSWORD
产生这个错误
错误2003(HY000):无法连接到'IP'上的MySQL服务器(110)
我修改了my.cnf
skip networking bind-address = 0.0.0.0
仍然无法连接到数据库
可能有以下原因之一:
- 您需要在Amazon Security Group中input条目,以允许从您的计算机到Amazon EC2实例的远程访问。 : – 我相信这是由你作为你的问题,你似乎已经作出了0.0.0.0,允许每个人访问机器的条目进行。
- MySQL不允许用户从远程机器连接: – 默认情况下,MySql创build具有pipe理员权限的root用户标识。 但root ID的访问权限仅限于本地主机。 这意味着如果您尝试从远程计算机访问MySql,那么使用正确密码的root用户标识将不起作用。 为了解决这个问题,你需要允许root用户或其他DB用户从远程机器访问MySQL。 我不会build议允许root用户ID从远程机器访问数据库。 您可以使用通配符%来指定任何远程计算机。
- 检查机器的本地防火墙是否启用。 如果它启用,然后确保端口3306是打开的。
请通过以下链接: 如何启用远程访问MySQL数据库服务器?
正如在上面的回应中提到的,它可能与AWS安全组和其他事情有关。 但是如果你创build了一个用户并且给了它远程访问'%'并且仍然出现这个错误,请检查你的mysqlconfiguration文件,在debian上,你可以在这里find它:/etc/mysql/my.cnf并find这行:
bind-address = 127.0.0.1
并将其更改为:
bind-address = 0.0.0.0
并重新启动mysql。
在Debian / Ubuntu上:
/etc/init.d/mysql restart
我希望这对你有用。
可能是因为未将分配给您的EC2实例的Amazon安全组configuration为接受端口3306(MySQL的默认端口)上的传入请求。
如果是这种情况,那么只需点击几下鼠标就可以轻松打开安全组的端口:
1)login到您的AWS控制台并转到“EC2”
2)在“networking与安全”下的左侧菜单中,进入“安全组”
3)检查有问题的安全组
4)点击“入站选项卡”
5)从下拉列表中select“MYSQL”,然后点击“添加规则”
可能不是理由,但值得一试…
更新: 2017年2月
以下是远程访问MySQL的完整步骤 (部署在Amazon EC2上): –
1.将MySQL添加到入站规则。
转到您的ec2实例的安全组 – >编辑入站规则 – >添加新规则 – >selectMySQL/Aurora
和源到Anywhere
。
2.添加bind-address = 0.0.0.0到my.cnf
在实例控制台中:
sudo vi etc/my.cnf
这将打开vi编辑器。
在my.cnf文件中,在[mysqld]
添加新行并写入:
bind-address = 0.0.0.0
保存文件input:wq
(enter)
现在重新启动MySQL:
sudo /etc/init.d/mysqld restart
3.创build一个远程用户并授予权限。
login到MySQL:
mysql -u root -p mysql
(在此之后input密码)
现在写下面的命令:
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;
在此之后,可以通过input实例的公共DNS / IP作为MySQL主机地址,用户名为jerry,密码为jerrypassword来远程访问MySQL dB。 (端口在3306被设置为默认)
尽pipe这个问题似乎已经得到解答,但您可以得到的另一个常见问题是数据库用户被错误configuration。 这是一个mysqlpipe理和权限问题:
- EC2_DB启动IP
10.55.142.100
- 使用IP
10.55.142.144
启动10.55.142.144
- EC2_DB和EC2_WEB在同一个安全组中,可以通过您的数据库端口进行访问(3306)
- EC2_DB有一个mysql数据库,可以由数据库根用户(
'root'@'localhost'
)'root'@'localhost'
- EC2_DB mysql数据库有一个远程用户
'my_user'@'%' IDENTIFIED BY PASSWORD 'password'
- 从EC2_WEB到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'
我想认为%
可以用于任何远程服务器,但我并没有发现这种情况。
请让我知道这是否有助于你。
更改/etc/mysql/my.cnf
:
bind-address = 127.0.0.1 to 0.0.0.0
使用'%' host
创build用户并重新启动:
/etc/init.d/mysql restart
为我工作! 🙂
跟踪这个问题的有用步骤是确定MySQL实际设置的绑定地址。 你可以用netstat来做到这一点:
netstat -nat |grep :3306
这帮助我解决了我的问题,因为有多个mysqlconfiguration文件,而且我编辑了错误的文件。 Netstat显示mysql仍然使用错误的configuration:
ubuntu@myhost:~$ netstat -nat |grep :3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
所以我greppedconfiguration目录的任何其他文件可能是重写我的设置,并发现:
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
D'哦! 这显示了我调整的设置是错误的configuration文件,所以我这次编辑了RIGHT文件,用netstat证实了它,并且正在运行。
login到AWSpipe理控制台。 导航到RDS,然后select数据库实例并转到“安全组”。 在安全组下添加CIDR / IP解决了这个问题。
解决scheme是三个步骤:
-
在MySQL my.ini / my.cnf文件中,将绑定地址更改为接受来自所有主机(0.0.0.0)的连接。
-
在aws控制台 – ec2 – 特定安全组中打开你的mysql端口(默认是3306)接受来自所有主机(0.0.0.0)的连接。
-
在Windows防火墙内添加mysql端口(默认为3306)为例外。
这将开始接受远程连接。
- 使用pipe理员用户启动MYSQL
- mysql -u admin-user -p(请input密码提示)
- 创build一个新用户:
- CREATE USER'newuser'@'%'IDENTIFIED BY'password'; (% – > anyhost)
- 授予权限:
- GRANT SELECT,DELETE,INSERT,UPDATE ON db_name。* TO'newuser'@'%';
- FLUSH PRIVILEGES;
如果您正在运行EC2实例,请不要忘记使用MYSQL / Aurura在安全组中添join站规则。
如果这些步骤不起作用,请检查/etc/mysql/my.cnf文件并将bind_address参数编辑为
bind_address = 0.0.0.0
我知道这是一个旧的职位,但…
我遇到这个问题,我已经确定我的问题实际上不是EC2实例。 它似乎可能是MySQL客户端驱动程序软件中的一个错误。 我还没有做过彻底的研究,但我甚至在EC2实例上安装了MySQL Workbench,IT也是不稳定的 – 它间歇性地无法连接(错误是“连接取消”)。 这个链接暗示了一个可能的bug,而不是EC2。
当然,我还没有做过详尽的研究,我的post可能实际上是不正确的,但值得注意和/或探索,恕我直言。
我经历了所有以前的答案(和类似的问题的答案)没有成功,所以这里是最后为我工作。 关键的一步是明确授予本地用户(对于服务器)的MySQL服务器的权限,但我的本地IP附加到它( myuser@*.*.*.*
)。 完整的一步一步的解决scheme如下:
-
注释掉服务器上的
/etc/mysql/my.cnf
中的bind_address
行(即EC2实例)。 我想bind_address=0.0.0.0
也可以工作,但并不需要像其他人提到的那样。 -
将MYSQL的规则(如其他人也提到的那样)添加到端口为3306的EC2实例的安全组,以及“
My IP
或“Anywhere
作为源”。 遵循所有步骤后,两者都可以正常工作。 -
创build一个具有有限特权的新用户
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';`
-
这是关键的一步,没有这一步,当我尝试远程连接时,我的本地地址被拒绝
(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;`
(用本地IP地址replace
'*.*.*.23'
) -
为了好的措施,我退出mysql到shell并重新启动了msyql服务器:
$EC2prompt> sudo service mysql restart
-
经过这些步骤,我能够愉快地从我的电脑连接:
$localprompt> mysql -h myinstancename.amazonaws.com -P 3306 -u myuser -p
(用您的EC2实例的公共地址replace
myinstancename.amazonaws.com
)
当创build用户像'myuser'@'localhost'时,用户被限制只能从本地主机连接。 创build一个仅用于远程访问的用户,并使用您要连接到MySQL服务器的远程客户端IP地址。 如果您可以承受来自所有远程主机(通常使用dynamicIP地址)的连接的风险,则可以使用'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)
对于ubuntu的一些configuration,需要在这个文件中改变绑定地址:
/etc/mysql/mysql.conf.d/mysqld.cnf