mysql启动失败若报“bind on tcp/ip port”即端口冲突,首要排查3306是否被占用;需依次检查进程、服务、docker容器,并同步更新my.ini、phpmyadmin、应用配置及php.ini中的mysqli.default_port和pdo_mysql.default_socket。

MySQL 启动失败时先看 error.log 里有没有 Can't start server: Bind on TCP/IP port
这是端口冲突最直接的信号。XAMPP 默认用 3306 端口启动 MySQL,只要系统里已有其他进程占着这个端口,mysqld.exe 就会立刻退出,控制面板显示“正在启动…”然后变灰。
别急着改配置,先确认是不是真被占了:
- Windows 上打开命令提示符,运行
netstat -ano | findstr :3306,看输出里有没有 PID - 如果有,再用
tasklist | findstr "PID号"查进程名(常见的是另一个 MySQL 实例、Docker 的 mysql 容器、或某些国产软件自带的数据库服务) - Mac/Linux 用户可用
lsof -i :3306或sudo ss -tulpn | grep :3306
改 my.ini 里的 port 不等于万事大吉
只改 MySQL 配置文件中的 port=3307,不等于 PHP 或应用能自动连上新端口。XAMPP 自带的 phpMyAdmin、WordPress、Laravel 的 .env 文件,都默认写死 3306。
实操建议分三步走:
- 改 XAMPP 控制面板右下角的
Config → my.ini,找到[mysqld]段,把port=3306改成port=3307 - 同步改
phpMyAdmin/config.inc.php里的$cfg['Servers'][$i]['port'] = '3307'; - 本地开发项目中所有数据库连接配置(如 Laravel 的
DB_PORT=3307、WordPress 的wp-config.php中define('DB_HOST', '127.0.0.1:3307'))也得手动更新
杀不掉的 mysqld.exe 进程常藏在后台服务里
有时候你关掉 XAMPP 控制面板,任务管理器里也看不到 mysqld.exe,但 netstat 仍显示 3306 被占——大概率是 Windows 服务里装过 MySQL 作为系统服务,且设为“自动启动”。
检查和清理方法:
- 运行
services.msc,找名字含MySQL或MariaDB的服务,右键 → 停止,再右键 → 属性 → 启动类型改为“手动”或“禁用” - 如果服务名是
MySQL80或mysql57,别手抖删注册表,用命令行安全卸载:sc delete MySQL80(管理员权限运行) - Docker 用户注意:
docker ps看是否有运行中的 mysql 容器,docker stop $(docker ps -q --filter ancestor=mysql)可批量停掉
改端口后 PHP 连不上?重点查 mysqli.default_port 和 pdo_mysql.default_socket
即使你在代码里显式指定 localhost:3307,PHP 内部仍可能按默认端口尝试连接,尤其用 mysqli_connect('localhost') 这种简写时。
检查 php.ini 中这两项:
-
mysqli.default_port=3306→ 改成3307 -
pdo_mysql.default_socket=这行如果非空(比如指向/tmp/mysql.sock),会优先走 socket 连接,绕过端口设置;留空或注释掉它,强制走 TCP - 改完重启 Apache,再用
phpinfo()确认值已生效
端口改得再顺,漏掉这俩配置,mysqli_connect() 仍可能静默失败,错误日志里还不报端口问题——这点最容易被跳过。











