先确认3306是否真被占用:windows用netstat -ano | findstr :3306,linux/macos用sudo lsof -i :3306或sudo ss -tuln | grep :3306;若有非mysqld进程则需处理,无输出则查mysql服务状态;改端口须在[mysqld]段设port=3307、确认配置文件路径、重启服务,并验证bind-address与skip-networking设置。

直接查谁在用3306,别猜是不是MySQL自己没启好——90%的“Address already in use”根本不是MySQL的问题,而是另一个进程(比如旧实例、Docker容器、IDE代理)正占着端口。
怎么确认3306真被占了,而不是MySQL压根没启动
报错 Address already in use 才说明端口冲突;如果只是 Can't connect to MySQL server on 'localhost' (111) 或 (10061),大概率是服务根本没跑起来。
- Windows:管理员权限运行
netstat -ano | findstr :3306,有输出且状态是LISTENING才算真被占 - Linux/macOS:
sudo lsof -i :3306或sudo ss -tuln | grep :3306,看到非mysqld的进程名(比如docker-proxy、java、phpstorm)就得处理 - 命令没输出?立刻查服务状态:
systemctl status mysql(Linux)或打开“服务”管理器看MySQL80是否为“已停止”
查到PID后,怎么判断能不能杀
PID只是个数字,关键得知道它背后是谁。盲目 kill -9 或 taskkill /F 可能干掉正在提供服务的实例,甚至中断其他依赖程序。
- Windows:
tasklist | findstr "1234"(把 1234 换成实际 PID),重点看Image Name列:mysqld.exe要小心——可能是你忘了关的旧实例,也可能是宝塔/AMPPS 自带的 MySQL - Linux/macOS:
ps -p 1234 -o comm=,输出docker-proxy就说明有容器映射了 3306,得查docker ps后停容器,不是杀宿主机进程 - 能安全终止的常见目标:
phpenv-mysql.exe(phpEnv残留)、DataGrip/PhpStorm 的“Database Tools”面板、XAMPP/MAMP 后台服务、重复注册的 MySQL 服务(如 Windows 上同时存在MySQL57和MySQL80)
改配置换端口时最容易踩的三个坑
改 port = 3307 不是改完保存就完事。配错位置、漏重启、忽略配套项,都会让修改完全失效。
- 必须加在
[mysqld]段下,写成Port = 3307(大小写敏感)或放在[client]段都无效 - 配置文件路径不能猜:Windows 优先查
C:\Program Files\MySQL\MySQL Server 8.0\my.ini,Linux 用mysqld --help --verbose | grep "Default options"确认真实加载路径;Docker 容器内得进容器改/etc/mysql/my.cnf - 改完必须重启服务:
net stop mysql & net start mysql(Windows)、sudo systemctl restart mysqld(CentOS)、brew services restart mysql(macOS Homebrew);不重启等于白改
最容易被忽略的是:bind-address 和 skip-networking 这两个参数——哪怕端口改对了,设错也会让服务“监听了却连不上”。验证时别只看 netstat 输出,一定要用 mysql -u root -p -P 3307 实际连一下。











