修改mysql端口需同步配置文件[mysqld]段port参数、重启mysqld进程、开放系统防火墙及云安全组、客户端连接时显式指定新端口,缺一不可;须先用show variables like 'port'和ss/netstat确认实际监听端口,再查mysqld --verbose --help定位真实配置路径。

改 MySQL 端口本身很简单,但连不上几乎全是配置漏项导致的——port 改了、服务重启了,不代表就能通。关键在四点同步:配置文件、MySQL 进程、系统防火墙、客户端连接参数。
确认当前端口和配置文件路径
别凭印象改,先看 MySQL 实际在用哪个配置、监听哪个端口:
- 登录 MySQL 后执行:
SHOW VARIABLES LIKE 'port';—— 这是它自称的端口 - 查操作系统监听:
ss -tuln | grep mysql或netstat -tuln | grep :3306—— 这是它实际绑定的端口(可能和上一条不一致) - 找真实生效的配置文件:
mysqld --verbose --help 2>/dev/null | grep "Default options",常见路径有:/etc/mysql/my.cnf、/etc/my.cnf、/www/server/mysql/my.cnf(宝塔)、C:\ProgramData\MySQL\MySQL Server X.X\my.ini(Windows)
修改 my.cnf 中的 port 并重启服务
只改 [mysqld] 段下的 port,其他地方加端口会出错:
- 打开配置文件,在
[mysqld]下添加或修改这一行:port = 3307(推荐 1024–65535 范围内未被占用的端口) -
不要写成
bind-address = 127.0.0.1:3307——bind-address只接受 IP,加端口会导致 MySQL 启动失败 - 保存后重启服务:
systemctl restart mysqld(CentOS/Rocky)或systemctl restart mysql(Ubuntu/Debian) - 重启失败?立刻看日志:
journalctl -u mysqld -n 50 -f,90% 是端口被占或配置语法错误
同步开放系统防火墙和 SELinux(如启用)
本地配置改完,系统级防护没跟上,等于白改:
- firewalld(主流 CentOS/Rocky/AlmaLinux):
firewall-cmd --add-port=3307/tcp --permanent && firewall-cmd --reload - ufw(Ubuntu/Debian):
ufw allow 3307/tcp - SELinux(RHEL系):
semanage port -a -t mysqld_port_t -p tcp 3307(若提示 command not found,先装:yum install policycoreutils-python-utils) - 云服务器(阿里云、腾讯云、AWS):安全组规则必须手动新增入方向 TCP 3307,仅改本地防火墙无效
客户端连接时必须显式指定新端口
MySQL 客户端默认只连 3306,改了端口不加参数就必然失败:
- 命令行连接:
mysql -h 127.0.0.1 -P 3307 -u root -p(注意是大写-P,小写-p是密码) - 应用连接字符串里也要补全端口,例如 JDBC:
jdbc:mysql://localhost:3307/dbname - 宝塔面板用户:改完端口后,需进「数据库」→「管理」→「修改」,把连接端口也同步改成新值,否则面板连不上自己的库
最容易被忽略的是:改端口后,旧连接还在用 3306 缓存,或者应用配置没更新,又或者以为开了防火墙就万事大吉,却忘了 SELinux 或云平台安全组。验证是否真通,唯一可靠方式是用 mysql -h 服务器IP -P 新端口 -u 用户 -p 从外部机器直连一次。











