同一台机器装多个 MySQL 版本是否可行
完全可行,但不能通过系统包管理器(如
apt或
yum)默认安装多个主版本——它们会冲突服务名、端口、socket 路径和配置文件位置。真正能共存的是「手动编译安装」或「官方二进制 tarball 解压部署」,每个版本独立目录、独立配置、独立端口。
如何用 tarball 方式部署多个 MySQL 版本
MySQL 官网提供的
mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz和
mysql-5.7.42-linux-glibc2.12-x86_64.tar.xz这类压缩包,本质是自包含的二进制套件,解压即用,不写注册表、不改全局路径。关键在于隔离以下 5 个要素:
basedir:每个版本单独目录,如
/opt/mysql-5.7.42、
/opt/mysql-8.0.33
datadir:必须不同,如
/var/lib/mysql57、
/var/lib/mysql80
port:避免冲突,例如
3307(5.7)、
3308(8.0)
socket:如
/tmp/mysql57.sock、
/tmp/mysql80.sock
pid-file:如
/var/run/mysqld/mysqld57.pid
初始化时务必指定完整路径:
bin/mysqld --initialize --user=mysql --basedir=/opt/mysql-5.7.42 --datadir=/var/lib/mysql57。跳过
mysqld_safe,直接用
bin/mysqld启动更可控。
启动/停止脚本怎么写才不串版本
别依赖
systemctl start mysql——它只认一个
mysqld.service。应为每个版本写独立 service 文件,比如
/etc/systemd/system/mysqld@57.service,内容里用
%i占位符动态注入版本标识:
[Service] ExecStart=/opt/mysql-%i/bin/mysqld --defaults-file=/etc/my_%i.cnf Restart=always User=mysql
然后启用:
systemctl enable mysqld@57、
systemctl start mysqld@57。注意
my_57.cnf必须显式指定
basedir和
datadir,否则
mysqld会按内置默认值找错地方。
客户端连接时如何指定对应版本的服务
mysql命令本身不绑定版本,它只是客户端。连哪个实例,取决于你传的参数: 连 5.7 实例:
mysql -S /tmp/mysql57.sock -u root -p连 8.0 实例:
mysql -h 127.0.0.1 -P 3308 -u root -p(用 TCP,避免走默认 socket) 如果想让
mysql命令默认走某版本,可设别名:
alias mysql57='mysql -S /tmp/mysql57.sock'
特别注意:MySQL 8.0 默认认证插件是
caching_sha2_password,而老客户端(如 MySQL 5.7 的
mysql命令)可能不支持——此时要么升级客户端,要么在 8.0 用户创建时显式指定
IDENTIFIED WITH mysql_native_password。
真正的难点不在安装,而在环境变量清理和 shell 别名污染;一不小心
$PATH里混进两个
bin目录,
which mysqld就会指错。每次切换前,建议用
ps aux | grep mysqld确认进程实际加载的
basedir。
