端口冲突是MySQL启动失败的首要原因,报错“Can't start server: Bind on TCP/IP port”即明确提示3306端口被占用;需用netstat与tasklist查PID及进程名,重点排查残留MySQL服务、Docker容器或国产软件,并同步修改my.ini、phpMyAdmin、应用配置及php.ini中相关端口参数。

MySQL启动报“Bind on TCP/IP port”就是端口冲突
看到错误日志里出现 Can't start server: Bind on TCP/IP port,不用犹豫,这就是端口冲突的铁证。XAMPP 或独立安装的 MySQL 默认用 3306,只要系统里有别的进程占着这个端口,mysqld.exe 就会立刻退出,控制面板卡在“正在启动…”然后变灰。
Windows 下快速查谁占了 3306 端口
别开任务管理器瞎翻,直接上命令:
-
netstat -ano | findstr :3306—— 查出 PID(比如显示1234) -
tasklist | findstr "1234"—— 看进程名(常见的是mysqld.exe、Docker Desktop、某些国产数据库服务或远程协作工具) - 如果查不到进程但端口仍被占,大概率是 Windows 服务里残留的 MySQL 服务(比如叫
MySQL80或mysql),进services.msc手动停掉或禁用
改端口不是改一个地方就完事
只改 my.ini 里的 port=3307,PHP 和应用照样连不上——因为它们默认认死 3306。
-
phpMyAdmin/config.inc.php中要同步改$cfg['Servers'][$i]['port'] = '3307'; - Laravel 的
.env要写DB_PORT=3307;WordPress 的wp-config.php要把DB_HOST改成'127.0.0.1:3307' - PHP 自身配置也要对齐:
php.ini里检查mysqli.default_port=3307和pdo_mysql.default_socket=(如果用了 socket,这里得留空或指向新路径)
杀不掉的 mysqld 进程常躲在服务里
关掉 XAMPP 控制面板,任务管理器也看不到 mysqld.exe,但 netstat 还显示 3306 被占?十有八九是 Windows 服务里注册过 MySQL,并设为“自动启动”。这时候光改配置没用,必须去 services.msc 找到对应服务(注意服务名可能是 MySQL、MySQL80、mysql57),右键停止,再设启动类型为“手动”或“禁用”。
真正容易被忽略的是:多个 MySQL 实例共存时,服务名、配置文件路径、数据目录三者可能完全错位,排查时得一个个核对,不能只盯一个 my.ini。


















