使用SQLAlchemy连接AWS RDS MySQL遇1045权限错误求助
解决SQLAlchemy连接AWS RDS MySQL的1045访问拒绝错误
排查与修复方案
1. 修正连接字符串格式错误
你的连接字符串存在格式问题:
"mysql+mysqldb://{}:{}:@{}:{}/{}".format(USER, PASSWORD, URI, PORT, DB)
密码与URI之间多了一个冗余的@符号,会导致地址解析异常。正确格式应为mysql+mysqldb://user:password@host:port/db,修正后代码:
engine = create_engine("mysql+mysqldb://{}:{}@{}:{}/{}".format(USER, PASSWORD, URI, PORT, DB), echo=True)
2. 验证RDS端点与网络连通性
- 确认
URI变量填写的是RDS实例的官方端点(AWS控制台RDS详情页可查,格式如xxx.xxxxxx.us-east-1.rds.amazonaws.com),而非自定义域名或错误IP。 - 若客户端在AWS内部服务(EC2/ECS等),优先使用RDS内网端点,避免公网解析延迟或阻断。
3. 检查MySQL用户权限细节
登录RDS MySQL控制台(本地客户端或AWS查询编辑器),执行以下命令验证:
SELECT user, host FROM mysql.user WHERE user = 'admin';
确保host字段为%(允许所有IP访问)或你当前客户端的公网IP。若为localhost或受限IP,会导致外部登录失败。必要时重新授权:
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
4. 处理密码特殊字符转义
若密码包含@、:、/等特殊字符,需进行URL编码后再放入连接字符串:
from urllib.parse import quote_plus encoded_password = quote_plus(PASSWORD) engine = create_engine(f"mysql+mysqldb://{USER}:{encoded_password}@{URI}:{PORT}/{DB}", echo=True)
5. 确认安全组与VPC配置
- 临时将RDS安全组入站规则开放
0.0.0.0/0(3306端口)测试,排除IP动态变更导致的访问限制,测试后再缩小IP范围。 - 若客户端在VPC内,确保实例与RDS同属一个VPC,或通过VPC peering、NAT网关实现连通,安全组间允许3306端口流量。
内容的提问来源于stack exchange,提问作者bomahony
相关产品推荐
相关产品推荐

