Skip to content

MySQL 大版本升级

MySQL大版本升级是数据库运维中的重要操作,涉及到数据格式、功能特性和兼容性的重大变化。本文将介绍MySQL大版本升级的完整流程、方法选择、注意事项和最佳实践。

升级前准备

1. 升级规划

  • 确定升级目标版本

    • 选择稳定的GA版本(General Availability)
    • 考虑业务兼容性要求
    • 参考官方支持生命周期
  • 制定升级计划

    • 升级时间窗口(建议在低峰期)
    • 升级方法选择
    • 回滚方案
    • 人员分工
    • 测试计划

2. 环境准备

  • 创建测试环境

    • 复制生产环境数据到测试环境
    • 确保测试环境与生产环境配置一致
    • 在测试环境先执行升级,验证升级过程和业务兼容性
  • 备份生产数据

    bash
    # 全量备份
    mysqldump -u root -p --single-transaction --routines --triggers --events --all-databases > full_backup.sql
    
    # 物理备份(使用 XtraBackup)
    xtrabackup --backup --user=root --password=password --target-dir=/backup/full

3. 兼容性检查

  • 检查数据库对象兼容性

    sql
    -- 检查存储过程和函数
    SELECT ROUTINE_NAME, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
    
    -- 检查触发器
    SELECT TRIGGER_NAME, EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE FROM INFORMATION_SCHEMA.TRIGGERS;
    
    -- 检查视图
    SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
  • 使用 MySQL Upgrade Checker Tool

    bash
    # 下载并运行升级检查工具
    wget https://dev.mysql.com/get/Downloads/MySQL-Utilties/mysql-utilities-1.6.5.tar.gz
    tar -xzf mysql-utilities-1.6.5.tar.gz
    cd mysql-utilities-1.6.5
    python -m mysql.utilities.upgrade_checker --server=root@localhost:3306

4. 性能基准测试

  • 在测试环境执行性能测试
    • 使用 tpcc-mysql 或 sysbench 进行基准测试
    • 记录升级前后的性能指标
    • 比较查询执行计划变化

升级方法选择

1. 离线升级

离线升级是最常用的升级方法,适用于大多数场景,升级过程中数据库服务不可用。

  • 优点

    • 升级过程简单直接
    • 升级时间可预测
    • 适合中小型数据库
  • 缺点

    • 升级期间服务不可用
    • 升级时间取决于数据量大小

2. 在线升级

在线升级允许在升级过程中保持数据库服务可用,适用于对可用性要求较高的场景。

  • 优点

    • 升级期间服务持续可用
    • 最小化业务影响
  • 缺点

    • 升级过程复杂
    • 对数据库环境要求高
    • 可能存在性能影响

3. 滚动升级

滚动升级适用于主从复制架构,通过逐个升级从库,最后升级主库,实现服务的高可用性。

  • 优点

    • 服务持续可用
    • 风险分散
    • 适合分布式架构
  • 缺点

    • 升级时间长
    • 对复制架构要求高
    • 需要复杂的切换操作

4. 蓝绿部署

蓝绿部署通过构建两套环境(蓝环境和绿环境),实现零 downtime 升级。

  • 优点

    • 零 downtime 升级
    • 快速回滚
    • 适合关键业务系统
  • 缺点

    • 资源消耗大
    • 配置复杂
    • 需要额外的基础设施

离线升级流程

1. 停止数据库服务

bash
# 停止 MySQL 服务
systemctl stop mysqld

# 确保服务已停止
systemctl status mysqld

2. 备份配置文件

bash
# 备份配置文件
cp /etc/my.cnf /etc/my.cnf.bak
cp -r /etc/my.cnf.d /etc/my.cnf.d.bak

3. 卸载旧版本 MySQL

bash
# 查看已安装的 MySQL 包
rpm -qa | grep mysql

# 卸载旧版本 MySQL
rpm -e --nodeps mysql-community-server mysql-community-client mysql-community-libs mysql-community-common

4. 安装新版本 MySQL

bash
# 下载新版本 MySQL 仓库
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 安装仓库
rpm -ivh mysql80-community-release-el7-3.noarch.rpm

# 启用新版本仓库
yum-config-manager --enable mysql80-community

# 安装新版本 MySQL
yum install -y mysql-community-server

5. 升级数据目录

bash
# 初始化新版本 MySQL(如果需要)
mysqld --initialize --user=mysql --datadir=/var/lib/mysql

# 启动 MySQL 服务
systemctl start mysqld

# 查看临时密码
grep 'temporary password' /var/log/mysqld.log

# 运行升级命令
mysql_upgrade -u root -p

6. 重启数据库服务

bash
# 重启 MySQL 服务使升级生效
systemctl restart mysqld

在线升级流程

1. 配置复制环境

  • 搭建主从复制
    • 确保主从复制正常运行
    • 启用 GTID 模式(推荐)
    • 确保从库与主库数据一致

