Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


20.5.2 重启组

Group Replication旨在确保数据库服务始终可用,即使一些组成该组的服务器当前无法参与其中,因为计划维护或未预期的问题。只要剩余成员是组中的多数,他们可以选举新的主服务器并继续作为一个组。但是,如果所有组成员离开组,并且在每个成员上使用STOP GROUP_REPLICATION语句或系统关机,组现在只存在理论中,因为成员的配置。在这种情况下,要重新创建组,它必须像第一次启动一样通过引导来启动。

首次启动组和第二次或后续启动组之间的差异在于,在后一种情况下,可能会出现成员之间的事务集不同的问题,这取决于它们被停止或失败的顺序。一个成员不能加入组,如果它拥有的事务不在其他组成员中。对于 Group Replication,这包括已经提交和应用的事务,它们在gtid_executed GTID 集合中,以及已经认证但还未应用的事务,它们在group_replication_applier 通道中。事务的提交点取决于组的交易一致性级别(见第20.5.3节,“交易一致性保证”)。然而,Group Replication 组成员从不删除已经认证的事务,这是成员意图提交事务的声明。

因此,复制组必须从最先进的成员开始重启,即拥有最多事务执行和认证的成员。然后,拥有少量事务的成员可以加入并通过分布式恢复来获取缺失的事务。这不是正确地假设最后知晓主成员是组中最先进的成员,因为可能会出现比主成员更晚关机的成员拥有更多事务。你必须重启每个成员,以检查事务、比较所有事务集,并确定最先进的成员。然后,可以使用这个成员来启动组。

按照以下步骤在每个成员关闭后安全地重启复制组。

  1. 对每个组成员依次进行操作,顺序无关紧要:

    1. 连接客户端到组成员。如果 Group Replication尚未停止,请执行STOP GROUP_REPLICATION语句,并等待 Group Replication 停止。

    2. 编辑 MySQL 服务器配置文件(通常在 Linux 和 Unix 系统中名为my.cnf,或在 Windows 系统中名为my.ini)并将系统变量group_replication_start_on_boot=OFF设置为 OFF。这将防止 Group Replication 在 MySQL 服务器启动时自动启动,这是默认行为。

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

    3. 启动 MySQL 服务器实例,并验证 Group Replication 没有被启动(或失败)。在这个阶段,不要启动 Group Replication。

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

      • GTID 集的内容gtid_executed。您可以通过执行以下语句获取该信息:

        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. 当您从所有组成员中收集了事务集后,比较它们以找到哪个成员拥有最大的事务集 overall,包括执行的事务(gtid_executed)和已认证的事务(在group_replication_applier渠道上)。您可以手动查看GTIDs,或者使用存储函数比较GTID集,如第19.1.3.8节,“Stored Function Examples to Manipulate 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. 验证该组现在已经存在于该 founder 成员中,请在成员上执行以下语句:

    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是默认值)。