如果主群集复制过程发生故障,则可以切换到辅助复制信道。以下过程描述了完成此操作所需的步骤。
获取最近一次全局检查点(GCP)的时间。也就是说,你需要从
ndb_apply_status.
复制集群上的表,可以使用以下查询找到:mysqlr'>从mysql.ndb_apply_status中选择@latest:= max(epoch) - >;
在循环复制拓扑中,每个主机上运行一个源和一个副本,当您使用
ndb_log_apply_status = 1
, NDB集群时代写入副本的二进制日志。这意味着ndb_apply_status.
表包含此主机上的副本的信息,以及作为运行在此主机上的复制源服务器的副本的任何其他主机的信息。在这种情况下,您需要确定该副本上的最新epoch,以排除该副本二进制日志中未列出的任何其他副本中的epoch
Ignore_server_ids.
选项的将复制源更改为
|改变主
语句用于设置此副本。排除这类时代的原因是mysql.ndb_apply_status
表中的服务器id与Ignore_server_ids.
列表从将复制源更改为
|改变主
语句用于准备该副本的源也被认为是来自本地服务器,除了那些具有副本自己的服务器ID的服务器。您可以检索此列表为Replicate_Ignore_Server_Ids
的输出显示副本|从状态
.我们假设您已获得此列表并将其替换为Ignore_server_ids.
在此处所示的查询中,它类似于先前版本的查询,将最伟大的epoch选择为名为的变量@latest
:mysqlr'> SELECT @latest:=MAX(epoch) -> FROM mysql。ndb_apply_status.-> WHERE server_id NOT IN (Ignore_server_ids.);
在某些情况下,使用要包含和的服务器id列表可能更简单或更有效(或两者兼有)
server_id在
在server_id_list.
在哪里
查询条件。使用步骤1中查询得到的信息,从
ndb_binlog_index.
源群集上的表。可以使用以下查询从
ndb_binlog_index.
资料来源表:mysqlS'> SELECT -> @file:=SUBSTRING_INDEX(next_file, '/', -1), -> @pos:=next_position -> FROM mysql。ndb_binlog_index -> WHERE epoch >= @latest -> ORDER BY epoch ASC LIMIT 1;
这些是由于主复制通道失败以来保存在源上的记录。我们使用了一个用户变量
@latest
表示步骤1中获得的值。当然,这对一个人来说是不可能的mysqld实例可直接访问其他服务器实例上设置的用户变量。这些值必须是”插入”手动或由应用程序执行的第二个查询。重要的您必须确保复制mysqld开始了
- slave-skip-errors = ddl_exist_errors
在执行之前启动副本| slave
.否则,复制可能会由于重复的DDL错误而停止。现在可以通过在辅助复制服务器上运行以下查询来同步辅助通道:
mysqlr'-> MASTER_LOG_FILE='@file', -> MASTER_LOG_POS=@pos;
在MySQL 8.0.23及以后版本中,你也可以使用下面的语句:
mysqlr'>将Replication Source更改为 - > source_log_file ='@ file', - > source_log_pos = @ pos;
我们再次使用用户变量(在这种情况下
@文件
和@POS.
)表示步骤2中得到并应用于步骤3中的值;在实践中,必须手动插入这些值,或者使用可以访问这两个服务器的应用程序。请注意@文件
是一个字符串值,如“/ var / log / mysql / replication-source-bin.00001”
,因此在SQL或应用程序代码中使用时必须用引号括起来。表示的值@POS.
必须不被引用。虽然MySQL通常尝试将字符串转换为数字,但这种情况是一个例外。现在可以通过在从副本上发出适当的命令,在从通道上启动复制mysqld:
mysqlr'>开始奴隶;
在MySQL 8.0.22或更高版本中,您还可以使用以下语句:
mysqlr'>开始副本;
当从端复制区域通道处于活动状态时,可以调查主端复制区域通道的故障并进行修复。执行此操作所需的精确操作取决于主通道失败的原因。
只有当主复制区域通道故障时,才会启动从复制区域通道。同时运行多个复制通道可能会导致在副本上创建不必要的重复记录。
如果故障仅限于单个服务器,理论上应该可以从该服务器进行复制年代
来r'
,或从S'
来R
.