MySQL远程访问需三步:一改bind-address为0.0.0.0并重启服务,二创建@'%'用户并授权、刷新权限,三用firewalld或ufw精准放行3306端口,缺一不可。

直接关防火墙不是解决办法,而是绕过问题。真正安全的做法是让防火墙放行 3306 端口,同时确认 MySQL 服务本身允许远程连接。
检查并开放服务器上的3306端口
Linux 服务器(如 CentOS/RHEL 8+、Ubuntu 20.04+)默认使用 firewalld 或 ufw,不能只停服务,得精准放行端口:
- 查当前防火墙状态:
sudo systemctl status firewalld(或sudo ufw status) - 若使用
firewalld,执行:sudo firewall-cmd --permanent --add-port=3306/tcp,再sudo firewall-cmd --reload - 若使用
ufw,执行:sudo ufw allow 3306/tcp - 验证是否生效:
sudo firewall-cmd --list-ports或sudo ufw status numbered
注意:systemctl stop firewalld 虽然能临时“解决”问题,但重启后失效,且会暴露其他端口风险;--permanent 参数必须加,否则重载后规则丢失。
确认MySQL监听地址不是127.0.0.1
即使端口开了,如果 MySQL 只监听本地回环地址,外部请求仍会被拒绝。错误配置常见于 /etc/my.cnf 或 /etc/mysql/my.cnf:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 检查
bind-address配置项:若为127.0.0.1或localhost,则仅接受本机连接 - 改为
0.0.0.0(监听所有 IPv4 地址)或具体内网 IP(如192.168.1.100) - 改完必须重启服务:
sudo systemctl restart mysqld(或mariadb) - 验证监听状态:
sudo ss -tlnp | grep :3306,输出中应含*:3306或具体 IP:3306
验证远程用户权限是否允许从非localhost登录
MySQL 默认的 root@localhost 用户无法从远程连接,必须显式授权:
- 登录 MySQL:
mysql -u root -p - 执行:
CREATE USER 'your_user'@'%' IDENTIFIED BY 'your_password';(%表示任意主机;生产环境建议用具体 IP 替代) - 赋予权限:
GRANT ALL PRIVILEGES ON your_db.* TO 'your_user'@'%'; - 刷新权限:
FLUSH PRIVILEGES; - 关键点:不要只改
root用户,它默认绑定localhost,改了也无效;新用户必须用@'%'或@'192.168.1.%'显式声明来源
Python客户端连接时别忽略connect_timeout参数
网络链路长或中间设备响应慢时,10 秒默认超时太短,容易误判为“连不上”:
- 在
pymysql.connect()中显式加大connect_timeout:connect_timeout=30 - 避免把超时归因于防火墙——如果
telnet your_ip 3306能通但 Python 连不上,大概率是权限或 MySQL 绑定问题,不是防火墙 - 调试时可先用
nc -zv your_ip 3306测试端口可达性,比 ping 更准确(ping 检查 ICMP,MySQL 走 TCP)
最常被忽略的是 bind-address 和用户 host 段的组合:哪怕防火墙全开、端口通、服务运行,只要 MySQL 不监听外网地址或用户没授权远程来源,(2003) 就一定会出现——它不区分“连不到”和“连上了但被拒”,统一报超时。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