2. 升级从库

  • 逐个升级从库
    bash
    # 停止从库复制
    STOP SLAVE;
    
    # 执行升级(参考离线升级步骤 2-6)
    
    # 启动从库复制
    START SLAVE;
    
    # 检查复制状态
    SHOW SLAVE STATUS\G;

3. 切换主从角色

  • 将主库切换为从库
    bash
    # 在原主库上停止复制源
    STOP REPLICA;
    
    # 在新主库上提升为主库
    RESET MASTER;
    
    # 在原主库上配置为新主库的从库
    CHANGE MASTER TO
      MASTER_HOST='new_master_host',
      MASTER_USER='replication_user',
      MASTER_PASSWORD='replication_password',
      MASTER_AUTO_POSITION=1;
    
    # 启动复制
    START SLAVE;

4. 验证升级结果

  • 检查所有节点状态
    sql
    -- 检查版本信息
    SELECT VERSION();
    
    -- 检查复制状态
    SHOW SLAVE STATUS\G;
    
    -- 检查数据库对象
    SHOW DATABASES;

滚动升级流程

1. 准备升级环境

  • 确保复制架构正常
    • 主从复制延迟在可接受范围内
    • 所有从库都已同步到最新位置
    • 配置了合适的监控

2. 逐个升级从库

  • 升级流程
    1. 停止从库的应用服务访问
    2. 停止从库复制
    3. 执行离线升级
    4. 启动从库,验证升级结果
    5. 启动从库复制
    6. 恢复应用服务访问
    7. 等待复制同步
    8. 继续升级下一个从库

3. 升级主库

  • 主库升级流程
    1. 切换主库角色到已升级的从库
    2. 将原主库从复制架构中移除
    3. 执行离线升级
    4. 将原主库重新加入复制架构作为从库
    5. 验证所有节点状态

蓝绿部署升级流程

1. 准备蓝绿环境

  • 创建绿环境
    • 部署新版本 MySQL
    • 配置与蓝环境一致
    • 搭建从蓝环境到绿环境的复制

2. 数据同步

bash
# 在绿环境上配置从蓝环境的复制
CHANGE MASTER TO
  MASTER_HOST='blue_master_host',
  MASTER_USER='replication_user',
  MASTER_PASSWORD='replication_password',
  MASTER_AUTO_POSITION=1;

START SLAVE;

3. 验证绿环境

  • 测试绿环境
    • 验证数据同步
    • 执行业务兼容性测试
    • 进行性能测试
    • 验证监控和告警

4. 切换流量

  • 切换应用流量到绿环境
    • 使用负载均衡器切换流量
    • 逐步切换,监控业务运行情况
    • 准备快速回滚方案

5. 清理蓝环境

  • 确认绿环境稳定后
    • 停止蓝环境复制
    • 保留蓝环境一段时间作为备份
    • 最终清理蓝环境资源

升级后验证

1. 数据库状态验证

sql
-- 检查版本信息
SELECT VERSION();

-- 检查数据库状态
SHOW GLOBAL STATUS LIKE 'Uptime';

-- 检查错误日志
SHOW GLOBAL VARIABLES LIKE 'log_error';

2. 业务功能验证

  • 执行业务测试用例
    • 核心业务流程测试
    • 数据完整性验证
    • 存储过程和函数测试
    • 触发器和事件测试
    • 视图和存储引擎测试

3. 性能验证

  • 执行性能测试
    • 基准测试(TPCC, Sysbench)
    • 关键查询性能测试
    • 并发性能测试
    • 资源使用率监控

4. 兼容性验证

  • 检查兼容性问题
    • 废弃功能使用情况
    • SQL语法兼容性
    • 系统变量变化
    • 存储引擎兼容性

升级注意事项

1. 兼容性问题

  • SQL语法变化

    • MySQL 8.0 严格模式默认开启
    • 某些SQL语法在新版本中被废弃
    • 系统变量名称变化
  • 数据类型变化

    • 时间类型处理变化
    • JSON类型增强
    • 字符集默认值变化
  • 权限系统变化

    • MySQL 8.0 密码验证插件变化
    • 权限表结构变化
    • 角色功能增强

2. 性能影响

  • 升级过程中的性能

    • 离线升级期间服务不可用
    • 在线升级可能导致性能下降
    • 复制延迟增加
  • 升级后的性能

    • 新版本可能有性能提升
    • 某些查询计划可能变化
    • 配置参数需要重新优化

3. 安全考虑

  • 升级过程中的安全

    • 确保备份数据安全
    • 限制升级期间的访问
    • 使用加密连接
  • 升级后的安全

    • 检查权限设置
    • 更新密码策略
    • 启用新的安全功能

不同MySQL版本升级要点

1. MySQL 5.7 升级到 8.0

  • 主要变化

    • 默认字符集从 latin1 改为 utf8mb4
    • 严格SQL模式默认开启
    • 查询缓存被移除
    • 密码验证插件变化
    • 系统表结构重构
    • JSON功能增强
    • 窗口函数支持
  • 升级注意事项

    • 必须先升级到 5.7.9 或更高版本
    • 运行 mysqlcheck 修复表结构
    • 检查并更新废弃的系统变量
    • 重新生成 SSL 证书

