16.4.3 升级复制设置

升级参与复制设置的服务器时,升级过程取决于当前服务器版本和要升级到的版本。本节提供有关升级如何影响复制的信息。有关升级 MySQL 的一般信息,请参见第 2.11 节“升级 MySQL”

从较早的 MySQL 版本系列将源升级到 5.7 时,首先应确保该源的所有副本都使用相同的 5.7.x 版本。如果不是这种情况,则应首先升级副本。要升级每个副本,请关闭它,将其升级到适当的 5.7.x 版本,重新启动它,然后重新启动复制。副本在升级后创建的中继日志为 5.7 格式。

影响严格 SQL 模式(STRICT_TRANS_TABLESSTRICT_ALL_TABLES)下操作的更改可能会导致更新副本上的复制失败。例如,从 MySQL 5.7.2 开始,服务器在严格模式下限制为临时数据类型插入DEFAULT值 0.如果使用基于语句的日志记录(binlog_format=STATEMENT),如果副本在源之前进行了升级,则未升级的源将执行无错误的语句,该错误可能导致副本失败,并且复制将停止。要解决此问题,请停止源上的所有新语句,然后 await 副本追上来。然后升级副本。或者,如果您不能停止新语句,则暂时更改源(binlog_format=ROW)上的基于行的日志记录,然后 await 直到所有副本处理了此更改之前产生的所有二进制日志。然后升级副本。

升级副本后,关闭源,将其升级到与副本相同的 5.7.x 版本,然后重新启动。如果您已将源临时更改为基于行的日志记录,请将其更改回基于语句的日志记录。 5.7 源能够读取升级之前编写的旧二进制日志,并将其发送到 5.7 复制副本。副本识别旧格式并正确处理。源在升级后创建的二进制日志为 5.7 格式。 5.7 副本也可以识别这些内容。

换句话说,升级到 MySQL 5.7 时,副本必须是 MySQL 5.7,然后才能将源升级到 5.7. 请注意,从 5.7 降级到较旧的版本并不是那么简单:您必须确保已完全处理任何 5.7 二进制日志或中继日志,以便可以在 continue 降级之前将其删除。

从一个 MySQL 系列迁移到另一个 MySQL 系列时,某些升级可能需要删除并重新创建数据库对象。例如,排序规则更改可能需要重建 table 索引。如有必要,此类操作将在第 2.11.3 节“ MySQL 5.7 中的更改”处详细介绍。最安全的做法是分别在副本和源上执行这些操作,并禁用这些操作从源到副本的复制。为此,请使用以下过程:

  • 停止所有副本并升级它们。使用--skip-slave-start选项重新启动它们,以使它们不连接到源。执行重新创建数据库对象所需的任何 table 修复或重建操作,例如使用REPAIR TABLEALTER TABLE或转储和重新加载 table 或触发器。

  • 在源上禁用二进制日志。为此,无需重新启动源,请执行SET sql_log_bin = OFF语句。或者,停止源并重新启动而不使用--log-bin选项。如果重新启动源,则可能还需要禁止 Client 端连接。例如,如果所有 Client 端都使用 TCP/IP 连接,则在重新启动源时启用skip_networking系统变量。

  • 禁用二进制日志后,执行重新创建数据库对象所需的任何 table 修复或重建操作。在此步骤中,必须禁用二进制日志,以防止以后记录这些操作并将其发送给副本。

  • 重新启用源上的二进制日志。如果您之前将sql_log_bin设置为OFF,请执行SET sql_log_bin = ON语句。如果重新启动源以禁用二进制日志,请使用--log-bin重新启动它,而不启用skip_networking系统变量,以便 Client 端和副本可以连接。

  • 重新启动副本,这次没有--skip-slave-start选项。

如果要将现有复制设置从不支持全局事务标识符的 MySQL 版本升级到支持全局事务标识符的版本,则在确保设置满足 GTID 的所有要求之前,不应在源或副本上启用 GTID。基于的复制。例如,必须存在 MySQL 5.6 中添加的server_uuid,GTID 才能正常运行。请参阅第 16.1.3.4 节,“使用 GTID 设置复制”,其中包含有关将现有复制设置转换为使用基于 GTID 的复制的信息。

当服务器在启用全局事务标识符(GTID)的情况下(gtid_mode=ON)运行时,请勿通过mysql_upgrade启用二进制日志记录。

如果转储文件包含系统 table,则不建议在服务器(gtid_mode=ON)上启用 GTID 时加载转储文件。 mysqldump为使用非事务 MyISAM 存储引擎的系统 table 发出 DML 指令,并且在启用 GTID 时不允许使用此组合。还应注意,将一个启用了 GTID 的服务器中的转储文件加载到另一个启用了 GTID 的服务器中,会导致生成不同的事务标识符。