改MySQL端口需同步调整my.cnf的port参数、firewalld/iptables规则、SELinux策略及云安全组,四者缺一不可;仅改配置文件重启服务会导致连接失败。

改MySQL端口本身只要改my.cnf里的port参数再重启服务就行,但90%的人卡在连不上——问题几乎都出在防火墙没同步放开、SELinux拦着、或者云安全组忘更新。
确认当前配置和端口占用情况
别急着改,先看清楚现状。MySQL可能读取多个配置文件,mysqld --verbose --help | grep "Default options"能列出它实际加载的路径(常见是/etc/my.cnf或/etc/my.cnf.d/mysql-server.cnf)。用netstat -tulnp | grep :3306确认当前监听端口;再用netstat -tulnp | grep :新端口号检查目标端口是否已被其他进程占着——比如3307常被某些监控工具默认占用。
- 如果
mysqld正在运行,先systemctl stop mysqld停掉,避免配置热加载失败 - 修改前务必
cp /etc/my.cnf /etc/my.cnf.bak备份,有些系统会从/etc/my.cnf.d/下多个文件合并加载,得一并检查 - 端口建议选
33060、3307这类好记的高端口,避开1024以下需root权限的范围
编辑my.cnf并重启mysqld服务
打开配置文件,在[mysqld]段下添加或修改port值,例如:port = 3307。注意:如果该段里已有bind-address,要确认它和你的访问需求匹配——设成127.0.0.1就只能本地连,设0.0.0.0才支持远程,但后者必须配防火墙白名单。
- 保存后执行
systemctl daemon-reload(部分旧版本需要) - 再
systemctl start mysqld启动,别用restart,避免因配置错误导致服务起不来却没报错 - 启动后立刻验证:
ss -tlnp | grep :3307看是否监听成功,再用mysql -h 127.0.0.1 -P 3307 -u root -p本地测试连接
firewalld必须放行新端口且重载规则
firewall-cmd只认“永久规则”,临时添加的规则重启后就丢。改端口后不执行--permanent参数等于白干。CentOS/RHEL 7+默认用firewalld,命令必须带--permanent再--reload:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
sudo firewall-cmd --zone=public --add-port=3307/tcp --permanent sudo firewall-cmd --reload
如果之前开了3306,可顺手关掉:sudo firewall-cmd --zone=public --remove-port=3306/tcp --permanent。注意:这条命令不会立即生效,必须--reload才会从规则中剔除。
- 运行
firewall-cmd --list-ports确认新端口已列在输出里 - 如果用的是
iptables(非firewalld),得手动加规则:iptables -A INPUT -p tcp --dport 3307 -j ACCEPT,再service iptables save持久化 - Ubuntu用户请换用
ufw allow 3307/tcp,别混用工具
SELinux和云安全组常被忽略
CentOS/RHEL上SELinux默认只允许mysqld绑定3306,改端口后会静默拒绝——journalctl -u mysqld里能看到avc: denied报错。必须显式授权:sudo semanage port -a -t mysqld_port_t -p tcp 3307。若提示command not found,先装policycoreutils-python-utils。
- 云服务器(阿里云、AWS、腾讯云)的安全组是独立于本地防火墙的,必须手动在控制台添加入方向规则,源IP尽量精确,别填
0.0.0.0/0 - 客户端连接字符串也要同步更新,比如JDBC URL里的
:3306要改成:3307,否则应用照样连旧端口然后超时 - 如果改完发现连接时快时慢,可能是防火墙
conntrack表超时太短,查sysctl net.netfilter.nf_conntrack_tcp_timeout_established,临时调大到86400
真正麻烦的从来不是改那一行port,而是四个地方必须同时对齐:MySQL配置、systemd服务状态、firewalld/iptables规则、SELinux策略(或云安全组)。漏一个,就白折腾半小时。

















