Aurora MySQL 的主要版本升级预检查 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Aurora MySQL 的主要版本升级预检查

MySQL 8.0 与 MySQL 5.7 存在一定的不兼容性。在从 Aurora MySQL 版本 2 升级到版本 3 的过程中,这些不兼容性会引起问题。为了让升级成功,可能需要对数据库做一些准备。

当您开始从 Aurora MySQL 版本 2 升级到版本 3 时,Amazon Aurora 会自动运行预检查,以便检测这些不兼容性。

这些预检查是必需的。您不能选择跳过它们。预检查提供以下好处:

  • 它们让您可以在升级期间避免出现计划外停机。

  • 如果存在不一致项,Amazon Aurora 将阻止升级并提供日志以供您参阅。然后,您可以使用日志,通过减少不一致性来准备数据库以升级到版本 3。有关消除不兼容性的详细信息,请参阅 MySQL 文档中的准备安装以进行升级和 MySQL Server 博客上的升级到 MySQL 8.0? 以下是您需要了解的内容…

    有关升级到 MySQL 8.0 的更多信息,请参阅 MySQL 文档中的升级 MySQL

预检查包括 MySQL 内包含的一些预检查和 Aurora 团队专门创建的一些预检查。有关 MySQL 提供的预检查的信息,请参阅升级检查程序实用程序

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

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

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

社区 MySQL 升级预检查

以下是 MySQL 5.7 和 8.0 之间不兼容性的一般列表:

  • 与 MySQL 5.7 兼容的数据库集群不得使用 MySQL 8.0 不支持的功能。

    有关更多信息,请参阅 MySQL 文档中的 MySQL 8.0 中删除的功能

  • 不得出现关键字或保留关键字违规情况。MySQL 8.0 中可能会保留一些以前未保留的关键字。

    有关更多信息,请参阅 MySQL 文档中的关键字和保留关键字

  • 要获得改进的 Unicode 支持,请考虑将使用 utf8mb3 字符集的对象转换为使用 utf8mb4 字符集。utf8mb3 字符集已弃用。此外,请考虑对字符集引用使用 utf8mb4 而不是 utf8,因为 utf8 当前是 utf8mb3 字符集的别名。

    有关更多信息,请参阅 MySQL 文档中的 utf8mb3 字符集(3 字节 UTF-8 Unicode 编码)

  • 不得有非默认行格式的 InnoDB 表。

  • 不得有 ZEROFILLdisplay 长度类型属性。

  • 不得有使用不支持本机分区的存储引擎的分区表。

  • MySQL 5.7 mysql 系统数据库中不得有与 MySQL 8.0 数据字典使用的表同名的表。

  • 不得有使用过时的数据类型或函数的表。

  • 不得有超过 64 个字符的外键约束名称。

  • sql_mode 系统变量设置中不得定义过时的 SQL 模式。

  • 不得有包含长度超过 255 个字符的单个 ENUMSET 列元素的表或存储过程。

  • 不得有驻留在共享 InnoDB 表空间中的表分区。

  • 表空间数据文件路径中不得有循环引用。

  • 不得有对 GROUP BY 子句使用 ASCDESC 限定符的查询和存储程序定义。

  • 不得有任何已移除的系统变量,并且系统变量必须使用适用于 MySQL 8.0 的新默认值。

  • 不得有零(0)日期、日期时间或时间戳值。

  • 不得有由于文件移除或损坏而导致的架构不一致。

  • 不得有包含 FTS 字符串的表名称。

  • 不得有属于不同引擎的 InnoDB 表。

  • 不得有对于 MySQL 5.7 无效的表或架构名称。

有关升级到 MySQL 8.0 的更多信息,请参阅 MySQL 文档中的升级 MySQL

Aurora MySQL 升级预检查

