1. 为什么现在必须升级到MySQL 8.0?
如果你还在使用MySQL 5.7,现在真的该考虑升级了。2023年10月,MySQL 5.7正式结束了生命周期(EOL),这意味着官方不再提供安全补丁和错误修复。继续使用5.7版本,你的数据库将面临安全漏洞和兼容性问题。
我最近帮几个客户做了升级,发现很多人对升级有顾虑,主要是担心兼容性和稳定性。但说实话,MySQL 8.0带来的性能提升和新功能绝对值得你花时间升级。比如,8.0的查询性能比5.7快2倍,支持窗口函数和CTE(公共表表达式),还有更好的JSON支持。
升级前最重要的是做好准备工作。我见过不少团队直接开干,结果遇到各种问题,最后不得不回滚。接下来我会详细分享升级前的关键检查项和实战准备,帮你避开这些坑。
2. 升级前的关键检查项
2.1 使用官方工具进行兼容性检查
MySQL 8.0自带了一个超实用的工具——MySQL Shell的util.checkForServerUpgrade()。这个工具能自动检查你的数据库是否存在兼容性问题。我强烈建议在升级前先跑一遍这个检查。
具体操作很简单:
mysqlsh --uri=root@localhost --js util.checkForServerUpgrade()这个命令会生成一份详细的报告,列出所有可能影响升级的问题。根据我的经验,最常见的问题包括:
- 使用过时的字符集utf8mb3
- 使用了废弃的系统变量
- 认证插件不兼容
2.2 检查字符集问题
MySQL 8.0最大的变化之一就是字符集。在5.7中,utf8实际上是utf8mb3(最多3字节),而8.0默认使用utf8mb4(完整4字节支持)。
我遇到过不少项目因为这个问题导致升级后数据乱码。检查方法很简单:
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE CHARACTER_SET_NAME = 'utf8mb3';如果发现有表还在用utf8mb3,建议先转换:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4;2.3 检查废弃的参数和功能
MySQL 8.0移除或修改了不少5.7的参数。比如:
query_cache_size(查询缓存)被完全移除expire-logs-days被binlog_expire_logs_seconds取代default_authentication_plugin默认值从mysql_native_password改为caching_sha2_password
你可以用这个查询找出正在使用的废弃参数:
SHOW VARIABLES WHERE Variable_name LIKE '%deprecated%' OR Variable_name LIKE '%removed%';3. 认证插件的变更与处理方案
3.1 认证插件的变化
这是升级中最容易踩坑的地方。MySQL 8.0默认使用caching_sha2_password插件,而很多老客户端(包括一些旧版的Navicat)还不支持这个插件。
我有个客户升级后,所有应用程序突然连不上数据库了,就是因为这个原因。解决方案有三种:
- 升级客户端驱动
- 修改用户认证方式
- 服务器配置回退到旧插件
3.2 修改认证插件的方法
如果你决定继续使用旧插件,可以在my.cnf中配置:
[mysqld] default_authentication_plugin=mysql_native_password或者对特定用户修改:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';但要注意,这只是临时解决方案。从安全角度,我建议尽快升级客户端,因为caching_sha2_password更安全。
4. 实战升级步骤与避坑指南
4.1 完整的升级流程
根据我多次升级的经验,最稳妥的流程是这样的:
- 备份所有数据(一定要验证备份可恢复!)
- 在测试环境进行升级演练
- 使用检查工具扫描兼容性问题
- 修复发现的所有问题
- 正式升级生产环境
- 升级后验证
4.2 备份策略
千万别小看备份!我建议同时做两种备份:
- 逻辑备份(mysqldump):
mysqldump -u root -p --all-databases --routines --events --triggers > full_backup.sql- 物理备份(直接复制数据文件):
systemctl stop mysql cp -R /var/lib/mysql /backup/mysql_data_backup systemctl start mysql4.3 实际升级操作
升级方式主要有两种:
- 原地升级(in-place):直接替换MySQL二进制文件
- 逻辑升级(logical):在新服务器安装8.0,然后导入数据
我通常推荐逻辑升级,虽然麻烦些,但更安全。具体步骤:
# 在新服务器安装MySQL 8.0 sudo apt install mysql-server-8.0 # 导入数据 mysql -u root -p < full_backup.sql4.4 升级后检查
升级完成后,一定要检查:
- 所有表是否正常:
mysqlcheck -u root -p --all-databases --check-upgrade- 关键功能是否正常
- 性能是否达标
我曾经遇到一个案例,升级后所有外键约束都失效了,就是因为没做这个检查。
5. 常见问题解决方案
5.1 性能下降问题
有客户反映升级后查询变慢了,通常是这些原因:
- 优化器行为变化
- 参数默认值变化
- 统计信息不准确
解决方案:
ANALYZE TABLE 重要表名;如果还不行,可以尝试调整优化器开关:
SET optimizer_switch='某些选项=off';5.2 应用程序兼容性问题
特别是使用了以下特性的应用:
- GROUP BY的ASC/DESC语法(8.0不再支持)
- 某些特定的SQL_MODE设置
- 被移除的函数
建议先在测试环境跑一遍所有应用的SQL语句,用8.0的EXPLAIN分析执行计划变化。
5.3 回滚方案
即使准备再充分,也要有回滚计划。我的做法是:
- 保留旧版MySQL的安装包
- 备份所有数据
- 记录所有配置变更
如果必须回滚,可以快速恢复旧版MySQL和数据。
升级MySQL不是简单的版本替换,而是一个需要精心准备的项目。按照本文的步骤操作,你能避开我踩过的所有坑。虽然过程可能有些繁琐,但MySQL 8.0的性能提升和新功能绝对值得这些投入。