可以在同一台机器上共存mysql 5.7和8.0,关键在于端口、datadir、socket路径、服务名及配置文件必须完全隔离:端口需显式设为3307/3308等非默认值;datadir须为全新空目录且属主正确;socket路径需与客户端-s参数严格对应;windows下服务名须分别为mysql57/mysql80;每个版本必须使用独立配置文件并启动时强制指定--defaults-file;连接时须明确指定端口或socket,避免连错实例。

不能靠改 PATH 或加 alias 切换 MySQL 版本——那只会骗过命令行客户端,服务端压根不受影响,连错实例、删错库都是分分钟的事。
用独立端口 + 独立 data 目录启动不同版本实例
同一台机器上跑 mysqld 5.7 和 8.0,最基础的隔离就是三样不重叠:端口、datadir、socket 文件路径。缺一不可。
-
port=3307和port=3308必须显式写在各自配置文件里,不能依赖默认 3306 -
datadir必须是全新空目录(或从备份恢复),严禁复用/var/lib/mysql或 XAMPP 的mysql/data -
socket=/tmp/mysql57.sock这类路径要和客户端连接时的-S参数严格对应 - Windows 下还要额外隔离 Windows 服务名,比如注册为
MySQL57和MySQL80,否则net start mysql会随机启一个
配置文件必须按版本拆开,且启动时强制指定
把 [mysqld] 段全塞进一个 my.cnf 里,mysqld 只当它是单实例配置,后写的参数会覆盖前写的——根本起不到多实例效果。
- 每个版本配专属配置文件,如
/etc/my57.cnf和/etc/my80.cnf,开头必须是[mysqld] - 启动命令必须带
--defaults-file=/etc/my57.cnf,漏掉就 fallback 到全局/etc/my.cnf或编译默认路径 - systemd 服务里不能只写
ExecStart=/usr/bin/mysqld,得补全--defaults-file=...,否则 reload 后照样读错配置 - Windows 下注册服务时,
mysqld --install MySQL57 --defaults-file=C:\mysql57\my.ini中的路径必须是绝对路径,相对路径会静默失败
连接时必须显式指定目标实例,别信 localhost
mysql -u root -p 默认走 socket 连接,而 socket 路径由服务端配置决定——你没指定,它就去连系统默认路径,大概率连到第一个启动的实例上。
- 连 5.7 实例:用
mysql -S /tmp/mysql57.sock -u root -p(Linux/macOS)或mysql -P 3307 -h 127.0.0.1 -u root -p(强制 TCP) - 连 8.0 实例:注意认证插件,默认
caching_sha2_password会让老 PHP/PDO 报ERROR 2059,登录后立刻执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 脚本或 CI 中禁止硬编码
mysql命令,应统一用完整路径 +--defaults-file,例如/opt/mysql-8.0.33/bin/mysql --defaults-file=/etc/my80.cnf -e "SELECT VERSION();"
最容易被忽略的是数据目录权限和初始化方式:datadir 目录属主必须是 mysql:mysql(Linux),Windows 下则要确保当前用户有完全控制权;初始化必须用对应版本的 mysqld --initialize,跨版本复用 ibdata1 或日志文件会导致 InnoDB: Unsupported redo log format 直接启动失败。











