Skip to content

MySQL 多版本共存方案

多版本共存的场景

测试和开发环境

  • 同时测试不同MySQL版本的兼容性
  • 验证应用在不同MySQL版本上的性能
  • 开发支持多版本MySQL的应用程序

迁移和升级

  • 平滑过渡:在同一服务器上运行新旧版本
  • 数据验证:确保数据在不同版本间正确迁移
  • 回滚准备:保留旧版本作为应急回滚方案

生产环境

  • 特定应用需要特定MySQL版本
  • 逐步升级策略
  • 高可用性要求下的版本冗余

实现方案

基于不同安装目录的部署

Linux系统

安装步骤
  1. 下载不同版本的MySQL二进制包
  2. 解压到不同目录
    bash
    tar -xvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
    tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
  3. 创建符号链接
    bash
    ln -s /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql57
    ln -s /usr/local/mysql-8.0.26-linux-glibc2.12-x86_64 /usr/local/mysql80
配置文件
  • 为每个版本创建独立的配置文件
    bash
    mkdir -p /etc/mysql/mysql57
    mkdir -p /etc/mysql/mysql80
  • 配置不同的端口、数据目录和日志文件

Windows系统

安装步骤
  1. 下载不同版本的MySQL安装包
  2. 使用自定义安装,选择不同的安装目录
  3. 配置不同的服务名称
配置文件
  • 为每个版本创建独立的my.ini文件
  • 存放在各自的安装目录中

端口配置

基本配置

  • 默认端口:3306(建议保留给主要版本)
  • 其他版本使用不同端口:3307, 3308, 3309等

配置示例

ini
# MySQL 5.7 配置
[mysqld]
port = 3306
datadir = /var/lib/mysql57
socket = /var/lib/mysql57/mysql.sock

# MySQL 8.0 配置
[mysqld]
port = 3307
datadir = /var/lib/mysql80
socket = /var/lib/mysql80/mysql.sock

防火墙配置

  • 确保所有使用的端口都已在防火墙中开放
  • 针对不同版本的端口设置适当的访问控制

数据目录隔离

目录规划

  • 为每个版本创建独立的数据目录
  • 确保目录权限正确设置

Linux系统

bash
mkdir -p /var/lib/mysql57
mkdir -p /var/lib/mysql80
chown -R mysql:mysql /var/lib/mysql57
chown -R mysql:mysql /var/lib/mysql80

Windows系统

  • 在不同磁盘或分区创建数据目录
  • 确保服务账户有适当的权限

服务管理

Linux系统

系统服务配置
  • 为每个版本创建独立的systemd服务文件
MySQL 5.7 服务文件
ini
[Unit]
Description=MySQL 5.7 database server
After=network.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql57/bin/mysqld --defaults-file=/etc/mysql/mysql57/my.cnf
PIDFile=/var/run/mysql/mysql57.pid

[Install]
WantedBy=multi-user.target
MySQL 8.0 服务文件
ini
[Unit]
Description=MySQL 8.0 database server
After=network.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql80/bin/mysqld --defaults-file=/etc/mysql/mysql80/my.cnf
PIDFile=/var/run/mysql/mysql80.pid

[Install]
WantedBy=multi-user.target
服务操作
bash
# 启动MySQL 5.7
systemctl start mysql57

# 启动MySQL 8.0
systemctl start mysql80

# 查看状态
systemctl status mysql57
systemctl status mysql80

Windows系统

服务安装
cmd
"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --install MySQL57 --defaults-file="C:\Program Files\MySQL\MySQL Server 5.7\my.ini"

"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --install MySQL80 --defaults-file="C:\Program Files\MySQL\MySQL Server 8.0\my.ini"
服务操作
cmd
# 启动服务
net start MySQL57
net start MySQL80

# 停止服务
net stop MySQL57
net stop MySQL80

# 查看服务状态
sc query MySQL57
sc query MySQL80

客户端连接

使用指定端口连接

bash
# 连接MySQL 5.7(默认端口)
mysql -u root -p

# 连接MySQL 8.0(端口3307)
mysql -u root -p -P 3307

使用配置文件连接

  • 为每个版本创建客户端配置文件
ini
# ~/.my57.cnf
[client]
port = 3306
socket = /var/lib/mysql57/mysql.sock

# ~/.my80.cnf
[client]
port = 3307
socket = /var/lib/mysql80/mysql.sock
bash
# 使用特定配置文件连接
mysql --defaults-file=~/.my57.cnf -u root -p
mysql --defaults-file=~/.my80.cnf -u root -p

环境变量管理

临时设置

bash
# 使用MySQL 5.7
export PATH=/usr/local/mysql57/bin:$PATH
export MYSQL_HOME=/usr/local/mysql57

