

# 升级 RDS for MySQL 数据库引擎
<a name="USER_UpgradeDBInstance.MySQL"></a>

如果 Amazon RDS 支持数据库引擎的新版本，您可以将您的数据库实例升级到新版本。MySQL 数据库有两种升级方式：主要版本升级和次要版本升级。

**主要版本升级。**  
*主要版本升级*会包含不与现有应用程序向后兼容的数据库更改。因此，您必须手动为数据库实例执行主要版本升级。您可以通过修改数据库实例来启动主要版本升级。在执行主要版本升级之前，建议您按照[RDS for MySQL 的主要版本升级](USER_UpgradeDBInstance.MySQL.Major.md)中的说明操作。  
对于多可用区数据库实例部署的主要版本升级，Amazon RDS 会同时升级主要副本和备用副本。在升级完成之前，数据库实例将不可用。对于多可用区数据库集群部署的主要版本升级，Amazon RDS 一次升级一个集群成员实例。  
您可以使用蓝绿部署，最大限度地减少主要版本升级所需的停机时间。有关更多信息，请参阅 [使用 Amazon RDS 蓝绿部署进行数据库更新](blue-green-deployments.md)。

**次要版本升级**  
*次要版本升级* 仅包含与现有应用程序向后兼容的更改。您可以通过修改数据库实例来手动启动次要版本升级。您也可以在创建或修改数据库实例时启用**自动次要版本升级**选项。这样做意味着 Amazon RDS 会在测试并批准新版本后自动升级您的数据库实例。有关执行升级的信息，请参阅 [升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)。  
当您对多可用区数据库集群执行次要版本升级时，Amazon RDS 将一次升级一个读取器数据库实例。然后，其中一个读取器数据库实例将切换为新的写入器数据库实例。然后，Amazon RDS 升级旧的写入器实例（现在是读取器实例）。  
多可用区数据库*实例*部署的次要版本升级的停机时间可能会持续几分钟。多可用区数据库集群通常可将次要版本升级的停机时间缩短至大约 35 秒。与 RDS 代理一起使用时，您可以将停机时间进一步缩短到一秒或更短。有关更多信息，请参阅 [Amazon RDS 代理](rds-proxy.md)。或者，您可以使用开源数据库代理，例如 [ProxySQL](https://aws.amazon.com/blogs/database/achieve-one-second-or-less-of-downtime-with-proxysql-when-upgrading-amazon-rds-multi-az-deployments-with-two-readable-standbys/)、[PgBouncer](https://aws.amazon.com/blogs/database/fast-switchovers-with-pgbouncer-on-amazon-rds-multi-az-deployments-with-two-readable-standbys-for-postgresql/) 或 [AWS Advanced JDBC Wrapper Driver](https://aws.amazon.com/blogs/database/achieve-one-second-or-less-downtime-with-the-advanced-jdbc-wrapper-driver-when-upgrading-amazon-rds-multi-az-db-clusters/)。

Amazon RDS 还支持升级推出策略，以管理跨多个数据库资源和 AWS 账户的自动次要版本升级。有关更多信息，请参阅 [使用 AWS Organizations 升级推出策略自动升级次要版本](RDS.Maintenance.AMVU.UpgradeRollout.md)。

如果 MySQL 数据库实例使用只读副本，则必须在升级源实例之前升级所有只读副本。

**Topics**
+ [MySQL 升级的注意事项](#USER_UpgradeDBInstance.MySQL.Considerations)
+ [查找有效的升级目标](#USER_UpgradeDBInstance.MySQL.FindingTargets)
+ [MySQL 版本号](USER_UpgradeDBInstance.MySQL.VersionID.md)
+ [RDS for MySQL 中的 RDS 版本号](USER_UpgradeDBInstance.MySQL.rds.version.md)
+ [RDS for MySQL 的主要版本升级](USER_UpgradeDBInstance.MySQL.Major.md)
+ [测试 RDS for MySQL 升级](USER_UpgradeDBInstance.MySQL.UpgradeTesting.md)
+ [升级 MySQL 数据库实例](#USER_UpgradeDBInstance.MySQL.Upgrading)
+ [RDS for MySQL 的自动次要版本升级](USER_UpgradeDBInstance.MySQL.Minor.md)
+ [使用只读副本在升级 RDS for MySQL 数据库时减少停机时间](USER_UpgradeDBInstance.MySQL.ReducedDowntime.md)
+ [使用事件监控 RDS for MySQL 引擎升级](USER_UpgradeDBInstance.MySQL.Monitoring.md)

## MySQL 升级的注意事项
<a name="USER_UpgradeDBInstance.MySQL.Considerations"></a>

在升级流程期间，Amazon RDS 会创建两个或更多数据库快照。在进行任何升级更改*之前*，Amazon RDS 最多会拍摄两个数据库实例快照。如果无法完成数据库的升级，那么，就可以还原这些快照之一，来创建一个运行旧版本的数据库实例。升级完成后，Amazon RDS 会为数据库实例拍摄另一个快照。无论 AWS Backup 是否管理数据库实例的备份，Amazon RDS 都会拍摄这些快照。

**注意**  
如果您将数据库实例的备份保留期设置为大于 0 的数字，则 Amazon RDS 只需创建数据库快照。要更改您的备份保留期，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

升级完成后，您无法恢复为数据库引擎的以前版本。如果要返回以前版本，则还原创建的第一个数据库快照以新建数据库实例。

您可以控制何时将数据库实例升级到 Amazon RDS 支持的新版本。此级别的控制可帮助您保留与特定数据库版本的兼容性，并在生产中部署前使用应用程序测试新版本。在您准备好后，可在与时间表最搭配的时间执行版本升级。

如果数据库实例使用只读复制，则必须在升级源实例之前升级所有只读副本。

## 查找有效的升级目标
<a name="USER_UpgradeDBInstance.MySQL.FindingTargets"></a>

使用 AWS 管理控制台 升级数据库实例时，它会显示数据库实例的有效升级目标。您还可以运行以下 AWS CLI 命令来标识数据库实例的有效升级目标：

对于 Linux、macOS 或 Unix：

```
aws rds describe-db-engine-versions \
  --engine mysql \
  --engine-version version_number \
  --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text
```

对于：Windows

```
aws rds describe-db-engine-versions ^
  --engine mysql ^
  --engine-version version_number ^
  --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text
```

例如，要标识 MySQL 版本 8.0.28 数据库实例的有效升级目标，请运行以下 AWS CLI 命令：

对于 Linux、macOS 或 Unix：

```
aws rds describe-db-engine-versions \
  --engine mysql \
  --engine-version 8.0.28 \
  --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text
```

对于：Windows

```
aws rds describe-db-engine-versions ^
  --engine mysql ^
  --engine-version 8.0.28 ^
  --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" --output text
```

# MySQL 版本号
<a name="USER_UpgradeDBInstance.MySQL.VersionID"></a>

RDS for MySQL 数据库引擎的版本编号序列采用 *major.minor.patch.YYYYMMDD* 或 *major.minor.patch* 形式，例如 8.0.33.R2.20231201 或 5.7.44。使用的格式取决于 MySQL 引擎版本。有关 RDS 扩展支持版本号的信息，请参阅[Amazon RDS Extended Support 版本命名](extended-support-versions.md#extended-support-naming)。

**major**  
主要版本号是版本号的整数和第一个小数点后的部分，例如 8.0。主要版本升级会增加版本号的主要版本部分。例如，从 *5.7*.44 升级到 8.0.33 是主要版本升级，其中 *5.7* 和 *8.0* 为主要版本号。

**minor**  
次要版本号是版本号的第三部分，例如 8.0.33 中的 33。

**patch**  
补丁是版本号的第四部分，例如 8.0.33.R2 中的 R2。RDS 补丁版本包括在发布后添加到次要版本的重要错误修复。

**YYYYMMDD**  
日期是版本号的第五部分，例如 8.0.33.R2.20231201 中的 20231201。RDS 日期版本是一个安全补丁，它包括在发布后添加到次要版本的重要安全修复程序。它不包括任何可能更改引擎行为的修复程序。

下表说明了 RDS for MySQL 版本 8.4 的命名方案。


| 8.4 次要版本 | 命名模式 | 
| --- | --- | 
|  ≥ 3  |  新的数据库实例使用 *major.minor.patch.YYMMDD*，例如 8.4.3.R2.20241201。 在下一次主要版本或次要版本升级之前，现有数据库实例可能使用 *major.minor.patch*，例如 8.4.3.R2。 | 

下表说明了 RDS for MySQL 版本 8.0 的命名方案。


| 8.0 次要版本 | 命名模式 | 
| --- | --- | 
|  ≥ 33  |  新的数据库实例使用 *major.minor.patch.YYMMDD*，例如 8.0.33.R2.20231201。 在下一次主要版本或次要版本升级之前，现有数据库实例可能使用 *major.minor.patch*，例如 8.0.33.R2。  | 
|  < 33  |  现有数据库实例使用 *major.minor.patch*，例如 8.0.32.R2。  | 

下表说明了 RDS for MySQL 版本 5.7 的命名方案。


| 5.7 次要版本 | 命名模式 | 
| --- | --- | 
|  ≥ 42  |  新的数据库实例使用 *major.minor.patch.YYMMDD*，例如 5.7.42.R2.20231201。 在下一次主要版本或次要版本升级之前，现有数据库实例可能使用 *major.minor.patch*，例如 5.7.42.R2。  | 

# RDS for MySQL 中的 RDS 版本号
<a name="USER_UpgradeDBInstance.MySQL.rds.version"></a>

RDS 版本号使用 `major.minor.patch` 或 `major.minor.patch.YYYYMMDD` 命名方案。Amazon RDS 扩展支持版本使用 *minor-RDS.YYYYMMDD* 次要版本命名方案。

RDS 补丁版本包括在发布后添加到次要版本的重要错误修复。RDS 日期版本（*YYYYMMDD*）是一个安全补丁。安全补丁不包括任何可能更改引擎行为的修复程序。有关 RDS 扩展支持版本号的信息，请参阅[Amazon RDS Extended Support 版本命名](extended-support-versions.md#extended-support-naming)。

您可以通过以下 SQL 查询找出 RDS for MySQL 数据库的 RDS 版本号：

```
mysql> select mysql.rds_version();
```

例如，查询 RDS for MySQL 8.0.34 数据库将返回以下输出：

```
+---------------------+
| mysql.rds_version() |
+---------------------+
| 8.0.34.R2.20231201  |
+---------------------+
1 row in set (0.01 sec)
```

# 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)。

# 测试 RDS for MySQL 升级
<a name="USER_UpgradeDBInstance.MySQL.UpgradeTesting"></a>

在数据库实例上执行主要版本升级前，彻底地测试数据库，了解是否与新版本兼容。此外，彻底地测试访问数据库的所有应用程序，了解是否与新版本兼容。建议您使用以下过程。

**测试主要版本升级**

1. 检查新版数据库引擎的升级文档以了解是否存在可能会影响数据库或应用程序的兼容性问题：
   +  [MySQL 5.7 中的变化](http://dev.mysql.com/doc/refman/5.7/en/upgrading-from-previous-series.html) 
   +  [MySQL 8.0 中的变化](http://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html) 
   + [MySQL 8.4 中的变化](http://dev.mysql.com/doc/refman/8.4/en/upgrading-from-previous-series.html) 

1. 如果数据库实例是自定义数据库参数组的成员，就必须使用兼容新主要版本的现有设置创建一个新的数据库参数组。在升级测试实例时，应指定新的数据库参数组，以便升级测试可确保其运行正常。有关创建数据库参数组的详细信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

1. 为要升级的数据库实例创建数据库快照。有关更多信息，请参阅“[为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)”。

1. 恢复数据库快照，以便创建一个新的测试数据库实例。有关更多信息，请参阅“[还原到数据库实例](USER_RestoreFromSnapshot.md)”。

1. 使用下方详细介绍的某种方法，修改此新测试数据库实例以将其升级到新版本。如果您在步骤 2 中创建了一个新的参数组，则指定该参数组。

1. 计算升级的实例使用的存储容量以决定升级是否需要额外的存储容量。

1. 对升级的数据库实例运行所需次数的质量保证测试以确保数据库和应用程序可正常使用新版本。实施任何必需的新测试，评估您在步骤 1 中发现的任何兼容性问题的影响。测试所有的存储过程和功能。将应用程序的测试版本指向所升级的数据库实例。

1. 如果所有测试通过，那么请在生产数据库实例上执行升级。建议您直到确认一切正常后，再允许对数据库实例执行写入操作。

## 升级 MySQL 数据库实例
<a name="USER_UpgradeDBInstance.MySQL.Upgrading"></a>

有关手动或自动升级 MySQL 数据库实例的信息，请参阅[升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)。

# RDS for MySQL 的自动次要版本升级
<a name="USER_UpgradeDBInstance.MySQL.Minor"></a>

如果在创建或修改数据库实例时指定以下设置，则可以让数据库实例自动升级。
+ **自动次要版本升级**设置已启用。
+ **备份保留期**设置需大于 0。

在 AWS 管理控制台 中，这些设置位于 **Additional configuration**（其他配置）下。下图显示了 **Auto minor version upgrade**（自动次要版本升级）设置。

![\[Amazon RDS 控制台中选择了允许自动次要版本升级的维护部分。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/amvu.png)


有关这些设置的更多信息，请参阅 [数据库实例的设置](USER_ModifyInstance.Settings.md)。

对于某些 AWS 区域中的某些 RDS for MySQL 主要版本，RDS 将一个次要版本指定为自动升级版本。在 Amazon RDS 测试并批准次要版本后，将在维护时段内自动进行次要版本升级。RDS 不会自动将发布的较新次要版本设置为自动升级版本。在 RDS 指定较新的自动升级版本之前，将会考虑一些条件，例如：
+ 已知的安全问题
+ MySQL 社区版本中的错误
+ 发布次要版本后的整体队列稳定性

您可以运行以下 AWS CLI 命令，以确定特定 AWS 区域中指定 MySQL 次要版本的当前自动次要升级目标版本。

对于 Linux、macOS 或 Unix：

```
aws rds describe-db-engine-versions \
--engine mysql \
--engine-version minor_version \
--region region \
--query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" \
--output text
```

对于 Windows：

```
aws rds describe-db-engine-versions ^
--engine mysql ^
--engine-version minor_version ^
--region region ^
--query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" ^
--output text
```

例如，以下 AWS CLI 命令可确定美国东部（俄亥俄州）AWS 区域 (us-east-2) 中 MySQL 次要版本 8.0.11 的自动次要升级目标。

对于 Linux、macOS 或 Unix：

```
aws rds describe-db-engine-versions \
--engine mysql \
--engine-version 8.0.11 \
--region us-east-2 \
--query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" \
--output table
```

对于 Windows：

```
aws rds describe-db-engine-versions ^
--engine mysql ^
--engine-version 8.0.11 ^
--region us-east-2 ^
--query "DBEngineVersions[*].ValidUpgradeTarget[*].{AutoUpgrade:AutoUpgrade,EngineVersion:EngineVersion}" ^
--output table
```

输出类似于以下内容。

```
----------------------------------
|    DescribeDBEngineVersions    |
+--------------+-----------------+
|  AutoUpgrade |  EngineVersion  |
+--------------+-----------------+
|  False       |  8.0.15         |
|  False       |  8.0.16         |
|  False       |  8.0.17         |
|  False       |  8.0.19         |
|  False       |  8.0.20         |
|  False       |  8.0.21         |
|  True        |  8.0.23         |
|  False       |  8.0.25         |
+--------------+-----------------+
```

在此示例中，`AutoUpgrade` 值对于 MySQL 版本 8.0.23 为 `True`。因此，自动次要升级目标是 MySQL 版本 8.0.23，它在输出中突出显示。

如果满足以下条件，则会在维护时段内自动升级 MySQL 数据库实例：
+ **自动次要版本升级**设置已启用。
+ **备份保留期**设置需大于 0。
+ 数据库实例运行的次要数据库引擎版本低于当前的自动升级次要版本。

有关更多信息，请参阅“[自动升级次要引擎版本](USER_UpgradeDBInstance.Upgrading.md#USER_UpgradeDBInstance.Upgrading.AutoMinorVersionUpgrades)”。

# 使用只读副本在升级 RDS for MySQL 数据库时减少停机时间
<a name="USER_UpgradeDBInstance.MySQL.ReducedDowntime"></a>

在大多数情况下，蓝绿部署是升级 MySQL 数据库实例时减少停机时间的最佳选项。有关更多信息，请参阅 [使用 Amazon RDS 蓝绿部署进行数据库更新](blue-green-deployments.md)。

如果您无法使用蓝绿部署，并且 MySQL 数据库实例当前与生产应用程序结合使用，则可使用以下过程来升级数据库实例的数据库版本。此过程可以减少应用程序的停机时间。

使用只读副本，您可以提前执行大多数维护步骤，并在实际停机期间尽量减少必要的更改。利用此技巧，您可以在不对现有数据库实例进行任何更改的情况下测试和准备新的数据库实例。

以下过程显示了从 MySQL 5.7 版升级到 MySQL 8.0 版的示例。您可以使用相同的常规步骤升级到其他主要版本。您可以使用相同的常规步骤升级到其他主要版本。

**注意**  
当您从 MySQL 版本 5.7 升级到 MySQL 版本 8.0 或从 MySQL 版本 8.0 升级到 MySQL 版本 8.4 时，请在执行升级之前完成预检查。有关更多信息，请参阅[从 MySQL 5.7 升级到 8.0 的预检查](USER_UpgradeDBInstance.MySQL.Major.md#USER_UpgradeDBInstance.MySQL.57to80Prechecks) 和[从 MySQL 8.0 升级到 8.4 的预检查](USER_UpgradeDBInstance.MySQL.Major.md#USER_UpgradeDBInstance.MySQL.80to84Prechecks)。

**在使用数据库实例时升级 MySQL 数据库**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 创建 MySQL 5.7 数据库实例的只读副本。该过程可创建数据库的可升级副本。可能还存在数据库实例的其他只读副本。

   1. 在控制台上，选择**数据库**，然后选择您要升级的数据库实例。

   1. 对于 **Actions (操作)**，选择 **Create read replica (创建只读副本)**。

   1. 为只读副本提供**数据库实例标识符**的值，并确保**数据库实例类**和其他设置与您的 MySQL 5.7 数据库实例匹配。

   1. 选择 **Create read replica (创建只读副本)**。

1. （可选）创建只读副本且**状态**显示为**可用**之后，将只读副本转换为多可用区部署并启用备份。

   默认情况下，创建的只读副本禁用了备份。由于只读副本最终成为生产数据库实例，因此最佳实践是配置多可用区部署并启用备份。

   1. 在控制台上，选择**数据库**，然后选择您刚创建的只读副本。

   1. 选择**修改**。

   1. 对于**多可用区部署**，请选择**创建备用实例**。

   1. 对于 **Backup Retention Period**（备份保留期），请选择正的非零值（如 3 天），然后选择 **Continue**（继续）。

   1. 对于**修改计划**，选择**立即应用**。

   1. 选择**修改数据库实例**。

1. 只读副本**状态**显示**可用**后，请将只读副本升级到 MySQL 8.0：

   1. 在控制台上，选择**数据库**，然后选择您刚创建的只读副本。

   1. 选择**修改**。

   1. 对于**数据库引擎版本**，选择升级目标版本 MySQL 8.0 版，然后选择**继续**。

   1. 对于**修改计划**，选择**立即应用**。

   1. 选择 **Modify DB instance (修改数据库实例)**开始升级。

1. 升级完成并且**状态**显示为**可用**之后，验证升级的只读副本是否与源 MySQL 5.7 数据库实例保持同步。要进行验证，请连接到只读副本并运行 `SHOW REPLICA STATUS` 命令。如果 `Seconds_Behind_Master` 字段为 `0`，则复制保持最新。
**注意**  
以前的 MySQL 版本使用的是 `SHOW SLAVE STATUS`，而不是 `SHOW REPLICA STATUS`。如果您使用的 MySQL 版本低于 8.0.23，那么请使用 `SHOW SLAVE STATUS`。

1. （可选）创建只读副本的只读副本。

   如果您希望数据库实例在提升为独立数据库实例后拥有只读副本，则可以立即创建只读副本。

   1. 在控制台上，选择**数据库**，然后选择您刚刚升级的只读副本。

   1. 对于 **Actions (操作)**，选择 **Create read replica (创建只读副本)**。

   1. 为只读副本提供**数据库实例标识符**的值，并确保**数据库实例类**和其他设置与您的 MySQL 5.7 数据库实例匹配。

   1. 选择 **Create read replica (创建只读副本)**。

1. （可选）为只读副本配置自定义数据库参数组。

   如果您希望数据库实例在提升为独立数据库实例后使用自定义参数组，则可以立即创建数据库参数组，并将其与只读副本相关联。

   1. 为 MySQL 8.0 创建自定义数据库参数组。有关说明，请参阅[在 Amazon RDS 中创建数据库参数组](USER_WorkingWithParamGroups.Creating.md)。

   1. 修改要在刚创建的数据库参数组中更改的参数。有关说明，请参阅[在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

   1. 在控制台中，选择**数据库**，然后选择只读副本。

   1. 选择**修改**。

   1. 对于**数据库参数组**，请选择刚创建的 MySQL 8.0 数据库参数组，然后选择**继续**。

   1. 对于**修改计划**，选择**立即应用**。

   1. 选择 **Modify DB instance (修改数据库实例)**开始升级。

1. 使您的 MySQL 8.0 只读副本成为独立的数据库实例。
**重要**  
将 MySQL 8.0 只读副本提升为独立的数据库实例后，它不再是 MySQL 5.7 数据库实例的副本。建议您在源 MySQL 8.0 数据库实例处于只读模式并且所有写入操作都暂停的维护时段期间，提升 MySQL 5.7 只读副本。提升完成之后，您可以将写入操作定向到已升级的 MySQL 8.0 数据库实例，以确保不会丢失写入操作。  
此外，建议您在提升 MySQL 8.0 只读副本之前，对 MySQL 8.0 只读副本执行所有必需的数据定义语言 (DDL) 操作。例如，创建索引。此方法可避免在 MySQL 8.0 只读副本提升之后对其性能造成任何负面影响。要提升只读副本，请使用以下过程。

   1. 在控制台上，选择**数据库**，然后选择您刚刚升级的只读副本。

   1. 对于**操作**，请选择**提升**。

   1. 选择**是**，为只读副本实例启用自动备份。有关更多信息，请参阅“[备份简介](USER_WorkingWithAutomatedBackups.md)”。

   1. 选择 **Continue (继续)**。

   1. 选择 **Promote Read Replica**。

1. 您现在有了 MySQL 数据库的升级版本。此时，您可以将应用程序定向到新的 MySQL 8.0 数据库实例。

# 使用事件监控 RDS for MySQL 引擎升级
<a name="USER_UpgradeDBInstance.MySQL.Monitoring"></a>

在升级 RDS for MySQL 数据库的引擎版本时，Amazon RDS 在流程的每个阶段都会发出一个特定的事件。要跟踪升级进度，您可以查看或订阅这些事件。

 有关 RDS 事件的更多信息，请参阅[监控 Amazon RDS 事件](working-with-events.md)。

有关引擎升级期间发生的特定 Amazon RDS 事件的详细信息，请参阅[Amazon RDS 事件类别和事件消息](USER_Events.Messages.md)。