必须同时隔离端口、服务名、数据目录和配置文件路径四项:mysql 5.7 保持3306,8.0 改为3307;在[mysqld]段写明port=3307、socket=/tmp/mysql80.sock、datadir=/usr/local/mysql80/data;windows需用mysqld --install mysql80指定唯一服务名,linux需新建独立systemd unit文件;客户端须显式指定端口与配置文件。

必须改端口,且不能只改一个地方——端口、服务名、数据目录、配置文件路径,四项必须全部隔离,缺一不可。
修改 MySQL 5.7 或 8.0 的 my.cnf 端口配置
默认都用 3306,不改必然冲突。选一个版本改端口(推荐让旧版 5.7 保持 3306,新版 8.0 改为 3307),在对应配置文件的 [mysqld] 段落里明确写死:
[mysqld] port = 3307 socket = /tmp/mysql80.sock datadir = /usr/local/mysql80/data
注意:socket 路径也得同步改,否则客户端连接时会因找不到 socket 文件而报 Can't connect to local MySQL server through socket;datadir 必须是绝对路径且不能与 5.7 共用。
Windows 下注册服务时必须指定唯一服务名
直接运行 mysqld --install 会注册默认服务名 MySQL,两个版本会互相覆盖。必须显式命名:
mysqld --install MySQL57 --defaults-file="D:\mysql-5.7\my.ini"mysqld --install MySQL80 --defaults-file="D:\mysql-8.0\my.ini"
服务名重复会导致 net start MySQL80 失败,并在事件查看器中看到 The service already exists。注册后用 sc query MySQL57 和 sc query MySQL80 确认两者都存在。
Linux 下避免 systemctl 服务名冲突
不能都叫 mysqld。需为 8.0 创建独立 unit 文件,例如 /etc/systemd/system/mysqld80.service:
[Unit] Description=MySQL Server 8.0 After=network.target [Service] Type=forking User=mysql Group=mysql ExecStart=/usr/local/mysql80/bin/mysqld --defaults-file=/usr/local/mysql80/my.cnf Restart=on-failure [Install] WantedBy=multi-user.target
然后启用:systemctl daemon-reload && systemctl enable mysqld80 && systemctl start mysqld80。检查状态用 systemctl status mysqld80,和 mysqld(5.7)完全分离。
命令行客户端调用时如何避免版本混淆
PATH 环境变量里如果同时有 5.7 和 8.0 的 bin 目录,mysql --version 显示的永远是 PATH 中排前面的那个。临时切换方法:
- 用绝对路径调用:
/usr/local/mysql57/bin/mysql -P3306 -uroot -p - 或显式指定配置:
mysql --defaults-file=/usr/local/mysql80/my.cnf -P3307 -uroot -p - 别依赖
mysql命令自动识别端口——它不会读取远程服务的my.cnf,只读本地配置
真正容易被忽略的是:即使端口改了,如果没改服务名(Windows)或 unit 名(Linux),系统级管理命令仍会失败;而 socket 文件路径不改,本地 Unix socket 连接就会静默失败,错误信息还很模糊。











