EC2连接RDS MySQL遇ERROR 1045(28000)权限拒绝问题求助
解决EC2连接RDS MySQL的ERROR 1045 Access Denied问题
嘿,这个问题我之前在同VPC环境下踩过好几次坑,咱们一步步来排查,大概率能解决:
1. 先检查MySQL用户的访问权限范围
MySQL的用户权限是和连接来源的主机/IP绑定的,你创建mysuperuser的时候,很可能默认只允许从localhost或者某个特定IP访问,而不是EC2所在的VPC网段。
- 你可以通过RDS控制台的查询编辑器(如果开启了的话)直接登录MySQL,或者找一台能连RDS的VPC内机器,执行这条SQL查看用户的允许来源:
SELECT user, host FROM mysql.user WHERE user = 'mysuperuser'; - 如果结果里的
host是localhost或者某个固定IP,那EC2的私网IP不在允许列表里,肯定会被拒绝。这时候需要修改权限,把EC2所在的VPC网段或者EC2的具体私网IP加进去:
执行完记得刷新权限,不然不会生效。-- 比如你的默认VPC网段是172.31.0.0/16,允许这个网段的所有机器访问 GRANT ALL PRIVILEGES ON *.* TO 'mysuperuser'@'172.31.0.0/16' IDENTIFIED BY 'mypassword'; -- 或者更严格,只允许你的EC2私网IP(比如172.31.10.20)访问 -- GRANT ALL PRIVILEGES ON *.* TO 'mysuperuser'@'172.31.10.20' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES;
2. 核对连接命令的参数是否正确
别笑,有时候手滑输错参数也会触发这个错误:
- 你在EC2上执行的连接命令应该是这样的(替换成你的RDS实际端点):
然后手动输入密码mysql -h mydbinstance.xxxxxx.region.rds.amazonaws.com -u mysuperuser -pmypassword,注意:- 不要把密码直接写在命令行里(不安全而且容易输错)
- 确认RDS端点是对的,在RDS控制台的实例详情里能找到完整的端点地址
- 用户名
mysuperuser注意大小写(MySQL默认不区分,但如果创建时特意设置了区分就得严格对应)
3. 检查RDS的安全组入站规则
就算在同一个VPC,如果RDS的安全组没开放EC2的访问权限,也会出问题(有时候是超时,但偶尔也会表现为权限拒绝):
- 打开RDS控制台,找到
mydbinstance的关联安全组,进入安全组详情页 - 查看入站规则,有没有一条允许MySQL默认端口(3306)的规则,来源是EC2的安全组ID、EC2的私网IP,或者整个VPC的网段
- 如果没有,赶紧加一条:
- 类型选「MySQL/Aurora」(端口自动填3306)
- 来源选EC2的安全组,或者输入EC2私网IP/32,或者VPC的CIDR段
- 协议选TCP
4. 确认EC2的安全组出站规则
虽然EC2默认安全组允许所有出站流量,但如果你的EC2安全组被修改过,可能禁止了到3306端口的出站:
- 进入EC2的安全组详情,查看出站规则,确认有允许TCP 3306端口的规则,目标可以是0.0.0.0/0(宽松)或者RDS的私网IP/32(严格)
5. 排查IAM数据库认证是否开启
如果你创建RDS的时候不小心开了IAM数据库认证,那用普通密码连接肯定会被拒绝:
- 到RDS实例详情的「配置」标签,看「IAM数据库认证」是不是开启状态
- 如果是开启的,你得给EC2绑定对应的IAM角色,然后用IAM生成的临时密码连接,而不是用
mypassword
6. 确认RDS实例状态正常
最后再确认下RDS实例是不是处于可用状态,要是它正在重启、维护或者创建中,也没法正常连接。
先从用户权限和安全组这两点开始查,这是最常见的原因。
内容的提问来源于stack exchange,提问作者John Difool
相关产品推荐
相关产品推荐

