mysql的port和bind-address必须在配置文件[mysqld]段中修改并重启服务才生效,运行时set global会报错;port需检查占用,bind-address在8.0.13+支持多ip逗号分隔,旧版仅支持单值,且须同步配置防火墙与安全组。

MySQL 的 port 和 bind-address 必须在配置文件里改,不能运行时修改
MySQL 启动后,port 和 bind-address 就锁死了。执行 SET GLOBAL port = 3307 会直接报错 Variable 'port' is a read only variable;同样,bind-address 也无法用 SQL 动态调整。所有修改必须写进配置文件,然后重启服务才生效。
常见错误是只改了 [client] 段的 port,结果客户端连不上——那个只影响本地命令行默认端口,真正决定监听行为的是 [mysqld] 段下的 port 和 bind-address。
修改 port:确认路径、改对段落、检查端口占用
先定位配置文件:
- Linux 优先查
/etc/my.cnf或/etc/mysql/my.cnf,再看/etc/my.cnf.d/*.cnf - macOS(Homebrew)通常是
/usr/local/etc/my.cnf - Windows 是安装目录下的
my.ini(如C:\Program Files\MySQL\MySQL Server 8.0\my.ini)
在 [mysqld] 段下添加或修改:
[mysqld] port = 3307
改完别急着重启,先检查端口是否空闲:
- Linux/macOS:
ss -tlnp | grep :3307或lsof -i :3307 - Windows:
netstat -ano | findstr :3307
如果端口被占,换一个(比如 3308),否则 mysqld 启动会失败,日志里只有 “Address already in use” 这类提示,不报具体配置错误。
设置 bind-address:版本差异大,旧版不支持多地址
MySQL 8.0.12 及更早版本(包括所有 5.7)的 bind-address 只接受单个值:
-
127.0.0.1→ 只响应本地连接,远程连不上 -
192.168.1.10→ 只监听该网卡,localhost可能连不上(取决于 DNS 解析和host权限) -
0.0.0.0→ 监听所有 IPv4 接口,但必须靠防火墙和账号权限控访问范围
MySQL 8.0.13+ 才支持逗号分隔多个 IP:
bind-address = 192.168.1.10,127.0.0.1
注意:不能含通配符(0.0.0.0、*、:: 都非法),也不能混用无效格式(如 ["127.0.0.1","192.168.1.10"]),否则启动失败,错误日志里出现 Unknown variable 'bind-address' 或 Invalid argument。
改完必须同步处理防火墙、SELinux 和云安全组
配置文件改对了,不代表就能连上。常见连不上原因不是 MySQL 配置问题,而是系统级拦截:
- Linux iptables/firewalld:
sudo firewall-cmd --add-port=3307/tcp --permanent && sudo firewall-cmd --reload - SELinux(RHEL/CentOS):
sudo semanage port -a -t mysqld_port_t -p tcp 3307(需先装policycoreutils-python-utils) - 云服务器(阿里云、腾讯云、AWS):安全组规则必须手动添加新端口,仅改本地配置没用
另外,客户端连接时必须显式指定端口:mysql -h 192.168.1.10 -P 3307 -u root -p(注意是大写 -P,小写 -p 是密码)。
真正容易被忽略的是:即使 bind-address = 192.168.1.10,如果服务器有 Docker 或 Kubernetes 网络接口,且防火墙没设限,0.0.0.0 实际可能仍被间接暴露——bind-address 控制的是 socket 绑定层,不等于网络可达性控制。











