故障转移账户对象¶
本主题介绍在不同 区域 用于灾难恢复的多个账户之间对复制的账户对象进行故障转移所需的步骤。
先决条件要求¶
为一组账户中的主要故障转移组启用复制。
在一个或多个账户中创建至少一个主要故障转移组的辅助故障转移组(即副本),并定期使用故障转移组中对象的最新更新刷新(即同步)该副本。
有关说明,请参阅 跨多个账户复制数据库和账户对象。
将目标账户提升为源账户¶
要将目标账户提升为源账户,必须登录到要提升为新源账户的目标账户,并执行 ALTER FAILOVER GROUP ...PRIMARY 命令来暂停。
将辅助故障转移组提升为主要故障转移组¶
备注
本节中的示例必须由具有 FAILOVER 权限的角色执行。
以下示例将当前 myorg
组织中的 myaccount2
提升为源账户。
登录到目标账户
myaccount2
。列出账户中的故障转移组:
SHOW FAILOVER GROUPS;
对要提升为主故障转移组的每个辅助故障转移组,执行以下语句:
ALTER FAILOVER GROUP myfg PRIMARY;
备注
在源区域发生部分中断期间,复制服务可能仍可用,并且可能仍刷新目标区域中的辅助故障转移组。
为确保数据完整性,如果正在进行刷新操作,Snowflake 会阻止故障转移。这意味着,如果复制操作正在刷新辅助故障转移组,则无法将其提升为主故障转移组。在这种情况下,ALTER FAILOVER GROUP ... PRIMARY 命令将返回错误。
解决因刷新操作正在进行而引起的故障转移语句失败的问题¶
如果正在对尝试提升的辅助故障转移组执行刷新操作,则故障转移语句将生成以下错误:
Replication group "<GROUP_NAME>" cannot currently be set as primary because it is being
refreshed. Either wait for the refresh to finish or cancel the refresh and try again.
要成功进行故障转移,必须完成以下步骤。
选择并完成以下选项之一:
重要
在 SECONDARY_DOWNLOADING_METADATA 或 SECONDARY_DOWNLOADING_DATA 阶段暂停刷新操作可能会导致目标账户的状态不一致。有关更多信息,请参阅 查看正在进行的刷新操作的当前阶段。
暂停以后的故障转移组刷新操作。如果刷新操作正在进行,则必须等待该操作完成,然后才能进行故障转移:
ALTER FAILOVER GROUP myfg SUSPEND;
暂停以后的刷新操作,并且 取消当前正在进行的计划刷新操作(如果有的话)。
如果正在进行的刷新操作是手动触发的,请参阅 取消未自动安排的正在进行的刷新操作。
ALTER FAILOVER GROUP myfg SUSPEND IMMEDIATE;
备注
在语句返回的时间与取消刷新操作完成的时间之间可能会有稍许延迟。
验证故障转移组
myfg
未进行任何刷新操作。以下查询不应返回任何结果:SELECT phase_name, start_time, job_uuid FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg')) WHERE phase_name <> 'COMPLETED' and phase_name <> 'CANCELED';
要查看故障转移组
myfg
的已取消刷新操作,可以执行以下语句:SELECT phase_name, start_time, job_uuid FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg')) WHERE phase_name = 'CANCELED';
现在,可以将辅助故障转移组
myfg
提升为主故障转移组:ALTER FAILOVER GROUP myfg PRIMARY;
恢复目标账户中的计划复制¶
故障转移时,所有辅助故障转移组上的计划刷新都会暂停。ALTER FAILOVER GROUP ...RESUME 必须在具有辅助故障转移组的每个 目标账户 中执行,以恢复自动刷新。
ALTER FAILOVER GROUP myfg RESUME;
查看正在进行的刷新操作的当前阶段¶
在刷新操作的大部分阶段,都可以安全地取消刷新操作。不过,在 SECONDARY_DOWNLOADING_METADATA 或 SECONDARY_DOWNLOADING_DATA 阶段取消刷新操作可能会导致目标账户的状态不一致。 如果刷新操作已启动其中一个阶段,则无论源账户是否可用,都会继续完成该阶段。在进行故障切换之前,允许该阶段完成,可确保副本处于一致的状态。在副本处于一致状态后,可以恢复或重放引入和转换管道,将副本更新为当前状态。
要查看故障转移组正在进行的刷新操作的当前阶段,请使用 Information Schema REPLICATION_GROUP_REFRESH_PROGRESS、REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB 表函数。
例如,要查看故障转移组 myfg
正在进行的刷新操作的当前阶段,请执行以下语句:
SELECT phase_name, start_time, end_time
FROM TABLE(
INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_PROGRESS('myfg')
);
有关刷新操作阶段的列表,请参阅该函数的 使用说明。
取消未自动安排的正在进行的刷新操作¶
要取消并非由复制计划自动触发的正在进行的刷新操作,必须使用 SYSTEM$CANCEL_QUERY 函数:
使用以下选项之一查找用于运行刷新操作的查询 ID 或 JOB_UUID:
查找所有正在运行的刷新操作的查询 IDs:
SELECT query_id, query_text FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) WHERE query_type = 'REFRESH REPLICATION GROUP' AND execution_status = 'RUNNING' ORDER BY start_time;
使用 QUERY_TEXT 列从列表中确定用于故障转移组刷新操作的 QUERY_ID。
查找特定故障转移组
myfg
正在进行的刷新操作的 JOB_UUID:SELECT phase_name, start_time, job_uuid FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg')) WHERE phase_name <> 'COMPLETED' and phase_name <> 'CANCELED';
使用 SYSTEM$CANCEL_QUERY 函数以及 QUERY_ID 或 JOB_UUID 取消刷新操作:
SELECT SYSTEM$CANCEL_QUERY('<QUERY_ID | JOB_UUID>');
返回以下输出结果:
query [<QUERY_ID>] terminated.
取消正在进行的刷新操作后,继续执行 后续步骤。
在新提升的源账户中重新打开 Snowpipe Streaming 的活动通道¶
主数据库中由 Snowpipe Streaming 填充的表会复制 到辅助数据库。故障转移后,为表重新打开活动的 Snowpipe Streaming 通道,并为通道重新插入任何缺失的数据行:
通过调用 openChannel (https://javadoc.io/doc/net.snowflake/snowflake-ingest-sdk/latest/net/snowflake/ingest/streaming/SnowflakeStreamingIngestClient.html) API 可重新打开表的活动通道。
提取偏移令牌:
调用 getLatestCommittedOffsetToken (https://javadoc.io/doc/net.snowflake/snowflake-ingest-sdk/latest/net/snowflake/ingest/streaming/SnowflakeStreamingIngestChannel.html#getLatestCommittedOffsetToken()) API 或
执行 SHOW CHANNELS 命令检索表中活动通道的列表。
从提取的偏移令牌中为通道重新插入数据行。
Snowpipe Streaming 和 Kafka Connector¶
如果使用 Kafka Connector 和 Snowpipe Streaming,请在故障转移后按照以下步骤操作:
更新 Kafka Connector 配置,以指向新提升的源账户。
执行 SHOW CHANNELS 命令,检索活动通道列表和偏移令牌。每个通道都属于 Kafka 主题中的一个分区。
为每个分区(通道)手动重置 Kafka 主题中的偏移。
重新启动 Kafka Connector。
有关更多信息,请参阅: