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