RDS for MySQL 的主要版本升级
Amazon RDS 支持 MySQL 数据库引擎的以下主要版本就地升级:
MySQL 5.6 到 MySQL 5.7。
MySQL 5.7 到 MySQL 8.0。
注意
除了 db.m3 上一代数据库实例类以外,您只能使用最新一代和当前一代数据库实例类创建 MySQL 5.7 和 8.0 版数据库实例。
在某些情况下,您想将在上一代数据库实例类(非 db.m3)上运行的 MySQL 5.6 版数据库实例升级到 MySQL 5.7 版数据库实例。在这些情况下,先修改数据库实例以使用最新一代或当前一代数据库实例类。执行此操作之后,您就可以修改数据库实例以使用 MySQL 5.7 版数据库引擎。有关 Amazon RDS 数据库实例类的信息,请参阅数据库实例类。
MySQL 主要版本升级概述
主要版本升级会包含不与现有应用程序向后兼容的数据库更改。因此,Amazon RDS 不会自动应用主要版本升级;您必须手动修改数据库实例。建议您在将任何升级应用于生产实例前全面测试这些升级。
要将 Amazon RDS 上的 MySQL 5.6 版数据库实例的主要版本升级到 MySQL 5.7 或更高版本,先执行所有可用的操作系统更新。在操作系统更新完成后,升级到各个主要版本:5.6 到 5.7,然后 5.7 到 8.0。在 2014 年 4 月 24 日之前创建的 MySQL 数据库实例会显示可用的操作系统更新,直到更新安装完成。有关操作系统升级的更多信息,请参阅 应用数据库实例的更新。
在 MySQL 的主要版本升级期间,如有必要,Amazon RDS 会运行 MySQL 二进制文件 mysql_upgrade
以便升级表。此外,Amazon RDS 会在主要版本升级期间清空 slow_log
和 general_log
表。要保留日志信息,请在升级主要版本之前保存日志内容。
MySQL 主要版本升级通常在大约 10 分钟内完成。由于数据库实例类大小不同或由于实例未遵循Amazon RDS 的最佳实践中的特定操作指南,某些升级过程可能需要更长时间。如果您从 Amazon RDS 控制台升级数据库实例,则数据库实例的状态会标明升级完成的时间。如果您使用 Amazon Command Line Interface (Amazon CLI) 进行升级,请使用 describe-db-instances 命令并选中 Status
值。
升级到 MySQL 5.7 版的速度可能较慢
MySQL 5.6.4 版引入了 datetime
、time
和 timestamp
列的新日期和时间格式,这将允许日期和时间值包含小数部分。在将数据库实例升级到 MySQL 5.7 版时,MySQL 会强制性将所有日期和时间列类型转换为新格式。
由于此转换会重新构建表,因此,完成数据库实例升级可能需要耗费大量时间。运行 MySQL 5.6.4 之前版本的任何数据库实例都会发生强制转换。从 MySQL 5.6.4 之前版本升级到非 5.7 版的任何数据库实例也会发生强制转换。
如果您的数据库实例运行 MySQL 5.6.4 之前的版本,或者从 5.6.4 之前的版本升级,则我们建议执行一个额外步骤。在这些情况下,我们建议先转换数据库中的 datetime
、time
和 timestamp
列,然后再将数据库实例升级到 MySQL 5.7。此转换可大大减少将数据库实例升级到 MySQL 5.7 版所需的时间。要将日期和时间列升级到新格式,请对每个包含日期或时间列的表发出 ALTER TABLE
命令。由于修改表会将表锁定为只读状态,因此,我们建议您在维护时段内执行此更新。<table_name>
FORCE;
若要查找数据库拥有 datetime
、time
或 timestamp
的列的所有表,并为每个表创建一条 ALTER
TABLE
命令,请使用以下查询。<table_name>
FORCE;
SET show_old_temporals = ON; SELECT table_schema, table_name,column_name, column_type FROM information_schema.columns WHERE column_type LIKE '%/* 5.5 binary format */'; SET show_old_temporals = OFF;
从 MySQL 5.7 升级到 8.0 的预检查
MySQL 8.0 与 MySQL 5.7 存在一定的不兼容性。在从 MySQL 5.7 升级到 MySQL 8.0 时,这些不兼容性会引起问题。因此,为了让升级成功,可能需要对数据库做一些准备。以下是这些不一致项的一般列表:
-
不得有使用过时的数据类型或函数的表。
-
不得有孤立的 *.frm 文件。
-
触发器不得具有缺失的或空的定义程序或无效的创建上下文。
-
不得有使用不支持本机分区的存储引擎的分区表。
-
不得出现关键字或保留关键字违规情况。MySQL 8.0 中可能会保留一些以前未保留的关键字。
有关更多信息,请参阅 MySQL 文档中的关键字和保留关键字
。 -
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 中删除的功能
。 -
不得有超过 64 个字符的外键约束名称。
-
要获得改进的 Unicode 支持,请考虑将使用
utf8mb3
字符集的对象转换为使用utf8mb4
字符集。utf8mb3
字符集已弃用。此外,请考虑对字符集引用使用utf8mb4
而不是utf8
,因为utf8
当前是utf8mb3
字符集的别名。有关更多信息,请参阅 MySQL 文档中的 utf8mb3 字符集(3 字节 UTF-8 Unicode 编码)
。
当您开始从 MySQL 5.7 更新到 8.0 时,Amazon RDS 会自动运行预检查,以便检测这些不兼容性。有关升级到 MySQL 8.0 的信息,请参阅 MySQL 文档中的升级 MySQL
这些预检查是必需的。您不能选择跳过它们。预检查提供以下好处:
-
它们让您可以在升级期间避免出现计划外停机。
-
如果存在不一致项,Amazon RDS 将阻止升级并提供日志以供您参阅。然后,您可以使用日志,通过减少不一致性来准备数据库以升级到 MySQL 8.0。有关消除不兼容性的详细信息,请参阅 MySQL 文档中的准备安装以进行升级
和 MySQL Server 博客上的升级到 MySQL 8.0? 以下是您需要了解的内容… 。
预检查包括 MySQL 内的一些预检查和 Amazon RDS 团队专门创建的一些预检查。有关 MySQL 提供的预检查的信息,请参阅升级检查程序实用工具
在为了升级而停止数据库实例之前先运行预检查,这意味着它们在运行时不会造成任何停机。如果预检查发现不兼容问题,Amazon RDS 会在停止数据库实例之前自动取消升级。Amazon RDS 还会针对不兼容问题生成事件。有关 Amazon RDS 事件的更多信息,请参阅 使用 Amazon RDS 事件通知。
Amazon RDS 在日志文件 PrePatchCompatibility.log
中记录有关每项不兼容性的详细信息。在大部分情况下,日志条目包括用于纠正不兼容性的 MySQL 文档的链接。有关查看日志文件的更多信息,请参阅 查看和列出数据库日志文件。
由于预检查的性质,它们会分析数据库中的对象。此分析会导致资源消耗并增加完成升级的时间。
注意
Amazon RDS 仅为从 MySQL 5.7 升级到 MySQL 8.0 运行所有这些预检查。对于从 MySQL 5.6 升级到 MySQL 5.7,预检查仅限于确认没有孤立表以及确保有足够的存储空间来重建表。对于 MySQL 5.7 以下版本的升级,不会运行预检查。
从 MySQL 5.7 升级到 8.0 失败后回滚
将数据库实例从 MySQL 版本 5.7 升级到 MySQL 版本 8.0 时,升级可能会失败。尤其是,如果数据字典中包含预检查未发现的不兼容性,则可能会失败。在这种情况下,数据库无法在新的 MySQL 8.0 版本中成功启动。此时,升级所进行的更改就会 Amazon RDS 回滚。回滚后,MySQL 数据库实例将运行 MySQL 版本 5.7。当升级失败并回滚时,Amazon RDS 生成一个 ID 为 RDS-EVENT-0188 的事件。
通常,升级失败是因为数据库实例中的数据库与目标 MySQL 版本之间的元数据存在不兼容性。升级失败时,您可以在 upgradeFailure.log
文件中查看有关这些不兼容性的详细信息。在尝试再次升级之前,请先解决不兼容问题。
尝试升级和回滚失败时,您的数据库实例会重新启动。任何待处理的参数更改都将在重新启动期间应用,并在回滚后保留。
有关升级到 MySQL 8.0 的更多信息,请参阅 MySQL 文档中的以下主题:
注意
目前,只有 MySQL 5.7 到 8.0 主要版本升级才支持升级失败后自动回滚。