2. MySQL 8.0 小版本升级

  • 升级方法

    • 可以使用 in-place 升级
    • 支持快速升级路径
    • 不需要重新初始化数据目录
  • 注意事项

    • 检查小版本的新功能和修复
    • 验证业务兼容性
    • 备份关键数据

常见问题(FAQ)

Q1: 大版本升级需要多长时间?

A1: 升级时间取决于多种因素:

  • 数据量大小
  • 数据库对象数量
  • 硬件性能
  • 升级方法选择
  • 通常从几十分钟到数小时不等

Q2: 升级过程中遇到错误怎么办?

A2: 遇到错误时的处理步骤:

  1. 停止升级过程
  2. 分析错误日志
  3. 根据错误信息进行修复
  4. 必要时执行回滚
  5. 修复问题后重新尝试升级

Q3: 如何处理升级后的性能下降?

A3: 处理升级后性能下降的方法:

  • 收集性能数据(慢查询日志、执行计划)
  • 检查配置参数是否需要调整
  • 优化有问题的查询
  • 重新收集统计信息
  • 考虑调整索引策略

Q4: 升级后如何回滚?

A4: 回滚方案:

  • 离线升级:恢复备份数据,重启服务
  • 在线升级:切换回原主库
  • 滚动升级:重新配置复制关系
  • 蓝绿部署:切换回蓝环境

Q5: 升级前需要检查哪些系统变量?

A5: 关键系统变量检查:

sql
-- 检查字符集
SHOW VARIABLES LIKE '%character%';
SHOW VARIABLES LIKE '%collation%';

-- 检查SQL模式
SHOW VARIABLES LIKE 'sql_mode';

-- 检查存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';

-- 检查密码验证插件
SHOW VARIABLES LIKE 'default_authentication_plugin';

Q6: 如何处理存储过程和函数的兼容性问题?

A6: 处理存储过程和函数兼容性问题的方法:

  • 在测试环境中运行 mysqlcheck --check-upgrade
  • 使用 SHOW WARNINGS 检查语法问题
  • 重新编译存储过程和函数
  • 更新使用了废弃功能的代码

Q7: 升级后复制失败怎么办?

A7: 处理复制失败的方法:

sql
-- 检查复制错误
SHOW SLAVE STATUS\G;

-- 跳过错误(谨慎使用)
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;

-- 重新配置复制
STOP SLAVE;
CHANGE MASTER TO ...;
START SLAVE;

Q8: 如何验证升级后的数据库完整性?

A8: 验证数据库完整性的方法:

  • 运行 mysqlcheck --all-databases
  • 执行数据一致性检查
  • 比较升级前后的表行数
  • 运行业务功能测试

最佳实践

1. 升级前

  • 充分测试:在测试环境中完整模拟升级过程
  • 备份数据:确保有可靠的全量备份
  • 制定详细计划:包括时间、方法、回滚方案
  • 通知相关人员:提前告知业务方和运维团队

2. 升级中

  • 严格按照计划执行:避免临时变更
  • 监控升级过程:实时查看日志和系统状态
  • 及时记录问题:便于后续分析和改进
  • 保持沟通畅通:升级团队内部和与业务方的沟通

3. 升级后

  • 全面验证:数据库状态、业务功能、性能
  • 监控运行情况:重点关注资源使用率和错误日志
  • 收集反馈:获取业务方的使用反馈
  • 总结经验:记录升级过程中的问题和解决方案

故障排查

1. 常见升级错误及解决方法

  • 错误1:"Error: Failed to open file './mysql/plugin.frm'"

    • 原因:数据目录权限问题
    • 解决方法:确保 MySQL 用户有数据目录的访问权限
  • 错误2:"The server quit without updating PID file"

    • 原因:配置文件错误或端口冲突
    • 解决方法:检查配置文件和端口占用情况
  • 错误3:"Unknown system variable 'query_cache_size'"

    • 原因:使用了已废弃的系统变量
    • 解决方法:从配置文件中移除该变量
  • 错误4:"Plugin 'validate_password' is not loaded"

    • 原因:密码验证插件未加载
    • 解决方法:加载插件或更新密码策略

2. 诊断工具

  • 检查错误日志

    bash
    tail -f /var/log/mysqld.log
  • 使用 MySQL 诊断工具

    bash
    # 使用 mysqlcheck 检查表
    mysqlcheck --all-databases -u root -p
    
    # 使用 mysqldump 验证数据完整性
    mysqldump --dry-run -u root -p --all-databases
  • 查看系统状态

    sql
    -- 查看全局状态变量
    SHOW GLOBAL STATUS;
    
    -- 查看引擎状态
    SHOW ENGINE INNODB STATUS\G;

通过遵循本文介绍的升级流程、方法选择和最佳实践,可以确保MySQL大版本升级的顺利进行,最小化业务影响,提高升级成功率。升级过程中要保持谨慎,充分测试,制定详细的计划和回滚方案,确保数据安全和业务连续性。