

# RDS for MySQL 的主要版本升级
<a name="USER_UpgradeDBInstance.MySQL.Major"></a>

Amazon RDS 支持 MySQL 数据库引擎的以下主要版本就地升级：
+ MySQL 5.7 到 MySQL 8.0
+ MySQL 8.0 到 MySQL 8.4

**注意**  
您只能使用最新一代和当前一代数据库实例类创建 MySQL 版本 5.7、8.0 和 8.4 数据库实例。  
在某些情况下，您希望将在上一代数据库实例类上运行的数据库实例升级到具有更高 MySQL 引擎版本的数据库实例。在这些情况下，先修改数据库实例以使用最新一代或当前一代数据库实例类。执行此操作之后，您可以修改数据库实例以使用更高的 MySQL 数据库引擎版本。有关 Amazon RDS 数据库实例类的信息，请参阅[数据库实例类](Concepts.DBInstanceClass.md)。

**Topics**
+ [MySQL 主要版本升级概述](#USER_UpgradeDBInstance.MySQL.Major.Overview)
+ [升级预检查](#USER_UpgradeDBInstance.MySQL.Prechecks)
+ [升级失败后回滚](#USER_UpgradeDBInstance.MySQL.Major.RollbackAfterFailure)

## MySQL 主要版本升级概述
<a name="USER_UpgradeDBInstance.MySQL.Major.Overview"></a>

主要版本升级会包含不与现有应用程序向后兼容的数据库更改。因此，Amazon RDS 不会自动应用主要版本升级；您必须手动修改数据库实例。建议您在将任何升级应用于生产实例前全面测试这些升级。

要执行主要版本升级，请首先执行任何可用的操作系统更新。操作系统更新完成后，请升级到各个主要版本，例如从 5.7 升级到 8.0，然后再升级到 8.0 到 8.4。有关升级 RDS for MySQL 多可用区数据库集群的信息，请参阅[升级 Amazon RDS 的多可用区数据库集群的引擎版本](multi-az-db-clusters-upgrading.md)。在 2014 年 4 月 24 日之前创建的 MySQL 数据库实例会显示可用的操作系统更新，直到更新安装完成。有关操作系统升级的更多信息，请参阅 [对数据库实例应用更新](USER_UpgradeDBInstance.Maintenance.md#USER_UpgradeDBInstance.OSUpgrades)。

在 MySQL 的主要版本升级期间，如有必要，Amazon RDS 会运行 MySQL 二进制文件 `mysql_upgrade` 以便升级表。此外，Amazon RDS 会在主要版本升级期间清空 `slow_log` 和 `general_log` 表。要保留日志信息，请在升级主要版本之前保存日志内容。

MySQL 主要版本升级通常在大约 10 分钟内完成。由于数据库实例类大小不同或由于实例未遵循[Amazon RDS 的最佳实践](CHAP_BestPractices.md)中的特定操作指南，某些升级过程可能需要更长时间。如果您从 Amazon RDS 控制台升级数据库实例，则数据库实例的状态会标明升级完成的时间。如果您使用 AWS Command Line Interface (AWS CLI) 进行升级，请使用 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 命令并选中 `Status` 值。

## 升级预检查
<a name="USER_UpgradeDBInstance.MySQL.Prechecks"></a>

Amazon RDS 在升级之前会运行预检查以检查是否有不兼容问题。这些不兼容问题因要升级到的 MySQL 版本不同而异。

预检查包括 MySQL 内的一些预检查和 Amazon RDS 团队专门创建的一些预检查。有关 MySQL 提供的预检查的信息，请参阅[升级检查程序实用工具](https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-shell-utilities-upgrade.html)。

在为了升级而停止数据库实例之前先运行预检查，这意味着它们在运行时不会造成任何停机。如果预检查发现不兼容问题，Amazon RDS 会在停止数据库实例之前自动取消升级。Amazon RDS 还会针对不兼容问题生成事件。有关 Amazon RDS 事件的更多信息，请参阅 [使用 Amazon RDS 事件通知](USER_Events.md)。

Amazon RDS 在日志文件 `PrePatchCompatibility.log` 中记录有关每项不兼容性的详细信息。在大部分情况下，日志条目包括用于纠正不兼容性的 MySQL 文档的链接。有关查看日志文件的更多信息，请参阅 [查看和列出数据库日志文件](USER_LogAccess.Procedural.Viewing.md)。

由于预检查的性质，它们会分析数据库中的对象。此分析会导致资源消耗并增加完成升级的时间。

**Topics**
+ [从 MySQL 8.0 升级到 8.4 的预检查](#USER_UpgradeDBInstance.MySQL.80to84Prechecks)
+ [从 MySQL 5.7 升级到 8.0 的预检查](#USER_UpgradeDBInstance.MySQL.57to80Prechecks)

### 从 MySQL 8.0 升级到 8.4 的预检查
<a name="USER_UpgradeDBInstance.MySQL.80to84Prechecks"></a>

MySQL 8.4 与 MySQL 8.0 存在一定的不兼容性。在从 MySQL 8.0 升级到 MySQL 8.4 时，这些不兼容性会引起问题。因此，为了让升级成功，可能需要对数据库做一些准备。以下是这些不一致项的一般列表：
+ 不得有使用过时的数据类型或函数的表。
+ 触发器不得具有缺失的或空的定义程序或无效的创建上下文。
+ 不得出现关键字或保留关键字违规情况。MySQL 8.4 中可能会保留一些以前未保留的关键字。

  有关更多信息，请参阅 MySQL 文档中的[关键字和保留关键字](https://dev.mysql.com/doc/refman/8.4/en/keywords.html)。
+ MySQL 8.0 `mysql` 系统数据库中不得有与 MySQL 8.4 数据字典使用的表同名的表。
+ `sql_mode` 系统变量设置中不得定义过时的 SQL 模式。
+ 不得有包含超过 255 个字符或 1020 个字节的单个 `ENUM` 或 `SET` 列元素的表或存储过程。
+ 您的 MySQL 8.0 安装不得使用 MySQL 8.4 不支持的功能。

  有关更多信息，请参阅 MySQL 文档中的 [Features removed in MySQL 8.4](https://dev.mysql.com/doc/refman/8.4/en/mysql-nutshell.html#mysql-nutshell-removals)。
+ 不得有超过 64 个字符的外键约束名称。
+ 对于改进的 Unicode 支持，请查看以下信息：
  + 请考虑将使用 `utf8mb3` 字符集的对象转换为使用 `utf8mb4` 字符集。`utf8mb3` 字符集已弃用。
  + 请考虑对字符集引用使用 `utf8mb4` 而不是 `utf8`，因为 `utf8` 当前是 `utf8mb3` 字符集的别名。如果可能，请先将 `utf8` 更改为 `utf8mb4`，然后再升级数据库。
  + 对于 `utf8mb3`，由于较旧的客户端可能会收到未知字符集错误，因此请在升级数据库之前升级数据库客户端。

  有关更多信息，请参阅 MySQL 文档中的 [utf8mb3 字符集（3 字节 UTF-8 Unicode 编码）](https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-utf8mb3.html)。

  要更改字符集，您可以手动对数据库执行备份、还原和复制。您也可以使用 Amazon RDS 蓝绿部署。有关更多信息，请参阅 [使用 Amazon RDS 蓝绿部署进行数据库更新](blue-green-deployments.md)。

当您开始从 MySQL 8.0 更新到 8.4 时，Amazon RDS 会自动运行预检查，以便检测这些不兼容性。有关升级到 MySQL 8.4 的信息，请参阅 MySQL 文档中的 [Upgrading MySQL](https://dev.mysql.com/doc/refman/8.4/en/upgrading.html)。

这些预检查是必需的。您不能选择跳过它们。预检查提供以下好处：
+ 它们让您可以在升级期间避免出现计划外停机。
+ 如果存在不一致项，Amazon RDS 将阻止升级并提供日志以供您参阅。然后，您可以使用日志，通过减少不一致性来准备数据库以升级到 MySQL 8.4。有关消除不兼容情况的详细信息，请参阅 MySQL 文档中的 [Preparing your installation for upgrade](https://dev.mysql.com/doc/refman/8.4/en/upgrade-prerequisites.html)。

### 从 MySQL 5.7 升级到 8.0 的预检查
<a name="USER_UpgradeDBInstance.MySQL.57to80Prechecks"></a>

MySQL 8.0 与 MySQL 5.7 存在一定的不兼容性。在从 MySQL 5.7 升级到 MySQL 8.0 时，这些不兼容性会引起问题。因此，为了让升级成功，可能需要对数据库做一些准备。以下是这些不一致项的一般列表：
+ 不得有使用过时的数据类型或函数的表。
+ 不得有孤立的 \$1.frm 文件。
+ 触发器不得具有缺失的或空的定义程序或无效的创建上下文。
+ 不得有使用不支持本机分区的存储引擎的分区表。
+ 不得出现关键字或保留关键字违规情况。MySQL 8.0 中可能会保留一些以前未保留的关键字。

  有关更多信息，请参阅 MySQL 文档中的[关键字和保留关键字](https://dev.mysql.com/doc/refman/8.0/en/keywords.html)。
+ MySQL 5.7 `mysql` 系统数据库中不得有与 MySQL 8.0 数据字典使用的表同名的表。
+ `sql_mode` 系统变量设置中不得定义过时的 SQL 模式。
+ 不得有包含超过 255 个字符或 1020 个字节的单个 `ENUM` 或 `SET` 列元素的表或存储过程。
+ 在升级到 MySQL 8.0.13 或更高版本之前，不得有驻留在共享 InnoDB 表空间中的表分区。
+ MySQL 8.0.12 或更低版本中不得有对 `ASC` 子句使用 `DESC` 或 `GROUP BY` 限定符的查询和存储程序定义。
+ 您的 MySQL 5.7 安装不得使用 MySQL 8.0 不支持的功能。

  有关更多信息，请参阅 MySQL 文档中的 [MySQL 8.0 中删除的功能](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals)。
+ 不得有超过 64 个字符的外键约束名称。
+ 对于改进的 Unicode 支持，请查看以下信息：
  + 请考虑将使用 `utf8mb3` 字符集的对象转换为使用 `utf8mb4` 字符集。`utf8mb3` 字符集已弃用。
  + 请考虑对字符集引用使用 `utf8mb4` 而不是 `utf8`，因为 `utf8` 当前是 `utf8mb3` 字符集的别名。如果可能，请先将 `utf8` 更改为 `utf8mb4`，然后再升级数据库。
  + 对于 `utf8mb3`，由于较旧的客户端可能会收到未知字符集错误，因此请在升级数据库之前升级数据库客户端。

  有关更多信息，请参阅 MySQL 文档中的 [utf8mb3 字符集（3 字节 UTF-8 Unicode 编码）](https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-utf8mb3.html)。

  要更改字符集，您可以手动对数据库执行备份、还原和复制。您也可以使用 Amazon RDS 蓝绿部署。有关更多信息，请参阅 [使用 Amazon RDS 蓝绿部署进行数据库更新](blue-green-deployments.md)。

当您开始从 MySQL 5.7 更新到 8.0 时，Amazon RDS 会自动运行预检查，以便检测这些不兼容性。有关升级到 MySQL 8.0 的信息，请参阅 MySQL 文档中的[升级 MySQL](https://dev.mysql.com/doc/refman/8.0/en/upgrading.html)。

这些预检查是必需的。您不能选择跳过它们。预检查提供以下好处：
+ 它们让您可以在升级期间避免出现计划外停机。
+ 如果存在不一致项，Amazon RDS 将阻止升级并提供日志以供您参阅。然后，您可以使用日志，通过减少不一致性来准备数据库以升级到 MySQL 8.0。有关消除不兼容性的详细信息，请参阅 MySQL 文档中的[准备安装以进行升级](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)和 MySQL Server 博客上的[升级到 MySQL 8.0？ 以下是您需要了解的内容…](https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/)。

## 升级失败后回滚
<a name="USER_UpgradeDBInstance.MySQL.Major.RollbackAfterFailure"></a>

当将数据库实例从 MySQL 版本 5.7 升级到 MySQL 版本 8.0 或从 MySQL 版本 8.0 升级到 8.4 时，升级可能会失败。尤其是，如果数据字典中包含预检查未发现的不兼容性，则可能会失败。在这种情况下，数据库无法在新的 MySQL 8.0 或 8.4 版本中成功启动。此时，升级所进行的更改就会 Amazon RDS 回滚。回滚后，MySQL 数据库实例将运行原始版本：
+ MySQL 版本 8.0（用于从 MySQL 8.4 回滚）
+ MySQL 版本 5.7（用于从 MySQL 8.0 回滚）

当升级失败并回滚时，Amazon RDS 生成一个 ID 为 RDS-EVENT-0188 的事件。

通常，升级失败是因为数据库实例中的数据库与目标 MySQL 版本之间的元数据存在不兼容性。升级失败时，您可以在 `upgradeFailure.log` 文件中查看有关这些不兼容性的详细信息。在尝试再次升级之前，请先解决不兼容问题。

尝试升级和回滚失败时，您的数据库实例会重新启动。任何待处理的参数更改都将在重新启动期间应用，并在回滚后保留。

有关升级到 MySQL 8.0 的更多信息，请参阅 MySQL 文档中的以下主题：
+ [准备安装以进行升级](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)
+ [升级到 MySQL 8.0？ 您需要知道这些.](https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/)..

有关升级到 MySQL 8.4 的更多信息，请参阅 MySQL 文档中的 [Preparing Your Installation for Upgrade](https://dev.mysql.com/doc/refman/8.4/en/upgrade-prerequisites.html)。