Mac浏览器运行Python脚本连接DigitalOcean MySQL 8数据库时出现2003 (HY000)连接错误
Mac浏览器运行Python脚本连接DigitalOcean MySQL 8数据库时出现2003 (HY000)连接错误
看起来你遇到的是典型的「不同环境下网络访问权限不匹配」问题,先帮你拆解核心误区和解决步骤:
一、先理清核心混淆点:别把两个MySQL服务搞混了
你提到修改了Droplet上的/etc/my.cnf等配置文件,但你要连接的是独立的DigitalOcean托管MySQL数据库(地址是db-mysql-......ondigitalocean.com:25060),这俩是完全独立的服务:
- Droplet上的MySQL是你自行安装的,监听3306端口(你的nmap结果也证实了这一点)
- DO托管的MySQL是DO官方运维的独立服务,25060是它的对外端口,和Droplet上的MySQL配置毫无关系
所以你之前修改Droplet上的MySQL配置(比如bind-address、port)完全不会影响连接DO托管数据库的结果,这是你走的第一个弯路,先把这个点捋清楚。
二、分析「浏览器运行脚本出错」的具体场景
你已经验证了Mac终端、Droplet控制台都能正常连库,唯独浏览器环境不行,先明确场景:
场景1:浏览器访问Droplet上的Web应用(比如Flask/Django),应用内Python代码连库
这种情况下,数据库请求是从Droplet的IP发出的,虽然你说已添加Droplet IP到可信源,但要确认:
- 你加的是Droplet的公网IP吗?Droplet可能有内网IP(比如eth1接口的IP),无VPC情况下内网IP无法访问托管数据库,必须加公网IP
- 测试Droplet能否正常访问托管库的25060端口:
如果能连通,说明网络层面没问题;如果连不通,要么是Droplet出站流量被限制,要么是可信源配置有误。# 用telnet测试连通性 telnet db-mysql-......ondigitalocean.com 25060 # 或者用nc工具 nc -zv db-mysql-......ondigitalocean.com 25060
场景2:浏览器直接运行本地Python脚本(比如通过本地Web服务器、浏览器插件)
这种情况下,数据库请求是从Mac的IP发出的,虽然终端能连,但浏览器可能有代理导致出口IP变化:
- 检查浏览器的代理设置,关闭代理后重试
- 用浏览器访问IP查询工具,确认浏览器的出口IP是否在DO托管数据库的可信源列表里
三、重新核对DO托管数据库的可信源配置
不管哪种场景,再仔细检查一遍:
- 登录DigitalOcean控制台,找到你的托管MySQL数据库
- 进入「Settings」→「Trusted Sources」
- 确认:
- Mac的公网IP(含浏览器出口IP)已添加
- Droplet的公网IP已添加
- 无VPC时不要添加内网IP,因为此时内网无法访问托管数据库
四、额外排查:Python脚本的连接参数
确认Web环境下的脚本连接参数和终端完全一致:
- 主机域名有没有打错
- 端口是否确实是25060
- 用户名、密码是否正确
- 是否开启了SSL?DO托管MySQL默认要求SSL,终端脚本可能已配置,但Web环境下的脚本遗漏了这一项(以MySQL Connector/Python为例,需要指定
ssl_mode="REQUIRED")
示例正确的连接代码:
import mysql.connector db_config = { 'user': '你的数据库用户名', 'password': '你的数据库密码', 'host': 'db-mysql-......ondigitalocean.com', 'port': 25060, 'database': '你的数据库名', 'ssl_mode': 'REQUIRED' } try: conn = mysql.connector.connect(**db_config) print("连接成功") except mysql.connector.Error as err: print(f"错误: {err}")
备注:内容来源于stack exchange,提问作者erdomester
相关产品推荐
相关产品推荐

