当您升级参与复制拓扑结构的服务器时,需要考虑每个服务器在拓扑结构中的角色,并注意特定于复制的issue。有关升级 MySQL Server 实例的一般信息和说明,请参阅 第 3 章,升级 MySQL。
如 第 19.5.2 节,“MySQL 版本之间的复制兼容性” 所述,MySQL 支持从一个版本系列的源服务器到下一个版本系列的副本服务器的复制,但不支持从较晚版本的源服务器到较早版本的副本服务器的复制。较早版本的副本可能不具备处理较晚版本源服务器可以处理的事务的能力。因此,您必须在升级源服务器到目标版本之前,升级所有副本到目标 MySQL Server 版本。在这种情况下,您永远不会面临着较早版本的副本尝试处理来自较晚版本源服务器的事务的情况。
在多源复制拓扑结构中,不支持使用多个 MySQL Server 版本, 无论是源服务器还是副本服务器。这条限制不仅适用于版本系列,还适用于同一版本系列中的版本号。
如果您需要降级复制拓扑结构中的服务器,必须先降级源服务器,然后降级副本服务器。在副本服务器上,您必须确保二进制日志和中继日志已经完全处理,并删除它们,然后再进行降级。
尽管升级顺序正确,但是在从较早版本的源服务器复制到较晚版本的副本服务器时,仍可能遇到复制困难。这可能是因为源服务器使用了较晚版本副本服务器不支持的语句或依赖于行为。在这种情况下,您可以使用 MySQL Shell 的升级检查器实用程序 util.checkForServerUpgrade()
来检查 MySQL 5.7 服务器实例或 MySQL 8.0 服务器实例,以便升级到 GA MySQL 8.0 版本。该实用程序将识别服务器实例需要修复的任何问题,以便在升级后不再出现问题,包括较晚版本中不再可用的功能和行为。请参阅 升级检查器实用程序 了解更多信息。
如果您正在升级不支持全局事务标识符(GTIDs)的 MySQL 版本到支持 GTIDs 的版本,只有在确保设置满足 GTID-based 复制的所有要求时,才在源服务器和副本服务器上启用 GTIDs。请参阅 第 19.1.3.4 节,“使用 GTIDs 设置复制” 了解有关将二进制日志文件位置基于复制设置转换为使用 GTID-based 复制的信息。
严格 SQL 模式 (STRICT_TRANS_TABLES
或 STRICT_ALL_TABLES
) 中的更改可能会导致升级后的副本服务器上出现复制失败。如果您使用基于语句的日志记录 (binlog_format=STATEMENT
),如果副本服务器升级之前,源服务器执行的语句可能会在副本服务器上失败,从而导致复制停止。要解决这个问题,可以停止源服务器上的所有新语句,等待副本服务器赶上,然后升级副本服务器。或者,如果您不能停止新语句,可以临时将源服务器上的日志格式更改为基于行的日志记录 (binlog_format=ROW
),然后等待所有副本服务器处理完所有二进制日志,最后升级副本服务器。
MySQL 8.3 的默认字符集是 utf8mb4
。
要升级复制拓扑结构,请按照 第 3 章,升级 MySQL 中的说明,对每个 MySQL Server 实例执行升级过程,按照以下总体过程:
-
首先升级副本。 在每个副本实例上:
-
执行第 3.6 节“为升级做准备”中描述的初步检查和步骤。
-
关闭 MySQL 服务器。
-
升级 MySQL 服务器二进制文件或软件包。
-
重新启动 MySQL 服务器。
-
MySQL 服务器将自动执行整个 MySQL 升级过程,禁用二进制日志记录。
-
使用
START REPLICA
重新启动复制。
-
-
当所有副本都升级完成后,按照相同的步骤升级和重新启动源服务器,但不包括
START REPLICA
语句。如果您临时更改了基于行的日志记录或默认字符集,现在可以还原更改。
某些升级可能需要在从一个 MySQL 系列升级到下一个系列时删除和重新创建数据库对象。例如,排序规则的更改可能需要重新构建表索引。这些操作(如果需要),将在第 3.5 节“MySQL 8.3 中的变化”中详细描述。为了安全起见,应该单独在副本和源上执行这些操作,并禁用从源到副本的复制。为此,请使用以下过程:
-
停止所有副本,升级二进制文件或软件包。重新启动它们时,使用
--skip-replica-start
选项,以便它们不连接到源。执行任何需要重新创建数据库对象的表修复或重建操作,例如使用REPAIR TABLE
或ALTER TABLE
,或转储和重新加载表或触发器。 -
在源上禁用二进制日志。为此,不需要重新启动源,只需执行
SET sql_log_bin = OFF
语句。或者,停止源并使用--skip-log-bin
选项重新启动。如果您重新启动了源,也可能想要禁止客户端连接。例如,如果所有客户端都使用 TCP/IP 连接,启用skip_networking
系统变量时重新启动源。 -
在禁用二进制日志的情况下,执行任何需要重新创建数据库对象的表修复或重建操作。二进制日志必须在此步骤中禁用,以防止这些操作被记录并发送到副本。
-
在源上重新启用二进制日志。如果您之前将
sql_log_bin
设置为OFF
,现在执行SET sql_log_bin = ON
语句。如果您重新启动了源以禁用二进制日志,现在重新启动它,而不使用--skip-log-bin
选项,并且不启用skip_networking
系统变量,以便客户端和副本可以连接。 -
重新启动副本,这次不使用
--skip-replica-start
选项。