开启AWS VPN时Python连接MySQL遭Access Denied,但Workbench可正常访问
解决AWS VPN下Python连接MySQL的1045权限错误
排查与解决步骤
检查Python进程的出口IP
部分Python运行环境(虚拟环境、容器等)可能没继承系统VPN路由,导致连接时用的是非VPN公网IP,而MySQL只开放了VPN网段权限。在Python里执行以下代码查看当前出口IP:import requests print(requests.get('https://api.ipify.org').text)对比MySQL报错里的
ip_address_here,以及Workbench连接时的客户端IP(可在MySQL服务器执行SELECT user, host FROM mysql.user;查看允许的IP范围)。如果IP不一致,需确保Python进程走VPN路由:Windows下检查虚拟环境网络适配器设置,Linux/macOS用route命令确认路由表将数据库网段指向VPN接口。确认MySQL用户的权限匹配
即便Workbench能连接,也要检查test_user是否允许从报错里的具体IP访问。通过Workbench登录MySQL服务器,执行:SHOW GRANTS FOR 'test_user'@'ip_address_here';若没有对应权限,给该IP授权(替换成实际数据库和表名):
GRANT SELECT ON your_database.your_table TO 'test_user'@'ip_address_here'; FLUSH PRIVILEGES;如果是VPN网段(比如
10.0.0.%),可以直接授权整个网段:GRANT SELECT ON your_database.your_table TO 'test_user'@'10.0.0.%'; FLUSH PRIVILEGES;排查Python连接参数的隐性问题
- 确认
port参数是整数类型:若从配置文件读取的是字符串,会导致连接异常,可加print(type(port))检查,必要时转成int(port)。 - 处理特殊字符密码:如果密码包含
@、#等符号,用Python原始字符串(比如r'your_password')避免转义问题。 - 显式指定字符集:在
connect里加charset='utf8mb4',部分字符集不匹配会触发权限类报错。
- 确认
验证DNS解析一致性
关闭VPN时Python找不到主机,说明开启VPN时DNS解析正常,但可能Python的DNS缓存和系统不一致。在Python里解析主机名确认IP:import socket print(socket.gethostbyname(host))对比Workbench里的数据库内网IP,若不一致,直接用内网IP代替主机名连接,或刷新系统DNS缓存后重试。
内容的提问来源于stack exchange,提问作者Ruby Rain
相关产品推荐
相关产品推荐

