组复制旨在确保数据库服务始终可用,即使形成组的某些服务器由于计划维护或意外问题而当前无法参与其中。只要剩余成员占组的多数,它们就可以选举新的主节点并继续作为组运行。但是,如果复制组的每个成员都离开组,并且通过 STOP GROUP_REPLICATION
语句或系统关闭在每个成员上停止组复制,那么该组现在仅在理论上存在,作为成员上的配置。在这种情况下,要重新创建组,必须通过引导来启动它,就好像它是第一次启动一样。
第一次引导组和第二次或后续次引导组之间的区别在于,在后一种情况下,已关闭的组成员可能具有彼此不同的事务集,具体取决于它们停止或失败的顺序。如果成员具有其他组成员没有的事务,则该成员无法加入组。对于组复制,这包括已提交和应用的事务(位于 gtid_executed
GTID 集中)以及已认证但尚未应用的事务(位于 group_replication_applier
通道中)。事务提交的确切时间点取决于为组设置的事务一致性级别(请参见 第 20.5.3 节,“事务一致性保证”)。但是,组复制组成员从不删除已认证的事务,这是一个成员打算提交该事务的声明。
因此,必须从最新成员开始重新启动复制组,即执行和认证的事务最多的成员。具有较少事务的成员随后可以加入并通过分布式恢复弥补它们缺少的事务。不应假设组的最后一个已知主成员是组的最新成员,因为比主节点关闭时间更晚的成员可能具有更多事务。因此,您必须重新启动每个成员以检查事务,比较所有事务集,并识别最新成员。然后可以使用此成员引导组。
在每个成员关闭后,请按照此步骤安全地重新启动复制组。
对于每个组成员,依次,以任何顺序
将客户端连接到组成员。如果组复制尚未停止,请发出
STOP GROUP_REPLICATION
语句,并等待组复制停止。编辑 MySQL 服务器配置文件(通常在 Linux 和 Unix 系统上名为
my.cnf
,或在 Windows 系统上名为my.ini
),并设置系统变量group_replication_start_on_boot=OFF
。此设置可防止 MySQL 服务器启动时启动组复制,这是默认设置。如果您无法更改系统上的该设置,则可以只允许服务器尝试启动组复制,这将失败,因为该组已完全关闭且尚未引导。如果您采用这种方法,请不要在此时在任何服务器上设置
group_replication_bootstrap_group=ON
。启动 MySQL 服务器实例,并验证组复制尚未启动(或启动失败)。此时不要启动组复制。
从组成员收集以下信息
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";
收集完所有组成员的事务集后,请比较它们以找出哪个成员具有最大的总体事务集,包括已执行的事务(
gtid_executed
)和已认证的事务(在group_replication_applier
通道上)。您可以通过手动查看 GTID 来完成此操作,或者可以使用存储函数比较 GTID 集,如 第 19.1.3.8 节,“用于操作 GTID 的存储函数示例” 中所述。使用具有最大事务集的成员引导组,方法是将客户端连接到组成员并发出以下语句
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
设置存储在配置文件中,否则在服务器再次重新启动时,将设置另一个名称相同的组。要验证该组现在是否使用此创始成员存在,请在引导该组的成员上发出以下语句
mysql> SELECT * FROM performance_schema.replication_group_members;
通过在每个成员上发出
START GROUP_REPLICATION
语句,以任何顺序将其他每个成员重新添加到组中mysql> START GROUP_REPLICATION;
要验证每个成员是否已加入组,请在任何成员上发出以下语句
mysql> SELECT * FROM performance_schema.replication_group_members;
当成员重新加入组后,如果您编辑了它们的配置文件以设置
group_replication_start_on_boot=OFF
,则可以再次编辑它们以设置ON
(或删除系统变量,因为ON
是默认设置)。