MySQL多版本共存需隔离端口、socket文件路径和数据目录;各实例须用独立配置文件(如my_57.cnf)、显式指定--defaults-file启动,并匹配对应版本的mysql_upgrade。

MySQL 多版本共存的核心前提:端口、socket、数据目录必须隔离
同一台机器上跑多个 MySQL 实例,不是简单解压几个 mysqld 二进制就能并存的。冲突点集中在三处:port、socket 文件路径、datadir。只要这三项不重叠,实例之间就互不干扰。官方推荐用 mysqld --initialize --datadir=... 初始化各自独立的数据目录,而不是复用默认 /var/lib/mysql。
用 mysqld_safe 启动多实例时,配置文件怎么分?
每个实例应有自己专属的 my.cnf(或通过 --defaults-file 指定),不能共用全局配置。常见错误是把多个 [mysqld] 段写进同一个文件——这只会被当作一个实例读取,后加载的参数覆盖前一个。
- 为 5.7 实例准备
/etc/my_57.cnf,开头加[mysqld],设置port = 3307、socket = /tmp/mysql_57.sock、datadir = /var/lib/mysql57 - 为 8.0 实例准备
/etc/my_80.cnf,设port = 3308、socket = /tmp/mysql_80.sock、datadir = /var/lib/mysql80 - 启动命令必须显式指定配置:
mysqld_safe --defaults-file=/etc/my_57.cnf &
mysqld_safe --defaults-file=/etc/my_80.cnf &
mysql 命令行客户端如何自动连对应版本?
默认 mysql 命令走的是 localhost(即 socket 连接),而 socket 路径由服务端配置决定。若没指定 -S 或 -h,它会尝试连接默认 socket(通常是 /var/run/mysqld/mysqld.sock),大概率连错。
- 连 5.7 实例:
mysql -S /tmp/mysql_57.sock -u root -p
- 连 8.0 实例:
mysql -S /tmp/mysql_80.sock -u root -p
- 或者用 TCP 显式指定端口:
mysql -h 127.0.0.1 -P 3308 -u root -p
(注意:用127.0.0.1而非localhost才会走 TCP)
systemd 管理多实例时,service 文件容易漏掉的关键项
如果用 systemd 启动,每个实例需独立的 .service 文件(如 mysql@57.service),且 ExecStart 必须包含 --defaults-file,否则会 fallback 到全局 /etc/my.cnf,导致参数混乱。
-
Environment="MYSQLD_OPTS=--defaults-file=/etc/my_57.cnf"是必要声明 -
RuntimeDirectory=mysqld57可配合 socket 路径使用,避免权限问题 - 别忘了
ProtectHome=true和PrivateTmp=true—— 它们会干扰自定义socket路径,若启用需确保 socket 在允许范围内(如/run/mysqld/)
mysql_upgrade 的版本匹配问题:它必须和目标实例的 mysqld 版本一致。比如用 8.0 的 mysql_upgrade 去升级 5.7 实例,会直接报错退出。切换前务必确认 which mysql_upgrade 和当前要操作的实例版本对得上。










