先查配置文件路径和当前端口:执行mysql --help | grep "default options"定位实际生效的.cnf或.ini文件,再用show global variables like 'port'确认监听端口,避免误信默认值。

改端口本身不危险,但改完连不上是大概率事件——原因几乎都出在配置、重启、防火墙、客户端这四个环节上。
怎么确认当前端口和实际生效的配置文件?
别信“默认是3306”就跳过这步,先查清楚你用的是哪个配置文件、当前端口是多少:
- 查当前监听端口:
mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'port';" - 查 MySQL 实际读取的配置路径:
mysql --help | grep "Default options",输出里带.cnf或.ini的那行就是 - 常见路径(别硬套):
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)、/etc/my.cnf(CentOS/RHEL)、C:\ProgramData\MySQL\MySQL Server X.X\my.ini(Windows)
只改 [mysqld] 段的 port,别碰错地方
[client] 或 [mysql] 段里的 port 不影响服务监听,纯属客户端默认行为,可不加:
- 编辑配置文件,在
[mysqld]段下添加或修改:port = 3307(选 1024–65535 之间、未被占用的数字) - 检查端口是否空闲:
sudo lsof -i :3307或sudo ss -tuln | grep :3307,返回空才安全 - 别在
[mysqld]里写bind-address = 127.0.0.1后还指望远程连——这是独立问题,需同步调整 - 保存后确认文件权限:MySQL 进程得有读取权,否则启动直接失败
重启前必须杀干净残留进程
很多“改了不生效”其实是旧进程没退干净,尤其是 Docker、systemd 多实例、或之前手动 mysqld_safe 启动过的情况:
- 先停服务:
sudo systemctl stop mysql(Ubuntu/Debian)或sudo systemctl stop mysqld(CentOS/RHEL) - 再扫残留:
ps aux | grep mysql,看到mysqld或mysqld_safe进程就sudo kill -9 PID - Docker 用户注意:
docker ps看是否还有运行中的 MySQL 容器占着目标端口,有就得docker stop - 最后启动:
sudo systemctl start mysql,并立刻检查状态:sudo systemctl status mysql
连接失败时优先排查这三处
重启后 SHOW GLOBAL VARIABLES LIKE 'port' 显示新值 ≠ 你能连上。真实卡点往往在这儿:
- 客户端命令必须显式指定新端口:
mysql -u root -p -P 3307(注意是大写-P,小写-p是密码) - 防火墙/SELinux/云安全组没同步放开新端口:Linux 上用
firewall-cmd --add-port=3307/tcp --permanent,RHEL/CentOS 还要semanage port -a -t mysqld_port_t -p tcp 3307 - 应用程序(如 PHP、Java 应用)里的数据库连接字符串仍写的是
:3306,必须同步更新
最容易被忽略的是:改了端口却忘了改应用层连接配置,或者以为开了防火墙就万事大吉,结果 SELinux 或云平台安全组根本没动。











