mysql多实例共存必须五项隔离:端口、数据目录、socket文件、服务名、配置文件,缺一不可;否则易导致连错库、删错表、启动失败或数据损坏。

能共存,但必须让两个实例在操作系统层面“互不认识”——端口、数据目录、socket 文件、服务名、配置文件,五样全隔离,缺一不可。靠改 PATH 或 alias 切换版本,只会让你连错库、删错表。
端口和 socket 路径必须显式指定且不重叠
MySQL 默认监听 3306 和 /tmp/mysql.sock,两个实例共存时,这些资源会直接冲突。客户端不指定目标,就默认连第一个启动的实例(通常是 5.7),根本不管你想用哪个版本。
-
port=3307和port=3308必须写在各自配置文件的[mysqld]段里,不能依赖默认值 -
socket=/tmp/mysql57.sock和socket=/tmp/mysql80.sock要分别设置,且路径需与客户端的-S参数严格一致 - 连接 5.7 实例时,别用
mysql -h localhost(它走 socket,默认找系统路径);要用mysql -S /tmp/mysql57.sock -u root -p或mysql -P 3307 -h 127.0.0.1 -u root -p(强制走 TCP) - Windows 下没有 socket,但
named_pipe和shared_memory也要关闭或隔离,避免意外互通
每个版本必须用独立 data 目录和独立配置文件启动
data 目录不是“放数据库的地方”那么简单——它包含 ibdata1、redo log、binlog、user tables、甚至 server UUID。复用目录会导致启动失败、崩溃或数据损坏。
-
datadir必须是全新空目录(或从备份恢复),严禁指向/var/lib/mysql或 XAMPP 的mysql/data - 配置文件要拆开:比如
/etc/my57.cnf和/etc/my80.cnf,开头都必须是[mysqld],不能塞进同一个文件靠注释切换 - 启动命令必须带
--defaults-file=/etc/my57.cnf;漏掉就 fallback 到全局/etc/my.cnf,大概率读错配置 - Linux systemd 服务中,
ExecStart不能只写/usr/bin/mysqld,必须补全--defaults-file=,否则systemctl reload后照样连错实例
Windows 下注册服务名和初始化命令最容易踩坑
Windows 不像 Linux 那样靠进程 PID 区分实例,它靠服务名。如果两个都叫 MySQL,net start mysql 就会随机启一个,且无法精确控制。
- 服务名必须不同:例如
mysqld --install MySQL57 --defaults-file=C:\mysql57\my.ini和mysqld --install MySQL80 --defaults-file=C:\mysql80\my.ini -
--defaults-file路径必须是绝对路径,相对路径会静默失败,服务看似安装成功,实则启动时报错 - 初始化时用
mysqld --defaults-file=... --initialize --console,输出的临时密码只对当前datadir有效;如果忘记加--defaults-file,它可能去读另一个版本的配置,初始化到错误目录,导致后续启动失败 -
my.ini文件编码必须是 ANSI(Notepad 可转),UTF-8 BOM 或纯 UTF-8 在某些 Windows 版本下会触发Found option without preceding group错误
连接 MySQL 8.0 时认证插件不兼容老客户端
MySQL 8.0 默认用 caching_sha2_password,PHP 7.4 以下、旧版 PDO、部分 GUI 工具(如 Navicat 旧版)会直接报 ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded。
- 首次登录后立刻执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 或者在 8.0 的配置文件中提前加:
default_authentication_plugin=mysql_native_password(仅限开发环境,生产慎用) - 脚本或 CI 中禁止硬编码
mysql命令,应统一用完整路径 +--defaults-file,例如:/opt/mysql-8.0.33/bin/mysql --defaults-file=/etc/my80.cnf -S /tmp/mysql80.sock -u root -p
最常被忽略的一点:所有操作都要以「实例」为单位,而不是以「版本」为单位。你不是在“装 MySQL 8.0”,而是在“启动一个监听 3308、数据存在 /data/mysql/3308/data、配置来自 /etc/my80.cnf 的独立 mysqld 进程”。只要有一个环节没隔离干净,就等于把两套钥匙塞进同一把锁里——看着都对,用起来全错。











