MySQL修改默认端口必须修改my.cnf或my.ini配置文件中的[mysqld]段port=3307,重启服务生效;命令行参数仅临时有效,且需同步调整防火墙、SELinux、安全组、bind-address及所有客户端连接配置。

MySQL 修改默认端口必须改 my.cnf 或 my.ini
MySQL 启动时只读取配置文件中指定的端口,命令行参数(如 --port=3307)仅对单次临时启动有效,无法持久化。生产环境必须修改配置文件,否则服务重启后端口自动恢复为 3306。
常见错误现象:netstat -tuln | grep :3307 看不到监听,但 mysql -P3307 -u root -p 却能连上——说明客户端连的是另一个正在运行的实例(比如 Docker 容器或 homebrew 安装的 MySQL),而非你本地修改了配置却没重启的那个。
- Linux/macOS 路径通常是
/etc/my.cnf、/etc/mysql/my.cnf或/usr/etc/my.cnf;用mysqld --help --verbose | grep "Default options"可确认实际加载路径 - Windows 下一般是
C:\ProgramData\MySQL\MySQL Server X.X\my.ini(注意ProgramData是隐藏目录) - 在
[mysqld]段落下添加或修改port=3307,**不要**写在[client]或其他节里 - 改完必须执行
sudo systemctl restart mysql(或mysqld restart),仅 reload 不生效
防火墙和 SELinux 会拦截非标准端口
端口改了但外网/其他机器连不上?大概率是系统层拦住了。MySQL 自身不处理网络访问控制,全靠操作系统。
- Linux 上检查:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS/RHEL),需显式开放新端口,例如sudo ufw allow 3307 - SELinux(RHEL/CentOS)默认只允许
mysql_port_t类型绑定到 3306。要支持 3307,得运行:sudo semanage port -a -t mysql_port_t -p tcp 3307;若提示 command not found,先装policycoreutils-python-utils - 云服务器(如阿里云、AWS)安全组规则也必须同步放行新端口,这个常被忽略
bind-address 配置决定能否被远程连接
即使端口改了、防火墙开了,远程仍连不上,90% 是 bind-address 设错了。它控制 mysqld 监听哪个 IP,不是“允许谁来连”。
-
bind-address = 127.0.0.1:只响应本地连接,改端口也没用(外部根本连不到这个 socket) -
bind-address = 0.0.0.0:监听所有 IPv4 接口(含公网 IP),配合防火墙才可远程访问 -
bind-address = 192.168.1.100:只监听该内网 IP,适合多网卡服务器 - MySQL 8.0+ 默认值可能是
127.0.0.1,不是0.0.0.0,这点和老版本不同
客户端连接时必须显式指定新端口
MySQL 客户端(包括 mysql 命令、PHP 的 mysqli_connect()、Python 的 pymysql.connect())不会自动读取服务端配置,端口不匹配就直接报错。
- 命令行:
mysql -h 127.0.0.1 -P3307 -u root -p(注意是大写-P,小写-p是密码) - PHP:
mysqli_connect('127.0.0.1', 'root', 'pwd', '', 3307);如果用localhost会走 socket,无视端口 - 连接字符串里写
host=localhost就算加了port=3307也无效,因为 Unix socket 优先级高于 TCP - Docker 运行时记得加
-p 3307:3307,且容器内 mysqld 配置的port和bind-address也要匹配










