MySQL复制/复制注意事项和提示/正在升级复制设置

4.3升级复制设置

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

当您将一个源码从早期的MySQL发行系列升级到8.0时,您首先应该确保该源码的所有副本都使用相同的8.0。x版本。如果不是这样,您应该首先升级副本。要升级每个副本,请关闭它,将其升级到适当的8.0。X版本,重新启动,并重新启动复制。升级后副本创建的中继日志为8.0格式。

影响严格SQL模式下操作的更改(STRICT_TRANS_TABLESSTRICT_ALL_TABLES)可能会导致在升级后的副本上复制失败。如果使用基于语句的日志记录(binlog_format =声明),如果副本在源之前升级,源执行的语句在副本上成功,但可能在副本上失败,从而导致复制停止。要处理这个问题,请停止源上的所有新语句,并等待副本赶上进度,然后升级副本。或者,如果无法停止新语句,则在源(binlog_format =行),并等待所有副本都处理了到此更改点为止产生的所有二进制日志,然后升级副本。

默认字符集已从latin1utf8mb4在MySQL 8.0。在复制设置下,当从MySQL 5.7升级到8.0时,建议将默认字符集更改回升级前MySQL 5.7使用的字符集。升级完成后,可将默认字符集修改为utf8mb4.假设使用了前面的默认值,那么保留它们的一种方法是在my.cnf文件:

(mysqld) character_set_server = latin1 collation_server = latin1_swedish_ci中的一个

完成副本升级后,关闭源,将其升级到相同的8.0版本。X版本作为副本,并重新启动它。如果您临时将源更改为基于行的日志记录,则将其更改为基于语句的日志记录。8.0源能够读取在升级之前写入的旧二进制日志,并将它们发送到8.0副本。副本识别旧格式并正确处理它。升级后源端生成的二进制日志为“8.0”格式。这些也可以被8.0的副本识别。

换句话说,当升级到MySQL 8.0时,在您可以将源升级到8.0之前,副本必须是MySQL 8.0。注意,从8.0降级到旧版本并不是这么简单:必须确保任何8.0二进制日志或中继日志都已完全处理,以便在继续降级之前删除它。

当您从一个MySQL系列移动到下一个MySQL系列时,有些升级可能需要删除并重新创建数据库对象。例如,排序规则更改可能需要重新构建表索引。如有必要,详情载于MySQL 8.0的修改.最安全的做法是在副本和源上分别执行这些操作,并禁止将这些操作从源复制到副本。要实现这一点,请使用以下步骤:

  1. 停止所有副本并升级它们。重新启动它们——skip-slave-start选项,或从MySQL 8.0.24skip_slave_start系统变量,使它们不连接到源。执行重新创建数据库对象所需的任何表修复或重建操作,例如使用修理表ALTER TABLE,或转储和重新加载表或触发器。

  2. 在源上禁用二进制日志。要在不重新启动源的情况下完成此操作,请执行设置sql_log_bin = OFF声明。或者,停止源程序并使用——skip-log-bin选择。如果重新启动源,您可能还想禁止客户机连接。例如,如果所有客户端都使用TCP/IP连接,则启用skip_networking重新启动源时的系统变量。

  3. 在禁用二进制日志的情况下,执行重新创建数据库对象所需的任何表修复或重建操作。在此步骤中必须禁用二进制日志,以防止这些操作被记录下来并在以后发送到副本。

  4. 在源上重新启用二进制日志。如果你设置sql_log_bin早些时候,执行设置sql_log_bin = ON声明。如果重新启动源以禁用二进制日志,则重新启动它——skip-log-bin,且不启用skip_networking系统变量,以便客户机和副本可以连接。

  5. 重新启动副本,这次不使用——skip-slave-start选择或skip_slave_start系统变量。

如果您正在将现有的复制设置从不支持全局事务标识符的MySQL版本升级到支持全局事务标识符的版本,在确保设置满足基于gtid的复制的所有要求之前,您不应该在源或副本上启用gtid。看到第2.3.4节,“使用gtid设置复制”,其中包含有关将现有复制设置转换为使用基于gtid的复制的信息。

在MySQL 8.0.16之前,当服务器运行时启用全局事务标识符(gtid)时(gtid_mode =对),不要通过启用二进制日志mysql_upgrade(——write-binlog选项)。从MySQL 8.0.16开始,服务器执行整个MySQL升级过程,但是在升级过程中禁用二进制日志记录,所以没有问题。

当服务器上启用gtid时,不建议加载转储文件(gtid_mode =对),如果您的转储文件包括系统表。, mysqldump为使用非事务性MyISAM存储引擎的系统表发出DML指令,当启用gtid时,这种组合是不允许的。还要注意,将一个转储文件从一个启用了gtid的服务器加载到另一个启用了gtid的服务器中,会生成不同的事务标识符。