Aurora MySQL 在从版本 2 升级到版本 3 时有自己的特定要求:

  • 视图、例程、触发器和事件中不得有弃用的 SQL 语法,例如 SQL_CACHESQL_NO_CACHEQUERY_CACHE

  • 没有 FTS 索引的任何表上都不得有 FTS_DOC_ID 列。

  • InnoDB 数据字典和实际表定义之间不得有列定义不匹配。

  • lower_case_table_names 参数设置为 1 时,所有数据库和表名都必须为小写。

  • 事件和触发器不得有缺失的或空的定义程序或无效的创建上下文。

  • 数据库中的所有触发器名称都必须是唯一的。

  • Aurora MySQL 版本 3 不支持 DDL 恢复和快速 DDL。数据库中不得有与这些功能相关的构件。

  • 采用 REDUNDANTCOMPACT 行格式的表的索引不能大于 767 字节。

  • tiny 文本列上定义的索引的前缀长度不能超过 255 字节。对于 utf8mb4 字符集,这会将支持的前缀长度限制为 63 个字符。

    在 MySQL 5.7 中,使用 innodb_large_prefix 参数可允许更大的前缀长度。MySQL 8.0 中已弃用此参数。

  • mysql.host 表中不得有 InnoDB 元数据不一致。

  • 系统表中不得有列数据类型不匹配。

  • 不得有 XA 事务处于 prepared 状态。

  • 视图中的列名称不能超过 64 个字符。

  • 存储过程中的特殊字符不能不一致。

  • 表不能有数据文件路径不一致。

Aurora MySQL 主要版本升级路径

并非所有类型或版本的 Aurora MySQL 集群都可以使用就地升级机制。通过查阅下表,您可以了解每个 Aurora MySQL 集群的适当升级路径。

Aurora MySQL 数据库集群类型 它可以使用就地升级吗? 操作

Aurora MySQL 预置集群,2.0 或更高版本

与 5.7 兼容的 Aurora MySQL 集群支持就地升级。

有关升级到 Aurora MySQL 版本 3 的信息,请参阅 为 Aurora MySQL 集群计划主要版本升级如何执行就地升级

Aurora MySQL 预调配集群,3.01.0 或更高版本

不适用

使用次要版本升级过程在 Aurora MySQL 版本 3 的各版本之间进行升级。

Aurora Serverless v1 集群

不适用

目前,只有 Aurora MySQL 版本 2 支持 Aurora Serverless v1。

Aurora Serverless v2 集群

不适用

目前,只有 Aurora MySQL 版本 3 支持 Aurora Serverless v2。

Aurora 全局数据库中的集群

要将 Aurora MySQL 从版本 2 升级到版本 3,请按照对 Aurora 全局数据库中的集群进行就地升级的过程操作。在全局集群上执行升级。Aurora 会同时升级全局数据库中的主集群以及所有辅助集群。

如果您使用 Amazon CLI 或 RDS API,请调用 modify-global-cluster 命令或 ModifyGlobalCluster 操作,而不是 modify-db-clusterModifyDBCluster

如果开启了 lower_case_table_names 参数,则无法执行从 Aurora MySQL 版本 2 到版本 3 的就地升级。有关更多信息,请参阅 主要版本升级

并行查询集群

您可以执行就地升级。在此情况下,为 Aurora MySQL 版本选择 2.09.1 或更高版本。

二进制日志复制的目标集群

也许

如果二进制日志复制来自 Aurora MySQL 集群,您可以执行就地升级。如果二进制日志复制来自 RDS for MySQL 或本地 MySQL 数据库实例,则无法执行升级。在这种情况下,您可以使用快照还原机制进行升级。

具有零数据库实例的集群

使用 Amazon CLI 或 RDS API,您可以在没有任何附加的数据库实例的情况下创建 Aurora MySQL 集群。同样,您还可以从 Aurora MySQL 集群中删除所有数据库实例,同时保持集群卷中的数据不变。虽然集群的数据库实例为零,但您无法执行就地升级。

升级机制要求集群中的写入器实例对系统表、数据文件等执行转换。在这种情况下,请使用 Amazon CLI 或 RDS API 为集群创建写入器实例。然后你可以执行就地升级。

启用了回溯的集群

您可以对使用回溯功能的 Aurora MySQL 集群执行就地升级。但是,升级后,您无法将集群回溯到升级之前的时间。

Aurora MySQL 主要版本就地升级的工作原理

