先执行SHOW GLOBAL VARIABLES LIKE 'port';确认当前端口,再用mysql --help | grep "Default options"定位真实配置文件路径,避免误改未加载的配置文件。

确认当前端口和真实配置文件路径
别急着改配置,先搞清 MySQL 正在用哪个端口、读的是哪份配置文件——硬套 /etc/my.cnf 很可能改错地方。执行 SHOW GLOBAL VARIABLES LIKE 'port'; 查到的 Value 才是当前生效值,不是“默认是 3306”就跳过这步。
查配置文件路径更关键:mysql --help | grep "Default options" 输出中带 my.cnf 的那行才是真实加载路径。常见位置包括:
-
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian) -
/etc/my.cnf或/etc/my.cnf.d/*.cnf(CentOS/RHEL) -
C:\ProgramData\MySQL\MySQL Server X.X\my.ini(Windows)
还要注意启动命令是否带 --defaults-file=,这种显式指定会覆盖所有默认查找逻辑。
只改 [mysqld] 段的 port,但必须同步检查 bind-address
port 参数只在 [mysqld] 段下起作用,[client] 或 [mysql] 段里的 port 只影响本地命令行默认行为,不改变监听端口。编辑配置时,在 [mysqld] 下添加或修改这一行即可:
port = 3307
但光改端口不够:如果 bind-address = 127.0.0.1,新端口也只监听本地回环,远程连接照样失败。需要按需调整:
- 仅本机访问:保留
bind-address = 127.0.0.1 - 允许远程访问:改成
bind-address = 0.0.0.0或具体内网 IP,如192.168.1.100
改完保存前,务必用 sudo lsof -i :3307 或 sudo ss -tuln | grep :3307 确认该端口未被占用。
重启前杀净残留进程,重启后逐层验证监听
很多“改了不生效”本质是旧 mysqld 进程还在跑。先停服务:sudo systemctl stop mysql(Debian/Ubuntu)或 sudo systemctl stop mysqld(RHEL/CentOS),再手动扫残留:
-
ps aux | grep mysql,看到mysqld或mysqld_safe进程就sudo kill -9 PID - Docker 用户:运行
docker ps,若有 MySQL 容器占着目标端口,先docker stop
重启后别信 systemctl status 显示 active 就万事大吉。必须验证三层:
- 系统监听:
sudo ss -tlnp | grep :3307(Linux)或netstat -ano | findstr :3307(Windows),看是否有mysqld绑定 - MySQL 内部变量:
SELECT @@port;登录后执行,确认运行时值已更新 - 客户端连通:
mysql -h 127.0.0.1 -P 3307 -u root -p(注意大写-P),避免走 socket 文件绕过网络栈
防火墙、SELinux、云安全组和客户端配置一个都不能漏
端口改了但连不上,八成卡在这四个环节:
- Linux 防火墙:
firewall-cmd --list-ports看是否放行,没的话补上firewall-cmd --permanent --add-port=3307/tcp && firewall-cmd --reload - SELinux(RHEL/CentOS):
sudo semanage port -a -t mysqld_port_t -p tcp 3307,否则策略会阻止绑定 - 云服务器(阿里云/AWS):安全组规则必须手动更新,只改本地配置毫无意义
- 客户端连接参数:所有调用方都得显式指定新端口——命令行加
-P 3307,代码里改连接字符串的port字段,图形工具填端口输入框
宝塔用户额外注意:面板自身依赖 MySQL,必须同步改 /www/server/panel/class/mysql.py 和 /www/server/panel/data/default.db 里的端口号,再 bt restart,否则面板数据库功能会异常。


















