应优先终止占用进程,仅当无法停止(如生产环境共存多实例)时才修改MySQL配置port为3307并重启服务,同时需同步调整客户端连接、防火墙及云安全组规则。

确认3306端口到底被谁占了
不查清占用者就改配置或杀进程,容易误停关键服务。先用命令定位真实来源:
- Windows:
netstat -ano | findstr :3306,拿到 PID 后再执行tasklist | findstr "PID"看进程名 - Linux/macOS:
sudo lsof -i :3306或sudo ss -tuln | grep :3306
常见占用者包括:mysqld(旧 MySQL 实例)、mariadbd(MariaDB)、Docker 容器里的 mysql 镜像、Navicat/IDE 内置代理、XAMPP/MAMP 未退出后台。特别注意:如果 mysqladmin -u root -p ping 能通,说明这个 mysqld 就是你本该用的实例,别杀。
能停就停,别急着改配置
改端口是兜底方案,不是首选。多数情况直接释放端口更安全、省事:
- Docker 容器:用
docker ps找容器名,再docker stop container_name - 系统服务(Linux):确认无业务影响后,
sudo systemctl stop mysql或sudo systemctl stop mariadb - Windows 服务:进“服务”管理器,找
MySQL80或类似名称的服务右键停止 - IDE 或 GUI 工具:关闭 DataGrip、Navicat、PhpStorm 数据库工具等,它们常悄悄监听 3306
杀进程前务必确认——kill -9 或 taskkill /F /PID 是最后手段,尤其在生产环境或公司内网,可能触发告警或中断其他依赖服务。
必须改端口时,只动 [mysqld] 段的 port
只有当占用者不能停(比如共存多实例、策略禁止终止),才改 MySQL 自身端口。关键点:
- 找到真正生效的配置文件:
mysqld --help --verbose | grep "Default options"查路径;Windows 常为C:\Program Files\MySQL\MySQL Server 8.0\my.ini,Linux 常为/etc/my.cnf或/etc/mysql/my.cnf - 只编辑
[mysqld]段下的port行,例如:port = 3307;别碰[client]或[mysql]段里的port,那些不影响服务监听 - 大小写敏感,等号前后不能有空格,别写成
Port = 3307或port: 3307
Docker 启动的 MySQL 不读宿主机配置,得进容器改 /etc/mysql/my.cnf,或挂载自定义配置卷。
改完端口后连不上?四个地方必查
端口改了但客户端连失败,大概率漏了以下某一项:
- MySQL 服务没重启:
sudo systemctl restart mysql(Debian/Ubuntu)或sudo systemctl restart mysqld(CentOS/RHEL);Windows 用net stop mysql && net start mysql - 防火墙没放行新端口:Linux 用
sudo firewall-cmd --add-port=3307/tcp --permanent,Windows 在“高级安全防火墙”里加入站规则 - 客户端没指定新端口:命令行连要用
mysql -u root -p -P 3307(注意大写-P);应用连接字符串里也要显式写:3307 -
bind-address或skip-networking没同步调整:如果原配置限制了监听地址或禁用了网络,新端口照样不对外暴露
最易忽略的是 Docker 容器启动时没映射新端口,比如 docker run -p 3307:3307 写成 3306:3306,结果容器内监听 3307,宿主机却没暴露出去。


