Aurora MySQL 将主要版本升级作为多节点过程执行。您可以查看升级的当前状态。有些升级步骤还提供进度信息。每个阶段开始时,Aurora MySQL 会记录一个事件。您可以在 RDS 控制台的 Events(事件)页面上检查事件发生的事件。有关使用事件的更多信息,请参阅使用 Amazon RDS 事件通知

重要

一旦该过程开始,它就会运行,直到升级成功或失败。您不能在升级进行中取消升级。如果升级失败,Aurora 将回滚所有更改,并且集群具有与以前相同的引擎版本、元数据等。

升级过程包括三个阶段:

  1. Aurora 在开始升级过程之前执行一系列预检查。在 Aurora 进行这些检查的同时,您的集群会保持运行。例如,集群不能有任何处于准备状态的 XA 事务,也不能处理任何数据定义语言 (DDL) 语句。例如,您可能需要关闭提交某些类型的 SQL 语句的应用程序。或者,您只需等待某些长期运行的语句完成。然后再次尝试升级。有些检查会测试不会阻止升级但可能使升级花费很长时间的条件。

    如果 Aurora 检测到任何必需条件未满足,请修改事件详细信息中识别的条件。按照Aurora MySQL 就地升级的故障排除中的指导进行操作。如果 Aurora 检测到可能导致升级缓慢的情况,请计划在一段较长的时间内监控升级。

  2. Aurora 使您的集群离线。然后,Aurora 执行与上一阶段类似的一组测试,以确认关机过程中没有产生新问题。如果此时 Aurora 检测到任何会阻止升级的情况,Aurora 会取消升级并使集群恢复联机。在这种情况下,请确认条件何时不再适用,然后再次开始升级。

  3. Aurora 创建集群卷的快照。假设您在升级完成后兼容性或其他类型的问题。或者假设您想同时使用原始集群和升级后的集群执行测试。在这种情况下,您可以从此快照中还原,以使用原始引擎版本和原始数据创建新集群。

    提示

    此快照是手动快照。但是,即使您已经达到手动快照的配额,Aurora 也可以创建手动快照并继续升级过程。此快照将永久保留(如果需要),直到您将其删除。完成所有升级后测试后,您可以删除此快照以最大限度地减少存储费用。

  4. Aurora 克隆集群卷。克隆是一项快速的操作,不涉及复制实际的表数据。如果 Aurora 在升级过程中遇到问题,它将从克隆的集群卷恢复为原始数据,然后使集群重新联机。升级期间的临时克隆卷不受单个集群卷的克隆数量的通常限制。

  5. Aurora 对写入器数据库实例执行清理关机。在清理关机期间,以下操作的进度事件每 15 分钟记录一次。您可以在 RDS 控制台的 Events(事件)页面上检查事件发生的事件。

    • Aurora 清除旧版本行的撤销记录。

    • Aurora 回滚任何未提交的事务。

  6. Aurora 升级写入器数据库实例上的引擎版本:

    • Aurora 在写入器数据库实例上安装新引擎版本的二进制文件。

    • Aurora 使用写入器数据库实例将数据升级为兼容 MySQL 5.7 的格式。在此阶段,Aurora 修改系统表并执行影响集群卷中的数据的其他转换。特别是,Aurora 升级系统表中的分区元数据以与 MySQL 5.7 分区格式兼容。如果集群中的表有大量分区,则此阶段可能需要花费很长时间。

      如果在此阶段发生任何错误,您可以在 MySQL 错误日志中找到详细信息。此阶段开始后,如果升级过程因任何原因失败,Aurora 将从克隆的集群卷中恢复原始数据。

  7. Aurora 升级读取器数据库实例上的引擎版本。

  8. 升级过程已完成。Aurora 记录最后一个事件以表示升级过程已成功完成。现在,您的数据库集群正在运行新的主要版本。

蓝绿部署

在某些情况下,您的首要任务是立即从旧集群切换到升级后的集群。在此类情况下,您可以使用多步骤流程,并排运行新旧集群。此处,您可以将数据从旧集群复制到新集群,直到您准备好接管新集群。有关详细信息,请参阅使用 Amazon RDS 蓝绿部署进行数据库更新