百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

MySQL 5.7 升级到 8.0 完整指南:坑点解析与解决方案

itomcoil 2025-09-11 21:05 5 浏览

MySQL 5.7 升级到 8.0 完整指南:坑点解析与解决方案

数据库从 MySQL 5.7 升级到 8.0 绝对是一个“坑点”密集的过程,但做好充分准备完全可以顺利通关。这不仅是版本的跳跃,更是从一个相对“宽松”的时代进入一个更加“严格”和“现代化”的时代。

下面,我们将系统性梳理升级流程、主要坑点以及解决方案。


核心建议:先测试,再生产!

绝对不要直接在生产环境执行升级操作。必须遵循以下流程:

  1. 备份生产数据库
    升级前务必对生产环境的 MySQL 5.7 进行完整备份(mysqldump 或 Percona XtraBackup)。
  2. 搭建测试环境
    在独立服务器上安装 MySQL 8.0,并将生产备份还原到此环境中。
  3. 进行测试升级
    在测试环境执行下述的所有检查和操作。
  4. 全面测试应用程序
    让所有依赖此数据库的应用程序连接测试库,进行功能、性能和压力测试。
  5. 制定回滚方案
    升级失败时能快速回退到 MySQL 5.7。升级过程中不能轻易丢弃旧的数据库和数据文件。

升级路线图

官方推荐的升级路径是逐个大版本升级,特别是主版本号变化时。虽然理论上支持从 5.7 直接到 8.0,但为了最大程度避免问题,建议:

MySQL 5.7 → MySQL 8.0

如果你的版本是 5.7 之前(如 5.6),则必须先升级到 5.7,然后再到 8.0。


第一阶段:升级前检查(在 MySQL 5.7 实例上操作)

这是最关键的一步,能帮你避免 80% 的坑。

1. 使用 MySQL Shell 升级检查工具(强烈推荐)

MySQL 8.0 提供 MySQL Shell 的
util.checkForServerUpgrade() 工具,能自动完成绝大多数检查:

mysqlsh root@localhost:3307 --password=your_password --sql
util.checkForServerUpgrade('root@localhost:3307', {'password':'your_password', 'targetVersion':'8.0.33'})

输出报告会列出:

  • 废弃功能的使用情况
  • 语法兼容性问题
  • 默认变量值的变化
  • 需要处理的模式对象

2. 检查废弃和移除的功能

  • 默认存储引擎:MyISAM 已标记为废弃,系统表会自动转换为 InnoDB
  • 密码验证插件:mysql_native_password 在 8.0 中已废弃,默认使用 caching_sha2_password,这是最大的连接坑
  • 其他移除项:PASSWORD() 函数、old-passwords 配置、ENCODE()/DECODE() 等

3. 字符集与排序规则检查

  • MySQL 8.0 默认字符集从 latin1 → utf8mb4
  • 默认排序规则从 latin1_swedish_ci → utf8mb4_0900_ai_ci

特别关注索引字段的排序规则,不一致可能导致索引失效。


4. SQL Mode 变化

MySQL 8.0 默认 SQL Mode:

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION
  • 在 5.7 测试环境中先将 SQL Mode 设置为 8.0 默认值
  • 测试 SQL 是否正常运行,尤其是 GROUP BY 查询

5. 外键约束名称长度

  • MySQL 8.0 限制外键标识符最大长度为 64 个字符
  • 检查并确保外键名不超过此限制

