mysql多版本共存环境搭建与切换方案

来源:这里教程网 时间:2026-02-28 20:40:23 作者:

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
和当前要操作的实例版本对得上。

相关推荐