Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

20.5.2 重启组

组复制旨在确保数据库服务连续可用,即使组中的某些服务器由于计划维护或意外问题无法参与组。只要剩余成员达到组的多数,他们可以选举新的主服务器并继续作为组运作。然而,如果组中的每个成员都离开组,并且在每个成员上停止组复制,或者系统关闭,那么组现在只存在于理论上,即成员上的配置。在那种情况下,为了重新创建组,必须像第一次启动一样引导它。

第一次引导组和第二次或后续引导组之间的区别在于,后一种情况下,组成员可能具有不同的交易集,取决于它们停止或失败的顺序。成员不能加入组,如果它具有其他组成员不存在的交易。对于组复制,这包括已经提交和应用的交易,这些交易在 gtid_executed GTID集中,以及已经认证但尚未应用的交易,这些交易在 group_replication_applier 通道中。交易的确切提交点取决于组的交易一致性级别(见 第 20.5.3 节,“交易一致性保证”)。然而,组复制组成员从不删除已经认证的交易,这是成员意图提交交易的声明。

因此,必须从最更新的成员开始重启复制组,即拥有最多交易的成员。然后,拥有较少交易的成员可以加入并通过分布式恢复赶上缺少的交易。不能假设最后一个已知的主成员是组中最更新的成员,因为一个晚于主成员关闭的成员可能拥有更多交易。因此,必须重启每个成员,以检查交易,比较所有交易集,并确定最更新的成员。然后,该成员可以用来引导组。

按照以下步骤安全地重启复制组,假设每个成员都关闭。

  1. 对于每个组成员,按任意顺序:

    1. 连接到组成员的客户端。如果组复制尚未停止,请发出 STOP GROUP_REPLICATION 语句,并等待组复制停止。

    2. 编辑 MySQL 服务器配置文件(通常在 Linux 和 Unix 系统上命名为 my.cnf,在 Windows 系统上命名为 my.ini),并将系统变量 group_replication_start_on_boot=OFF 设置为 OFF。这将防止组复制在 MySQL 服务器启动时启动,默认情况下。

      如果您无法在系统上更改该设置,可以允许服务器尝试启动组复制,这将失败,因为组已经完全关闭且尚未引导。如果您采取这种方法,请不要在任何服务器上设置 group_replication_bootstrap_group=ON

    3. 启动 MySQL 服务器实例,并验证组复制未启动(或启动失败)。不要在此阶段启动组复制。

    4. 从组成员中收集以下信息:

      • gtid_executed GTID 集的内容。您可以通过发出以下语句来获取:

        mysql> SELECT @@GLOBAL.GTID_EXECUTED
      • group_replication_applier 通道上的认证交易集。您可以通过发出以下语句来获取:

        mysql> SELECT received_transaction_set FROM \
                performance_schema.replication_connection_status WHERE \
                channel_name="group_replication_applier";
  2. 当您从所有组成员那里收集了事务集时,比较它们以找到哪个成员拥有最大的事务集,包括执行的事务(gtid_executed)和认证的事务(在 group_replication_applier 通道上)。您可以手动地通过查看 GTIDs 来做到这一点,或者使用存储函数来比较 GTID 集,如 第 19.1.3.8 节,“存储函数示例来操作 GTIDs” 中所述。

  3. 使用拥有最大的事务集的成员来引导组,通过连接客户端到组成员并发出以下语句:

    mysql> SET GLOBAL group_replication_bootstrap_group=ON;
    mysql> START GROUP_REPLICATION;
    mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

    重要的是不要在配置文件中存储设置 group_replication_bootstrap_group=ON,否则当服务器重新启动时,将设置第二个同名的组。

  4. 要验证组现在存在于该创始成员中,发出以下语句在引导它的成员上:

    mysql> SELECT * FROM performance_schema.replication_group_members;
  5. 将每个其他成员重新添加到组中,以任意顺序,通过在每个成员上发出 START GROUP_REPLICATION 语句:

    mysql> START GROUP_REPLICATION;
  6. 要验证每个成员是否加入组,发出以下语句在任何成员上:

    mysql> SELECT * FROM performance_schema.replication_group_members;
  7. 当成员重新加入组时,如果您编辑了它们的配置文件以设置 group_replication_start_on_boot=OFF,您可以再次编辑它们以设置 ON(或删除系统变量,因为 ON 是默认值)。