# 使用MySQL 8.0
export PATH=/usr/local/mysql80/bin:$PATH
export MYSQL_HOME=/usr/local/mysql80

持久化设置

  • 创建版本切换脚本
    bash
    #!/bin/bash
    # switch_mysql_version.sh
    
    if [ "$1" == "57" ]; then
        export PATH=/usr/local/mysql57/bin:$PATH
        export MYSQL_HOME=/usr/local/mysql57
        echo "Switched to MySQL 5.7"
    elif [ "$1" == "80" ]; then
        export PATH=/usr/local/mysql80/bin:$PATH
        export MYSQL_HOME=/usr/local/mysql80
        echo "Switched to MySQL 8.0"
    else
        echo "Usage: $0 [57|80]"
    fi

配置管理

版本特定配置

MySQL 5.7 特有配置

ini
[mysqld]
# MySQL 5.7 特有配置
innodb_large_prefix = ON
innodb_file_format = Barracuda

MySQL 8.0 特有配置

ini
[mysqld]
# MySQL 8.0 特有配置
default_authentication_plugin = caching_sha2_password
innodb_dedicated_server = ON

共享配置

  • 基础配置参数
  • 性能调优参数
  • 安全配置

数据管理

数据备份和恢复

  • 为每个版本单独备份
  • 使用版本对应的mysqldump工具
bash
# 备份MySQL 5.7数据
/usr/local/mysql57/bin/mysqldump -u root -p --all-databases > mysql57_backup.sql

# 备份MySQL 8.0数据
/usr/local/mysql80/bin/mysqldump -u root -p -P 3307 --all-databases > mysql80_backup.sql

数据迁移

从低版本到高版本

  1. 在低版本MySQL中导出数据
  2. 在高版本MySQL中导入数据
  3. 运行mysql_upgrade工具
bash
# 从MySQL 5.7导出
/usr/local/mysql57/bin/mysqldump -u root -p --all-databases --add-drop-database --routines --events > mysql57_to_80.sql

# 在MySQL 8.0中导入
/usr/local/mysql80/bin/mysql -u root -p -P 3307 < mysql57_to_80.sql

# 运行升级工具
/usr/local/mysql80/bin/mysql_upgrade -u root -p -P 3307

监控和维护

监控多实例

  • 为每个版本配置独立的监控
  • 使用不同的端口和连接参数

日志管理

  • 为每个版本配置独立的日志文件
  • 定期清理和归档日志

定期维护

  • 为每个版本单独运行维护任务
  • 包括优化表、检查表、备份等
bash
# MySQL 5.7 维护
/usr/local/mysql57/bin/mysqlcheck -u root -p --all-databases --optimize --analyze

# MySQL 8.0 维护
/usr/local/mysql80/bin/mysqlcheck -u root -p -P 3307 --all-databases --optimize --analyze

最佳实践

资源分配

  • 根据版本特性分配适当的系统资源
  • 监控资源使用情况,避免资源竞争
  • 为生产版本预留足够的资源

安全管理

  • 为每个版本设置独立的密码策略
  • 定期更新所有版本的安全补丁
  • 实施统一的访问控制策略

版本管理

  • 建立版本管理规范
  • 记录每个版本的用途和配置
  • 定期评估和清理不必要的版本

文档和记录

  • 详细记录多版本部署架构
  • 记录版本间的差异和注意事项
  • 建立故障处理流程和回滚方案

常见问题(FAQ)

Q1: 多版本共存会影响系统性能吗?

A1: 可能会影响系统性能,因为多个MySQL实例会竞争系统资源。建议:

  • 在足够强大的硬件上部署
  • 合理分配CPU、内存和磁盘资源
  • 监控系统负载,及时调整资源分配
  • 对于生产环境,考虑使用独立服务器

Q2: 如何处理不同版本MySQL的密码验证插件差异?

A2: 处理方法:

  • MySQL 5.7默认使用mysql_native_password
  • MySQL 8.0默认使用caching_sha2_password
  • 可以在MySQL 8.0中配置使用mysql_native_password以保持兼容性
    ini
    [mysqld]
    default_authentication_plugin = mysql_native_password
  • 或者在连接时指定认证插件

Q3: 多版本共存时如何管理备份策略?

A3: 建议:

  • 为每个版本制定独立的备份计划
  • 使用对应版本的备份工具
  • 备份到不同的位置
  • 定期测试备份的可恢复性
  • 建立统一的备份监控和管理机制

Q4: 如何在多版本环境中进行性能比较?

A4: 可以通过以下方式:

  • 使用相同的硬件和配置基础
  • 运行相同的测试脚本和查询
  • 收集和比较关键性能指标
  • 使用专业的性能测试工具(如sysbench)
  • 分析执行计划和资源使用情况