首页 文章

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

提问于
浏览
55

我想从我的本地机器连接到EC2上的db,我无法做到并尝试了所有内容 - 我使用此命令连接到EC2:

mysql -uUSERNAME -hEC2_IP -pPASSWORD

生成此错误

ERROR 2003(HY000):无法连接到'IP'上的MySQL服务器(110)

我修改了my.cnf

skip networking
bind-address            = 0.0.0.0

仍然无法连接到数据库

14 回答

  • 81

    如上面的回复中所述,它可能与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
    

    我希望这适合你 .

  • 4

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

    如果是这种情况,则只需按几下按钮,即可轻松打开安全组的端口:

    1)登录AWS Console并转到'EC2'

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

    3)检查有问题的安全组

    4)点击“入站标签”

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

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

  • 1

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

  • 4

    可能有以下原因之一:

    • 您需要在Amazon Security Group中创建一个条目,以允许从您的计算机远程访问Amazon EC2实例 . : - 我相信这是由你完成的,因为你似乎已经用0.0.0.0创建了一个条目,它允许每个人访问机器 .

    • MySQL不允许用户从远程机器连接: - 默认情况下,MySql使用admin访问权限创建root用户ID . 但root id的访问仅限于localhost . 这意味着如果您尝试从远程计算机访问MySql,则具有正确密码的root用户标识将不起作用 . 要解决此问题,您需要允许root用户或其他一些DB用户从远程计算机访问MySQL . 我不建议允许root用户id从远程计算机访问DB . 您可以使用通配符%来指定任何远程计算机 .

    • 检查机器的本地防火墙是否未启用 . 如果启用它,请确保端口3306已打开 .

    请通过以下链接:How Do I Enable Remote Access To MySQL Database Server?

  • 5

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

    • 用IP启动EC2_DB 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 DB具有错误的用户权限 . 它需要这个:

    GRANT ALL PRIVILEGES ON *.* TO 'my_user'@'ip-10-55-142-144.ec2.internal' IDENTIFIED BY PASSWORD 'password'
    

    我想 % 适用于任何远程服务器,但我没有发现这种情况 .

    如果这有助于您,请告诉我 .

  • 3

    改变 /etc/mysql/my.cnf

    bind-address            = 127.0.0.1 to 0.0.0.0
    

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

    /etc/init.d/mysql restart
    

    适合我! :)

  • 2

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

    D'哦!这告诉我我调整的设置是错误的配置文件,所以我这次编辑了RIGHT文件,用netstat确认了它,并且正在进行业务 .

  • 31

    对于ubuntu的某些配置,需要在此文件中更改bind-address:

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

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

  • 1

    解决方案是三个步骤:

    • 在MySQL中my.ini / my.cnf文件更改bind-address以接受来自所有主机的连接(0.0.0.0) .

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

    • 在Windows防火墙内添加mysql端口(默认为3306)到异常 .

    这将开始接受远程连接 .

  • 0
    • 使用admin用户启动MYSQL

    • mysql -u admin-user -p(输入PASSWORD ON PROMPT)

    • 创建新用户:

    • CREATE USER 'newuser' @ '%' IDENTIFIED BY 'password'; (% - >任何主机)

    • 授予权限:

    • GRANT SELECT,DELETE,INSERT,UPDATE ON db_name . * TO 'newuser' @ '%';

    • FLUSH PRIVILEGES;

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

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

    bind_address = 0.0.0.0

  • 47

    我知道这是一个老帖子但是......

    我确定我的问题实际上不是EC2实例 . 好像它可能是MySQL客户端驱动程序软件中的一个错误 . 我还没有做过彻底的研究,但我甚至在EC2实例上安装了MySQL Workbench而且IT也不稳定 - 它间歇性地无法连接(错误是"connection cancelled") . This link建议一个可能的错误降低堆栈,而不是EC2 .

    当然,我还没有做过详尽的研究,我的帖子实际上可能不合时宜,但值得注意和/或探索无论如何,恕我直言 .

  • 0

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

    • 在服务器(即EC2实例)中注释 /etc/mysql/my.cnf 中的 bind_address 行 . 我认为 bind_address=0.0.0.0 也会起作用,但不像其他人提到的那样需要它 .

    • 为MYSQL添加规则(正如其他人已经提到的那样)到EC2实例的安全组,端口为3306, My IPAnywhere 为Source . 在完成所有步骤后,两者都能正常工作 .

    • 为一个特定数据库 mydb 创建一个具有有限权限的新用户 myuser (基本上遵循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;`
    

    (用您当地的IP地址替换 '*.*.*.23'

    • 为了更好的衡量,我退出了mysql到shell并重新启动了msyql服务器:

    $EC2prompt> sudo service mysql restart

    • 完成这些步骤后,我能够愉快地从我的计算机连接到:

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

    (用EC2实例的公共地址替换 myinstancename.amazonaws.com

  • 27

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

相关问题