如何从 MySQL 5.7 升级到 8.0
尽管 MySQL 8 早在 2018 年就已发布,但许多 MySQL 服务器仍然运行 MySQL 5.x。MySQL 5 自 2005 年发布以来已经有很长一段运行时间,因此许多组织仍然在使用基于 5.x 的数据库。然而,Oracle 在过去的几年里逐步停止为各种平台提供 MySQL 5.7 的支持,MySQL 5.7 的生命周期结束预计将在 2023 年 10 月到来。
如果你仍然在 MySQL 5.7 上运行数据库,现在应该认真考虑进行升级。升级后你将获得多项性能优化和安全增强功能,因此尽快完成升级至关重要——尤其是考虑到 MySQL 5.7 的生命周期即将结束,停止安全更新的情况将直接影响你的数据库安全。幸运的是,升级通常相对简单,但你可能需要进行一些调整。本文将涵盖从 MySQL 5.7 到 MySQL 8 的升级过程中你需要注意的事项,并指导你完成使现有数据库兼容新版本的过程。
以下是我们将讨论的内容:
- 升级之前的准备工作
- 字符集与排序规则
- 如何将数据库升级到 utf8mb4 字符集和 utf8mb4_0900_ai_ci 排序规则
- 已废弃的数据类型
- 身份验证的变化
- 新的保留字
- SQL 模式变更
- C 风格操作符
- 服务器错误代码
- 无停机时间升级 MySQL
- 执行无停机时间升级方法
- 结论
升级之前
在升级之前,你需要确保有一个数据库的备份。此外,你需要验证备份是否有效。许多经验丰富的 IT 专业人士可能都经历过尝试从备份中恢复数据库,却发现备份已损坏或没有备份到预期内容的困境。如果你使用的是像 Amazon RDS 这样的云服务,可以使用其自动备份功能创建数据库快照。如果你运行自己的数据库服务器,可以使用 mysqldump
命令来创建数据库备份。
字符集与排序规则
MySQL 8 更改了字符集和排序规则的工作方式。字符集决定了字符如何存储在数据库中,而排序规则决定了字符如何进行比较。
在以前的 MySQL 版本中,常用的字符集是 latin1
和 utf8(仅支持 3 字节字符)
。在 MySQL 5.7 中,默认的排序规则是 utf8mb4_general_ci
。而在 MySQL 8 中,默认字符集改为 utf8mb4
,默认排序规则改为 utf8mb4_0900_ai_ci
。utf8mb4
是 utf8
的增强版本,支持 4 字节字符。排序规则名称中的 0900
表示使用 Unicode 9.0 标准,ai
表示不区分重音(accent-insensitive),而 ci
表示不区分大小写(case-insensitive)。
升级到 MySQL 8 时,建议将字符集和排序规则分别更改为 utf8mb4
和 utf8mb4_0900_ai_ci
。这样可以确保你的数据库与 MySQL 8 版本兼容,并支持更多的字符,例如表情符号。
如果你需要关于字符集和排序规则的相关复习,可以查看我们关于 MySQL 字符串的免费视频,其中详细讨论了这一主题。
如何将数据库升级到 utf8mb4 字符集和 utf8mb4_0900_ai_ci 排序规则
第一步:更改数据库默认的字符集和排序规则
要更改数据库的默认字符集和排序规则,可以使用 ALTER DATABASE
语句。例如,若要将名为 my_database
的数据库默认字符集和排序规则分别更改为 utf8mb4
和 utf8mb4_0900_ai_ci
,可以使用以下语句:
SQL1ALTER DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
第二步:更改每个表的字符集和排序规则
要更改每个表的字符集和排序规则,可以使用 ALTER TABLE
语句。例如,若要将名为 my_table
的表的字符集和排序规则分别更改为 utf8mb4
和 utf8mb4_0900_ai_ci
,可以使用以下语句:
SQL1ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
已废弃的数据类型
虽然 MySQL 没有移除任何数据类型,但某些类型已不再推荐使用:
YEAR(2)
:存储两位数字表示年份。推荐使用YEAR(4)
,它存储四位数字表示年份。ENUM
:可以用已定义的值列表创建字段。虽然在 MySQL 8 中仍然可用,但不再推荐这种方法。更佳的方法是将枚举值存储在具有外键的查找表中。TINYTEXT
、MEDIUMTEXT
和LONGTEXT
:虽然这些文本类型在 MySQL 8 中仍然可用,但推荐使用指定长度的VARCHAR
,例如VARCHAR(255)
或TEXT
用于长文本(例如超过 255 个字符),特别是在不需要搜索特定子字符串的情况下。NATIONAL
、CHARACTER SET
和COLLATE
子句:虽然这些子句仍然在 MySQL 8 中可用,但已被废弃且不再推荐使用。推荐的替代方法是在列定义或表定义中使用CHARACTER SET
和COLLATE
选项来指定字符集和排序规则。
身份验证的变化
MySQL 8 更改了身份验证机制。最显著的变化是默认身份验证插件现在是 caching_sha2_password
,而不是 mysql_native_password
。这意味着如果你使用的是默认身份验证插件,你需要更新连接字符串以使用新插件。
使用旧的身份验证插件的遗留账户必须使用 ALTER USER
语句转换为新的插件。此外,还需要更新所有与数据库交互的客户端应用程序以支持新的身份验证机制。最后,应进行全面测试以确保数据库在使用新身份验证插件时能够正常运行。
新的保留字
MySQL 8 增加了一些新的保留字。这些词不能作为标识符(例如表名、列名等)使用。如果你使用了这些词作为标识符,则需要更改它们为其他名称,或者确保将其用引号括起。完整列表请参见 MySQL 文档关于 MySQL 8 新保留字的内容。以下列举了一些示例:
- ACTIVE
- ADMIN
- ATTRIBUTE
- COMPONENT
- DEFINITION
- DESCRIPTION
- EMPTY
- EXCLUDE
- FINISH
- GROUPS
- INACTIVE
- INITIAL
- LEAD
- LOCKED
- MEMBER
- NESTED
- OFF
- OLD
- ORGANIZATION
- OTHERS
- OVER
- PATH
- PROCESS
- RANDOM
- RANK
- RESOURCE
- RETURNING
- REUSE
- ROLE
- SKIP
- SRID
- STREAM
- SYSTEM
- TIES
- URL
- VISIBLE
- ZONE
SQL 模式变更
MySQL 8 更改了默认的 SQL 模式,这涉及到服务器在评估查询时的行为。如果你使用默认 SQL 模式,则需要更新你的 SQL 语句以与新模式兼容。
在 MySQL 8 中,新默认的 SQL 模式是 ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
。它比之前版本的默认模式更严格。例如,它对 GROUP BY
语句的评估更加具体,并且在尝试除以零时会抛出错误。
另外,MySQL 8 已弃用了以下 SQL 模式:ONLY_FULL_GROUP_BY
、STRICT_TRANS_TABLES
、STRICT_ALL_TABLES
和 TRADITIONAL
,因此如果你使用了这些模式,需要将它们从你的 SQL 语句中移除。
C 风格操作符
MySQL 8 已弃用 &&
、||
和 !
等 C 风格操作符。这些操作符在 MySQL 8 中仍然可用,但将会在未来版本中移除。推荐更新你的 SQL 语句,使用标准操作符 AND
、OR
和 NOT
来代替这些操作符。
服务器错误代码
MySQL 8 更改了一些服务器错误代码。如果你在应用程序中使用这些代码(例如检查特定错误),需要将代码更新为新版代码。完整错误代码列表请参见 MySQL 文档关于错误代码的内容。
无停机时间升级 MySQL
对于大多数安装,升级过程应该相对简单。然而,很可能需要一些停机时间来完成升级过程以及为未来做准备的架构更改。如果你使用的是 RDS,他们声称数据库引擎升级需要停机,停机时间的持续时间取决于数据库实例的大小。即使使用蓝绿部署(Blue/Green Deployment)也仍需要一些停机时间,不过比传统方法更少。
执行无停机时间升级方法
幸运的是,有一种方法可以实现 MySQL 零停机时间升级。
PlanetScale 提供了一种免费的导入工具,可以在不导致任何停机或数据丢失的情况下导入实时生产数据库。我们支持 MySQL 版本从 5.7 到 8.0,因此如果你有一个 5.7 数据库,可以通过此过程导入,并且我们会自动完成到 8.0 的零停机时间升级。你可能会好奇怎样才能在不停机的情况下迁移平台,但别担心!此迁移过程也是零停机时间的。在我们复制你的架构和数据后,PlanetScale 数据库将基本上作为生产数据库的副本,所以我们会继续同步来自生产数据库的任何传入的数据变更。关于完整流程的更多信息,请阅读我们的数据库导入指南。
使用 PlanetScale 后,你未来无需为升级版本和处理停机而担忧。通过我们的托管数据库服务,你的 MySQL 数据库将始终保持最新状态。
此外,我们的产品包括无停机时间的架构更改工作流程,采用数据库分支和部署请求。
结论
简而言之,对于大多数安装,从 MySQL 5.7 升级到 8 应该是一个相对简单的过程。然而,在升级后对数据库进行彻底测试,确保其能够正确运行是非常重要的。记住,在开始升级过程之前一定要确保拥有有效的数据库备份,以防出现问题。在此过程中,建议尽可能使用 utf8mb4
字符集和 utf8mb4_0900_ai_ci
排序规则。这将使你的数据库在未来几年里更具前瞻性。此外,还要确保使用新的身份验证插件,不使用任何已弃用的数据类型、保留字或 SQL 模式。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接