如果主集群复制过程失败,可以切换到辅助复制通道。以下过程描述了完成此操作所需的步骤。
获取最近的全局检查点 (GCP) 的时间。也就是说,您需要从副本集群上的表中确定最近的纪元
ndb_apply_status
,可以使用以下查询找到它:mysqlR'> SELECT @latest:=MAX(epoch) -> FROM mysql.ndb_apply_status;
在循环复制拓扑中,在每个主机上运行一个源和一个副本,当您使用时
ndb_log_apply_status=1
,NDB Cluster 纪元被写入副本的二进制日志中。这意味着该ndb_apply_status
表包含此主机上的副本以及充当此主机上运行的复制源服务器副本的任何其他主机的信息。在这种情况下,您需要确定此副本上的最新纪元,以排除来自此副本二进制日志中任何其他副本的任何纪元,这些副本未在 用于设置此副本
IGNORE_SERVER_IDS
的语句的选项中 列出。CHANGE MASTER TO
排除此类时期的原因是,除了那些具有副本自己的服务器 ID 的行之外,表中的行的服务器 ID 与用于准备此副本源的语句的列表中mysql.ndb_apply_status
的匹配 项也被认为来自本地服务器。您可以 从输出中检索此列表IGNORE_SERVER_IDS
CHANGE MASTER TO
Replicate_Ignore_Server_Ids
SHOW SLAVE STATUS
. 我们假设您已获得此列表并将其替换为ignore_server_ids
此处显示的查询,与之前版本的查询一样,将最大纪元选择到名为 的变量中@latest
:mysqlR'> SELECT @latest:=MAX(epoch) -> FROM mysql.ndb_apply_status -> WHERE server_id NOT IN (ignore_server_ids);
在某些情况下,在 前面的查询条件中 使用要包含的服务器 ID 列表可能更简单或更有效(或两者兼而有之) 。
server_id IN
server_id_list
WHERE
使用从步骤 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;
这些是自主复制通道发生故障后保存在源上的记录。我们在这里使用了一个用户变量来表示在步骤1中获得的值。当然,一个mysqld实例
@latest
不可能直接访问在另一个服务器实例上设置的用户变量。这些值必须手动或通过应用程序 “插入”到第二个查询。重要的您必须确保副本mysqld
--slave-skip-errors=ddl_exist_errors
在执行之前 已启动START SLAVE
。否则,复制可能会因重复的 DDL 错误而停止。现在可以通过在辅助副本服务器上运行以下查询来同步辅助通道:
mysqlR'> CHANGE MASTER TO -> MASTER_LOG_FILE='@file', -> MASTER_LOG_POS=@pos;
我们再次使用用户变量(在本例中 为
@file
和@pos
)来表示在步骤 2 中获得并在步骤 3 中应用的值;实际上,这些值必须手动插入或使用可以访问所涉及的两个服务器的应用程序插入。笔记@file
是一个字符串值,例如'/var/log/mysql/replication-source-bin.00001'
, 因此在 SQL 或应用程序代码中使用时必须用引号引起来。但是,不得引用所代表@pos
的值。尽管 MySQL 通常会尝试将字符串转换为数字,但这种情况是一个例外。您现在可以通过在辅助副本 mysqld上发出适当的语句来启动辅助通道上的复制:
mysqlR'> START SLAVE;
一旦辅助复制通道处于活动状态,您就可以调查主要故障和影响修复。执行此操作所需的精确操作取决于主通道失败的原因。
仅当主复制通道发生故障时才启动辅助复制通道。同时运行多个复制通道可能会导致在副本上创建不需要的重复记录。
如果故障仅限于单个服务器,理论上应该可以从复制S
到
R'
,或从
复制S'
到R
。