6. 保留关键字

  • 8.0 引入新保留关键字(如 GROUPING, CUME_DIST)
  • 检查表名、字段名,必要时用反引号 ` 引用

第二阶段:升级操作

根据部署方式选择升级方法:

方法一:原地升级(In-Place Upgrade)

  1. 关闭 MySQL 5.7 服务
  2. 替换 MySQL 二进制文件为 8.0 版本(备份原 datadir)
  3. 使用以下命令启动升级:
mysqld_safe --upgrade=FORCE
  1. 查看错误日志确认升级是否成功

方法二:逻辑升级(Logical Upgrade,推荐)

  1. 使用 mysqldump 或 mysqlpump 备份 5.7 数据
  2. 在新服务器安装 MySQL 8.0
  3. 导入备份文件

更安全,问题概率低,但耗时较长


第三阶段:升级后主要“坑点”与解决

坑点一:客户端连接认证失败(最常见)

现象

Authentication plugin 'caching_sha2_password' cannot be loaded

原因:MySQL 8.0 默认使用 caching_sha2_password,旧客户端驱动不支持。

解决方案

  1. 升级客户端驱动和库(推荐)
  • PHP: 使用 mysqlnd 并升级 PHP
  • Java: Connector/J 8.0+
  • Python: mysql-connector-python 8.0+ 或 PyMySQL 最新版
  1. 修改用户密码插件(临时)
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
  1. 不推荐:更改默认认证插件(降低安全性)
[mysqld]
default_authentication_plugin=mysql_native_password

坑点二:SQL 语法兼容性问题

现象:GROUP BY 等语句报错

原因:ONLY_FULL_GROUP_BY 被默认启用

解决方案

  1. 修改 SQL 语句,确保 SELECT 列要么在 GROUP BY 中,要么被聚合函数包裹
  2. 临时关闭严格模式:
SET GLOBAL sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

坑点三:性能波动

原因

  • 优化器变更
  • 新默认参数(如 innodb_flush_log_at_trx_commit)

解决方案

  • 用 EXPLAIN 对比执行计划
  • 调整参数、优化索引
  • 考虑 Query Rewrite Plugin

坑点四:大小写敏感和排序规则问题

原因:utf8mb4_0900_ai_ci 与原排序规则不同

解决方案:显式指定数据库或表的字符集与排序规则


总结 Checklist

  1. 完整备份生产数据库
  2. 搭建测试环境并还原备份
  3. 运行 util.checkForServerUpgrade() 并解决问题
  4. 测试应用程序连接性(解决认证插件问题)
  5. 在测试库模拟 SQL Mode 进行应用测试
  6. 检查字符集和排序规则
  7. 升级客户端驱动和库
  8. 制定回滚方案
  9. 选择升级方式并执行生产升级
  10. 升级后进行全面功能验证和性能监控

遵循此指南,耐心完成每一步,你的 MySQL 5.7 → 8.0 升级之路将平稳很多。祝你升级顺利!


相关推荐

python数据分析中你必须知道的陷阱和技巧

数据分析是一门既有趣又有挑战的技能,它可以帮助我们从海量的数据中提取有价值的信息,为决策提供支持。但是,数据分析也不是一件轻松的事情,它需要我们掌握一定的编程、统计、可视化等知识,同时也要注意避免一些...

python常见五大坑及避坑指南_python解决什么问题

python是一门非常流行和强大的编程语言,但是也有一些容易让初学者或者不熟悉的人掉入的坑。这里列举了一些python常见五大坑,以及如何避免或者解决它们。缩进问题。python使用缩进来表示代码块,...

收藏!2022年国家职业资格考试时间表公布

人社部14日公布2022年度专业技术人员职业资格考试工作计划,包括中小学生教师资格、会计师、精算师、建造师等各项考试日期。其中,证券期货基金业从业人员资格各次考试地点不同,具体安排以相关行业协会考试公...

苹果mac系统必须安装python3_macbook安装python3.7

苹果mac系统必须安装python3苹果mac系统口碑很好,但不能像linux系统一样同时提供python2和python3环境,对程序员来说是非常不友善的。资深程序员都知道,Python3才是P...

通过python实现猴子吃桃问题_python小猴子吃桃的问题

1、问题描述:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩...

python 中的第一个 hello world 程序输出

程序运行:print("helloworld")我使用的是Python程序3.7.0版本介绍下print概念print字面意思打印,将文本输出内容打印出来输入:print(&...

持久化 Python 会话:实现数据持久化和可重用性

Midjourney生成R语言会话持久化熟悉或常用R语言进行数据分析/数据挖掘/数据建模的数据工作者可能对R语言的会话保存和会话恢复印象比较深刻,它可以将当前session会话持久化保存,以便分...

如何将Python算法模型注册成Spark UDF函数实现全景模型部署

背景Background对于算法业务团队来说,将训练好的模型部署成服务的业务场景是非常常见的。通常会应用于三个场景:部署到流式程序里,比如风控需要通过流式处理来实时监控。部署到批任务中部署成API服...

Python 字典l转换成 JSON_python转化字典

本文需要5分钟。如果对您有用可以点赞评论关注.Python字典到JSONJSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于ECMAScrip...

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型...

总结90条写Python程序的建议_python写程序的步骤

  1.首先  建议1、理解Pythonic概念—-详见Python中的《Python之禅》  建议2、编写Pythonic代码  (1)避免不规范代码,比如只用大小写区分变量、使用容易...

ptrade系列第六天:持久化处理2_持久化的三种状态

前一次跟大家分享了利用pickle进行策略数据的持久化。但是这种方式有个问题,就是保存下来的数据无法很直观的看到,比较不方便,所以今天给大家带来另一种方式,将数据通过json保存。importjso...

Python数据持久化:JSON_python的json用法

编程派微信号:codingpy上周更新的《ThinkPython2e》第14章讲述了几种数据持久化的方式,包括dbm、pickle等,但是考虑到篇幅和读者等因素,并没有将各种方式都列全。本文将介绍...

干货 | 如何利用Python处理JSON格式的数据,建议收藏

作者:俊欣来源:关于数据分析与可视化JSON数据格式在我们的日常工作中经常会接触到,无论是做爬虫开发还是一般的数据分析处理,今天,小编就来分享一下当数据接口是JSON格式时,如何进行数据处理进行详...

Python中Pyyaml模块的使用_python模块介绍

一、YAML是什么YAML是专门用来写配置文件的语言,远比JSON格式方便。YAML语言的设计目标,就是方便人类读写。YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩进来表...