Python远程连接cPanel的MySQL数据库报111连接被拒绝问题
问题核心判断
你遇到的2003: Can't connect to MySQL server (111 Connection refused)不属于账号密码权限错误,是客户端根本没连上服务器的MySQL端口,请求没到MySQL的账号校验环节,不用在密码、库名对错上反复排查。
常见触发原因
- cPanel(尤其是共享主机版)默认将MySQL服务绑定在本地回环地址
127.0.0.1,不监听公网3306端口,所有外部公网请求直接被拒绝 - cPanel自带防火墙/主机商网络安全组没有放行3306端口的入站请求,或没有将你的本地IP加入访问白名单
- 连接参数填错:多数cPanel环境的MySQL远程地址不是站点域名,部分主机会将MySQL服务端口改为非3306的其他值;另外cPanel的数据库名、数据库用户名默认带cPanel账号前缀,漏写前缀也会出问题
- 没有在cPanel后台开启远程数据库访问授权,未将本地IP加入远程访问允许列表
分步解决方法
- 先配置cPanel远程访问白名单
登录cPanel面板找到「远程MySQL」功能入口,将你当前本地网络的公网IP添加到允许访问列表,临时测试可暂时填入%(允许所有IP访问,测试完成后必须删除,避免安全风险),添加后等待3分钟左右让规则生效。 - 核对正确的连接参数
进入cPanel的「MySQL数据库」页面,核对三个关键信息:- 完整的数据库名、数据库用户名:必须带上cPanel账号的前缀,比如cPanel账号为
miguel,你创建的数据库名为test,实际完整库名是miguel_test - 数据库主机地址:不要默认填自己的网站域名,以页面标注的MySQL主机地址为准,部分主机的远程数据库地址为独立的二级域名
- 端口号:如果页面标注MySQL端口不是默认3306,必须记录下来,连接时显式指定
- 完整的数据库名、数据库用户名:必须带上cPanel账号的前缀,比如cPanel账号为
- 验证端口连通性
本地打开终端执行命令测试端口是否可达:telnet 你查到的MySQL主机地址 端口号- 如果提示连接失败,且你使用的是有root权限的独立服务器/云服务器:修改MySQL配置文件
/etc/my.cnf,将bind-address = 127.0.0.1改为bind-address = 0.0.0.0,重启MySQL服务后在防火墙规则中放行对应MySQL端口的入站请求 - 如果使用的是无root权限的共享cPanel主机:直接联系主机商客服确认是否开放MySQL公网访问权限,多数低价共享主机关闭了公网连库的能力,用户无法自行开启
- 如果提示连接失败,且你使用的是有root权限的独立服务器/云服务器:修改MySQL配置文件
- 修正Python连接代码
所有参数核对无误后,连接时显式指定端口,参考代码如下:import mysql.connector HOST = "cPanel页面标注的MySQL远程主机地址" DATABASE = "带前缀的完整数据库名" USER = "带前缀的完整数据库用户名" PASSWORD = "数据库用户对应密码" PORT = 3306 # 替换为你查到的实际端口 db_connection = mysql.connector.connect( host=HOST, database=DATABASE, user=USER, password=PASSWORD, port=PORT ) print("Connected to:", db_connection.get_server_info())
补充:如果共享主机始终无法开放公网连库权限,可以通过SSH隧道的方式连接本地127.0.0.1的映射端口访问数据库,不需要公网暴露MySQL端口,安全性更高。
内容的提问来源于stack exchange,提问作者Miguel Hernandez
相关产品推荐
相关产品推荐

