You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:53:30