一、为什么需要升级MySQL?

作为互联网公司的"数据心脏",我们的MySQL数据库已经稳定运行了3年。直到某天凌晨3点,突然收到告警:某核心业务表因死锁导致服务雪崩。检查发现MySQL 5.7的innodb_deadlock_detect参数存在已知缺陷,而该问题在8.0.18版本已修复——这就是我们启动升级计划的导火索。

典型升级场景

  1. 安全漏洞修复(如CVE-2022-21584)
  2. 性能提升需求(8.0的Hash Join提速5倍)
  3. 新特性需求(如窗口函数、JSON增强)
  4. 硬件换代适配(ARM架构支持优化)

二、升级方案选择与对比

方案1:原地升级(In-Place Upgrade)

# 使用MySQL官方工具(技术栈:MySQL Shell 8.0)
mysqlsh root@localhost:3306 -- util checkForServerUpgrade \
--target-version=8.0.32 \
--output-format=VERBOSE

注释:该命令会生成30+页的检查报告,包括废弃参数、表格式兼容性等关键信息

优点:停机时间短(约15分钟),适合单实例 缺点:回滚困难,需完整备份

方案2:逻辑迁移(Logical Migration)

-- 使用mysqldump进行全量导出(技术栈:MySQL 5.7 → 8.0)
mysqldump \
--single-transaction \
--routines \
--triggers \
--hex-blob \
--set-gtid-purged=OFF \
--result-file=full_dump.sql

注释:--set-gtid-purged=OFF避免GTID污染新环境

优点:可跨大版本迁移(如5.5→8.0) 缺点:大数据量时导入耗时(500GB数据约6小时)

三、必知必会的雷区

3.1 字符集连环坑

某电商平台升级后出现"???"乱码,根源在于:

-- 错误配置示例
[client]
default-character-set = latin1

[mysqld]
character-set-server = utf8mb4

注释:client段配置会覆盖连接设置,导致编码不一致

解决方案

ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4;

3.2 权限体系地震

MySQL 8.0引入角色管理,原有授权方式可能失效:

-- 旧版授权语句(5.7)
GRANT SELECT ON db.* TO 'user'@'%';

-- 新版要求(8.0)
CREATE ROLE read_only;
GRANT SELECT ON db.* TO read_only;
GRANT read_only TO 'user'@'%';

注释:8.0默认启用caching_sha2_password,需客户端驱动同步升级

四、性能调优新姿势

升级后利用窗口函数优化分页查询:

-- 传统分页(5.7)
SELECT * FROM orders ORDER BY create_time LIMIT 10000, 20;

-- 8.0优化方案
WITH cte AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY create_time) AS rn 
  FROM orders
)
SELECT * FROM cte WHERE rn BETWEEN 10000 AND 10020;

执行时间从2.3秒降至0.8秒,避免深分页性能悬崖

五、血泪教训:真实故障复盘

某金融系统升级后出现诡异的事务回滚,最终定位到:

-- 错误的事务隔离级别配置
SET GLOBAL transaction_isolation = 'REPEATABLE-READ';  -- 8.0弃用
SET GLOBAL transaction_isolation = 'REPEATABLE-READ';  -- 正确写法

注释:参数名从tx_isolation变更为transaction_isolation

排查工具推荐

# 使用performance_schema分析锁等待
SELECT * FROM performance_schema.data_lock_waits;

六、升级后的必修课

6.1 监控项更新清单

  • 新增指标:cached_io_cpu_thread
  • 废弃指标:thread_cache_size
  • 告警阈值:连接数基准需重新校准(8.0线程模型优化)

6.2 必须验证的5个核心功能

  1. 分布式事务(XA Recovery)
  2. 主从复制延迟
  3. 备份恢复流程
  4. ORM框架兼容性
  5. 慢查询日志格式

七、总结与最佳实践

经过3次完整升级周期,我们提炼出"333原则":

  • 3次备份:升级前、中、后各做一次异机备份
  • 3阶段验证:冒烟测试→压力测试→全量回归
  • 3天观察期:保留旧环境至少72小时

最终建议升级路径: 5.7 → 8.0.16 → 8.0.32 → 8.0.34(每次跨度不超过3个小版本)