跨多个账户复制数据库和账户对象¶
本主题介绍了在同一组织中跨 Snowflake 账户复制账户对象和数据并保持对象和数据同步所需的步骤。账户复制可以在不同 区域 Snowflake 账户之间并跨越 云平台 进行。
备注
当您将账户升级到 Business Critical Edition(或更高版本)时,故障转移功能可能需要最多 12 小时才能可用。
本主题内容:
对复制和故障转移/故障回复的区域支持¶
客户可以对跨区域组内的所有区域进行复制。要在属于不同 区域组 的区域之间进行复制(例如,从 Snowflake 商业区到 Snowflake 政府区域),请联系 Snowflake 支持部门 (https://community.snowflake.com/s/article/How-To-Submit-a-Support-Case-in-Snowflake-Lodge) 以启用访问权限。
从 Database Replication 转换为基于组的复制¶
已启用使用 ALTER DATABASE 进行复制的数据库必须禁用复制之 前 才能将它们添加到复制组或故障转移组。
备注
使用 ACCOUNTADMIN 角色执行此部分中的 SQL 语句。
第 1 步:禁用已启用复制数据库的复制¶
执行 SYSTEM$DISABLE_DATABASE_REPLICATION 函数以禁用主数据库以及链接到它的任何辅助数据库的复制,以便将其添加到复制组或故障转移组。
在主数据库的源账户中执行以下 SQL 语句:
SELECT SYSTEM$DISABLE_DATABASE_REPLICATION('mydb');
第 2 步:将数据库添加到主故障转移组并创建辅助故障转移组¶
成功禁用数据库复制后,您可以将主数据库添加到源账户中的故障转移组。
然后在目标账户中创建辅助故障转移组。在目标账户中刷新辅助故障转移组时,之前的辅助数据库将自动添加为辅助故障转移组的成员,并使用主数据库中的更改进行刷新。
有关创建主要和辅助故障转移组的更多详细信息,请参阅 工作流程。
备注
您将以前复制的数据库添加到复制或故障转移组时,Snowflake执行以下操作:不会 重新复制已为该数据库复制的数据。刷新组时,仅复制自上次刷新以来的更改。
工作流程¶
下列 SQL 语句演示了启用账户和数据库对象复制以及刷新对象的工作流程。下面详细讨论每个步骤。
备注
以下示例要求为源账户和目标账户启用复制。有关详细信息,请参阅 先决条件:为组织中的账户启用复制。
示例¶
执行以下首选的 Snowflake 客户端中的 SQL 语句,以便启用账户和数据库对象复制和故障转移并刷新对象。
在源账户上执行¶
创建角色并授予其 CREATE FAILOVER GROUP 权限。此步骤是 可选的:
USE ROLE ACCOUNTADMIN; CREATE ROLE myrole; GRANT CREATE FAILOVER GROUP ON ACCOUNT TO ROLE myrole;
在源账户中创建故障转移组并启用到特定目标账户的复制。
备注
如果要向复制组或故障转移组添加数据库,而这些数据库先前已使用 ALTER DATABASE 启用了数据库复制制和故障转移,那么在将它们添加到组之前,请遵循 从 Database Replication 转换为基于组的复制 说明(本主题内容)。
要将数据库添加到故障转移组,活动角色必须具有 MONITOR 数据库的权限。有关数据库权限的详细信息,请参阅 数据库权限 (在单独的主题中)。
USE ROLE myrole; CREATE FAILOVER GROUP myfg OBJECT_TYPES = USERS, ROLES, WAREHOUSES, RESOURCE MONITORS, DATABASES ALLOWED_DATABASES = db1, db2 ALLOWED_ACCOUNTS = myorg.myaccount2, myorg.myaccount3 REPLICATION_SCHEDULE = '10 MINUTE';
在目标账户上执行¶
在目标账户中创建角色并授予其 CREATE FAILOVER GROUP 权限。此步骤是 可选的:
USE ROLE ACCOUNTADMIN; CREATE ROLE myrole; GRANT CREATE FAILOVER GROUP ON ACCOUNT TO ROLE myrole;
在目标账户中创建故障转移组作为源账户中故障转移组的副本。
备注
如果目标账户中存在源账户中不存在的账户对象(例如用户或角色),在创建辅助组之前,请参阅 用户和角色的初始复制。
USE ROLE myrole; CREATE FAILOVER GROUP myfg AS REPLICA OF myorg.myaccount1.myfg;
手动刷新辅助故障转移组。这是一个*可选的*步骤。如果使用复制创建主故障转移组,则在创建辅助故障转移组时,系统会自动执行辅助故障转移组的初始刷新。
创建一个具有故障转移组 REPLICATE 权限的角色。此步骤是 可选的。
使用具有故障转移组 OWNERSHIP 权限的角色在目标账户中执行:
GRANT REPLICATE ON FAILOVER GROUP myfg TO ROLE my_replication_role;
使用具有 REPLICATE 权限的角色执行刷新语句:
USE ROLE my_replication_role; ALTER FAILOVER GROUP myfg REFRESH;
创建一个具有故障转移组 FAILOVER 权限的角色。此步骤是 可选的。
使用具有故障转移组 OWNERSHIP 权限的角色在目标账户中执行:
GRANT FAILOVER ON FAILOVER GROUP myfg TO ROLE my_failover_role;;
复制账户对象和数据库¶
本部分中的说明解释了如何准备账户进行复制、将特定对象从源账户复制到目标账户,以及同步目标账户中的对象。
先决条件:为组织中的账户启用复制¶
组织管理员(ORGADMIN 角色)必须为源账户和目标账户启用复制。
要启用账户复制,具有 ORGADMIN 角色的用户可使用 SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER 函数将 ENABLE_ACCOUNT_DATABASE_REPLICATION
参数设置为 true
。请注意,一个组织中的多个账户可以通过同一 ORGADMIN 账户进行复制。
登录 ORGADMIN 账户来为组织中的每个源账户和目标账户启用复制。
USE ROLE ORGADMIN;
-- View the list of the accounts in your organization
-- Note the organization name and account name for each account for which you are enabling replication
SHOW ACCOUNTS;
-- Enable replication by executing this statement for each source and target account in your organization
SELECT SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER('<organization_name>.<account_name>', 'ENABLE_ACCOUNT_DATABASE_REPLICATION', 'true');
虽然 SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER 函数支持传统的 账户定位器 定位符,但当组织拥有多个共享相同定位器(位于不同区域)的账户时,它会导致意外结果。
第 1 步:在源账户中创建一个具有 CREATE FAILOVER GROUP 权限的角色 – 可选¶
创建角色并授予其 CREATE FAILOVER GROUP 权限。此步骤是可选的。如已创建此角色,请跳转至 第 2 步:在源账户中创建主故障转移组。
USE ROLE ACCOUNTADMIN;
CREATE ROLE myrole;
GRANT CREATE FAILOVER GROUP ON ACCOUNT
TO ROLE myrole;
第 2 步:在源账户中创建主故障转移组¶
创建一个主故障转移组,并启用从当前(源)账户到同一组织中一个或多个目标账户的特定对象的复制和故障转移。
查看已启用复制的所有账户¶
要检索组织中已启用复制的账户列表,请使用 SHOW REPLICATION ACCOUNTS。
使用 ACCOUNTADMIN 角色执行以下 SQL 语句:
SHOW REPLICATION ACCOUNTS;
返回:
+------------------+-------------------------------+--------------+-----------------+-----------------+-------------------+--------------+
| snowflake_region | created_on | account_name | account_locator | comment | organization_name | is_org_admin |
+------------------+-------------------------------+--------------+-----------------+-----------------+-------------------+--------------+
| AWS_US_WEST_2 | 2020-07-15 21:59:25.455 -0800 | myaccount1 | myacctlocator1 | | myorg | true |
+------------------+-------------------------------+--------------+-----------------+-----------------+-------------------+--------------+
| AWS_US_EAST_1 | 2020-07-23 14:12:23.573 -0800 | myaccount2 | myacctlocator2 | | myorg | false |
+------------------+-------------------------------+--------------+-----------------+-----------------+-------------------+--------------+
| AWS_US_EAST_2 | 2020-07-25 19:25:04.412 -0800 | myaccount3 | myacctlocator3 | | myorg | false |
+------------------+-------------------------------+--------------+-----------------+-----------------+-------------------+--------------+
查看 区域 IDs 的完整列表。
查看故障转移组和复制组成员身份¶
账户、数据库和共享对象对 团体成员身份有约束。创建新组或向现有组添加对象之前,您可以查看现有故障转移组的列表以及每个组中的对象。
备注
只有账户管理员(具有 ACCOUNTADMIN 角色的用户)或组所有者(具有组 OWNERSHIP 权限的角色)可以执行本部分中的 SQL 语句。
查看链接到当前账户的所有故障转移组以及每个组中的对象类型:
SHOW FAILOVER GROUPS;
查看故障转移组 myfg
中的所有数据库:
SHOW DATABASES IN FAILOVER GROUP myfg;
查看故障转移组 myfg
中的所有共享:
SHOW SHARES IN FAILOVER GROUP myfg;
启用从源账户到目标账户的复制¶
您可以使用 Snowsight 或者 SQL 创建复制组或故障转移组。
备注
如果要向复制组或故障转移组添加数据库,而这些数据库先前已使用 ALTER DATABASE 启用了数据库复制,那么在将它们添加到组之前,请遵循 从 Database Replication 转换为基于组的复制 说明(本主题内容)。
使用 Snowsight 创建复制组或故障转移组¶
备注
只有账户管理员才能使用 Snowsight 创建复制组或故障转移组(请参阅 使用 Snowsight 进行复制配置的限制)。
您必须以具有 ACCOUNTADMIN 角色的用户身份登录到目标账户。如果没有,系统将提示您登录。
源账户和目标账户都必须使用相同的连接类型(公共互联网)。否则,登录目标账户将失败。
完成以下步骤来创建新的复制组或故障转移组:
登录到 Snowsight 并导航至 Admin » Accounts。
依次选择 Replication、Groups。
选择 + Add Group。
依次选择 Target Account、Next。
在 Group Name 框中,输入满足以下要求的组名称:
必须以字母字符开头,且不能包含空格或特殊字符,除非标识符字符串被双引号包围(例如“My object”)。放在双引号内的标识符也区分大小写。
有关更多信息,请参阅 标识符要求。
在一个账户中,故障转移组和复制组的名称必须是唯一的。
选择 Select Objects 将共享和账户对象添加到您的组中。
备注
账户对象只能添加到一个复制组或故障转移组。如果您的账户中已存在具有任何账户对象的复制或故障转移组,则无法选择这些对象。
选择 Select Databases 将数据库对象添加到您的组中。
选择 Replication Frequency。
如果账户是 Business Critical Edition 版本或更高版本,则默认情况下系统会创建一个故障转移组。您也可以选择创建复制组。要创建复制组,请选择 Advanced Options,然后取消选择 Enable Failover。
选择 Start Replication 创建复制组。
如果创建复制组不成功,请参阅 使用 Snowsight 解决创建和编辑复制组方面的问题 了解常见错误以及解决方法。
使用 SQL 创建故障转移组¶
在源账户中创建指定账户和数据库对象的故障转移组,并启用复制和故障转移到目标账户列表。有关语法的信息,请参阅 CREATE FAILOVER GROUP。
例如,启用用户、角色、仓库、资源监视器和数据库 db1
和 db2
的从源账户复制到同一组织中的 myaccount2
账户。将复制计划设置为每 10 分钟自动刷新 myaccount2
。
在源账户上执行以下语句:
USE ROLE myrole;
CREATE FAILOVER GROUP myfg
OBJECT_TYPES = USERS, ROLES, WAREHOUSES, RESOURCE MONITORS, DATABASES, INTEGRATIONS, NETWORK POLICIES
ALLOWED_DATABASES = db1, db2
ALLOWED_INTEGRATION_TYPES = API INTEGRATIONS
ALLOWED_ACCOUNTS = myorg.myaccount2
REPLICATION_SCHEDULE = '10 MINUTE';
第 3 步:在目标账户中创建一个具有 CREATE FAILOVER GROUP 权限的角色 – 可选¶
在目标账户中创建角色并授予其 CREATE FAILOVER GROUP 权限。此步骤是可选的。如已创建此角色,请跳转至 第 4 步:在目标账户中创建辅助故障转移组。
USE ROLE ACCOUNTADMIN;
CREATE ROLE myrole;
GRANT CREATE FAILOVER GROUP ON ACCOUNT
TO ROLE myrole;
第 4 步:在目标账户中创建辅助故障转移组¶
备注
如果目标账户中存在源账户中不存在的账户对象(例如用户或角色),在创建辅助组之前,请参阅 用户和角色的初始复制。
在目标账户中创建辅助故障转移组作为源账户中主故障转移组的副本。
执行 CREATE FAILOVER GROUP ...AS REPLICA OF 语句,并且对于已在 第 2 步:在源账户中创建主故障转移组 (本主题内容中)中启用复制的每个目标账户,都要执行此语句。
在每个目标账户中执行以下语句:
USE ROLE myrole;
CREATE FAILOVER GROUP myfg
AS REPLICA OF myorg.myaccount1.myfg;
第 5 步:手动刷新目标账户中的辅助故障转移组 – 可选¶
要手动刷新目标账户中的对象,请执行 ALTER FAILOVER GROUP ...REFRESH 命令。
我们建议的最佳实践是使用 CREATE FAILOVER GROUP 或 ALTER FAILOVER GROUP 设置 REPLICATION_SCHEDULE 参数来计划辅助刷新。
备注
如果目标账户中调用该函数的用户已在源账户中被删除,则刷新操作会失败。
为角色授予故障转移组的 REPLICATE 权限 – 可选¶
您必须使用具有故障转移组的 REPLICATE 权限的角色,才能执行刷新目标账户中的辅助复制或故障转移组的命令。REPLICATE 权限当前 无法 复制,且必须在源账户和目标账户中的故障转移(或复制)组上授予。
使用具有组 OWNERSHIP 权限的角色从源账户执行此语句:
GRANT REPLICATE ON FAILOVER GROUP myfg TO ROLE my_replication_role;使用具有组 OWNERSHIP 权限的角色从目标账户执行此语句:
GRANT REPLICATE ON FAILOVER GROUP myfg TO ROLE my_replication_role;
手动刷新辅助故障转移组¶
例如,要刷新故障转移组 myfg
中的对象,请从目标账户执行以下语句:
USE ROLE my_replication_role; ALTER FAILOVER GROUP myfg REFRESH;
第 6 步:为角色授予故障转移组的 FAILOVER 权限 – 可选¶
您必须使用具有故障转移组的 FAILOVER 权限 的角色,才能执行对目标账户中的辅助故障转移组进行故障转移的命令。FAILOVER 权限当前 无法 复制,且必须在每个源账户和目标账户中授予。
有关更多信息,请参阅 角色和授权的复制。
例如,要向角色 my_failover_role
授予故障转移组 my_fg
的 FAILOVER 权限,请使用具有该组 OWNERSHIP 权限的角色,在 目标账户 中执行以下语句:
GRANT FAILOVER ON FAILOVER GROUP myfg TO ROLE my_failover_role;
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
将全局 IDs 应用于目标账户中通过脚本创建的对象¶
如果您通过复制 以外 的任何方式(例如使用脚本)在目标账户中创建了账户对象,例如用户和角色,那么默认情况下,这些用户和角色没有全局标识符。刷新操作使用全局标识符将这些对象同步到源账户中的相同对象。
大多数情况下,当从源账户刷新目标账户时,刷新操作会从目标账户中 删除 属于以下类型的所有账户对象:OBJECT_TYPES
列表中没有全局标识符的类型。但是,将用户和角色复制到目标账户的初始操作可能会导致首次刷新操作失败。有关此行为的详细信息,请参阅 用户和角色的初始复制。
使用 SYSTEM$LINK_ACCOUNT_OBJECTS_BY_NAME() 应用全局 IDs¶
通过链接源账户和目标账户中具有相同名称的匹配对象,可以防止某些对象类型丢失。借助 SYSTEM$LINK_ACCOUNT_OBJECTS_BY_NAME 函数,可将全局标识符添加到目标账户中的账户对象。
备注
全局标识符只添加到包含在复制组或故障转移组中的账户对象中,适用于以下对象类型:
RESOURCE_MONITOR
ROLE
USER
WAREHOUSE
将全局标识符应用于故障转移组 myfg
的 object_types
列表中的目标账户中的账户对象类型:
使用 ACCOUNTADMIN 角色执行以下 SQL 语句:
SELECT SYSTEM$LINK_ACCOUNT_OBJECTS_BY_NAME('myfg');
用户和角色的初始复制¶
USERS 和 ROLES 对象类型的初始刷新操作的行为可能会有所不同,具体取决于目标账户中是否存在同名的匹配对象。
备注
本部分中描述的行为仅在 首次 将这些对象类型复制到目标账户时适用。
以下场景描述了如何复制 USERS。该方法同样适用于复制 ROLES。
如果目标账户中存在与源账户中用户同名的现有用户,则初始刷新操作将失败,并描述您必须继续的两个选项:
强制刷新操作并允许删除目标账户中的任何现有用户。源账户中的用户将被复制到目标账户中。
要强制刷新组,请使用刷新命令的 FORCE 参数。例如,要强制刷新故障转移组,请执行以下命令:
ALTER FAILOVER GROUP <fg_name> REFRESH FORCE;
按名称链接账户对象。借助 SYSTEM$LINK_ACCOUNT_OBJECTS_BY_NAME 函数,可链接目标账户和源账户中具有相同名称的用户。系统不会删除目标账户中已链接的用户。
要按名称链接账户对象,请执行以下命令:
SELECT SYSTEM$LINK_ACCOUNT_OBJECTS_BY_NAME('<rg_name>');
备注
如果目标账户中的任何用户在源账户中*没有*与之匹配的同名用户,就会被系统 删除。
如果目标账户中的用户在源账户中 没有 与之匹配的同名用户,则目标账户中的初始刷新操作会删除所有用户。这可能会导致以下数据和元数据丢失:
如果复制组和故障转移组的 OBJECT_TYPES 列表中包含 USERS,则会导致以下数据和元数据丢失:
工作表丢失。
查询历史记录丢失。
如果 OBJECT_TYPES 列表中包含 USERS,但不包含 ROLES,则会导致以下数据和元数据丢失:
向用户授予的权限丢失。
如果 OBJECT_TYPES 列表中包含 ROLES,则会导致以下数据和元数据丢失:
向共享对象授予的权限丢失。
为避免删除目标账户中的用户或角色,请执行以下操作:
在源账户中,手动重新创建初始复制前*仅*存在于目标账户中的任何用户或角色。
在目标账户中,使用 SYSTEM$LINK_ACCOUNT_OBJECTS_BY_NAME 函数链接两个账户中具有相同名称的匹配对象。
配置辅助存储集成的云存储访问权限¶
如果启用了存储集成复制,则必须在存储集成复制到目标账户后采取其他步骤。复制的集成有自己的 Identity and Access Management (IAM) 实体,该实体与主集成的身份和 IAM 实体不同。因此,您必须更新云提供商权限,以授予复制集成对云存储的访问权限。
此信任关系只需在目标账户上配置一次。
该过程类似于在源账户中授予访问权限。有关更多信息,请参阅以下页面:
配置目录表在辅助暂存区的自动刷新¶
如果使用目录表复制外部暂存区,并且已为源目录表配置自动刷新,则必须采取步骤为辅助目录表配置 自动刷新。
该过程类似于在源账户中设置自动刷新。有关更多信息,请参阅以下内容:
Amazon S3:配置过程取决于设置事件通知的方式。
如果您将 Amazon S3 事件通知与 Amazon Simple Queue Service (SQS) 一起使用,请按照 第 2 步:配置事件通知 中的说明进行操作。您也可以从 SQS 迁移到 SNS。有关更多信息,请参阅 迁移到 Amazon Simple Notification Service (SNS)。
如果您使用的是 Amazon Simple Notification Service (SNS),请参阅 将 Snowflake SQS 队列订阅至 SNS 主题中。
Google Cloud Storage:在目标账户中为您的 Pub/Sub 主题创建新的订阅,并创建新的通知集成。然后,授予 Snowflake 对 Pub/Sub 订阅的访问权限。有关说明,请参阅 使用 GCS Pub/Sub 配置自动化。
Azure Blob 存储:创建新的事件网格订阅和存储队列。然后,在目标账户中创建新的通知集成,并授予 Snowflake 对存储队列的访问权限。有关说明,请参阅 使用 Azure 事件网格配置自动化。
重要
在目标账户中完成上述配置步骤后,您应当对目录表执行完全刷新,以确保没有遗漏任何通知。
对于 Google Cloud Storage 和 Azure Blob 存储,每个目标账户中的通知集成名称必须与源账户中的通知集成名称一致。
配置辅助自动引入管道的通知¶
在故障转移之前,您必须采取额外的步骤来配置辅助自动引入管道的云通知。本节介绍了需要此额外配置的原因,以及如何为每个受支持的云提供商完成此配置。
Amazon S3¶
配置过程取决于设置事件通知的方式。例如,假设您有一个依赖于 Amazon Simple Notification Service (SNS) 主题的自动引入管道,用于发布有关 Snowflake 暂存区位置的消息。
当您将管道复制到目标账户时,Snowflake 会自动创建一个新的 Amazon Simple Queue Service (SQS) 队列。您必须为目标账户的 SQS 队列订阅 SNS 主题,才能获得有关暂存区位置的通知。
如果您将 Amazon S3 事件通知与 Amazon Simple Queue Service (SQS),请按照 第 4 步:配置事件通知 中的说明进行操作。
重要
为了确保管道没有遗漏任何通知,您应该在切换到新 SQS 队列后刷新管道。
您也可以从 SQS 迁移到 SNS。有关更多信息,请参阅 迁移到 Amazon Simple Notification Service (SNS)。
如果您使用的是 Amazon Simple Notification Service (SNS),请参阅 将 Snowflake SQS 队列订阅至 SNS 主题中。
如果您使用的是 Amazon EventBridge,请参阅 选项 3:设置 Amazon EventBridge 以自动执行 Snowpipe。
Microsoft Azure Blob 存储¶
在 Microsoft Azure Blob 存储的暂存区上自动加载数据的管道需要事件网格订阅、存储队列,以及绑定到存储队列的通知集成。目标账户中的辅助管道需要单独的事件网格、存储队列以及绑定到存储队列的通知集成。源账户和目标账户中的事件网格必须配置为同一 Azure 存储源的端点。
有关配置详细信息,请参阅下图:
创建新的事件网格订阅和存储队列。然后,在目标账户中创建新的通知集成,并授予 Snowflake 对存储队列的访问权限。有关说明,请参阅 使用 Azure 事件网格配置自动化。
重要
每个目标账户中通知集成的名称 必须 与源账户中通知集成的名称匹配。
Google Cloud Storage 的外部暂存区¶
自动加载来自位于 Google Cloud Storage 中文件的管道需要 Google Pub/Sub 订阅以及引用该订阅的通知集成。目标账户中的每个复制管道也需要 Google Pub/Sub 订阅,以及引用该订阅的通知集成。每个源账户和目标账户中的 Pub/Sub 订阅必须订阅接收来自 Google Cloud Storage 源通知的相同 Pub/Sub 主题。
有关配置详细信息,请参阅下图:
- 在目标账户中,创建 Pub/Sub 主题的新订阅和新的通知集成。
然后,授予 Snowflake 对 Pub/Sub 订阅的访问权限。有关说明,请参阅 使用 GCS Pub/Sub 配置自动化。
重要
每个目标账户中通知集成的名称 必须 与源账户中通知集成的名称匹配。
更新 API 集成的远程服务¶
如果您已启用 API 集成复制,那么在将 API 集成复制到目标账户后,需要采取额外的步骤。复制的集成有自己的 Identity and Access Management (IAM) 实体,该实体与主集成的身份和 IAM 实体不同。因此,您必须更新远程服务上的权限,以授予对复制函数的访问权限。该过程类似于为主要账户上的函数授予访问权限。有关更多信息,请参阅以下链接:
Amazon Web Services 在 Snowflake 和新 IAM 角色之间建立信任关系。
Google Cloud Platform:为代理服务创建 GCP 安全策略。
Microsoft Azure:
第 1 步:链接 Azure 的 API 集成
第 2 步:创建验证-JWT 策略
监控复制¶
本部分提供了有关如何监控账户复制进度、历史记录和成本的信息。
使用 Snowsight 监控复制¶
要监控组织中 复制组和故障转移组 的复制进度和状态,请使用 Snowsight 中的 Replication 页面。
您可以查看刷新操作的状态和详细信息:
查看最近刷新操作的当前状态。
查看副本滞后时间(自上次刷新操作以来的时间)。
查看各组的副本滞后时间分布。
查看下一次计划刷新操作的日期和时间。
备注
Snowsight 列出了其中具有 MONITOR、OWNERSHIP 或 REPLICATE 权限角色的复制组和故障转移组。
刷新操作详细信息仅对具有 ACCOUNTADMIN 角色或组的 OWNERSHIP 权限的用户可用。
您必须登录目标账户才能查看刷新操作详细信息。如果没有,系统将提示您登录。
源账户和目标账户都必须使用相同的连接类型(公共互联网)。否则,登录目标账户将失败。
要查看每个复制组或故障转移组的复制状态,请完成以下步骤:
登录到 Snowsight 并导航至 Admin » Accounts。
选择 Replication,然后选择 Groups。
Groups 页面显示了具有查看权限角色所在所有组的 刷新操作详细信息。您可以使用磁贴来筛选视图。
例如,如果 Status 磁贴指示刷新操作失败,您可以选择该磁贴来调查存在故障的组。
Longest Replication lag 磁贴中的滞后时间指的是自上次刷新操作以来的持续时间。这是辅助复制组或故障转移组*滞后*于主要组的时间长度。最长滞后时间指的是自最旧的辅助复制组上次刷新以来的时间长度。
例如,如果您有三个故障转移组
fg_1
、fg_2
、fg_3
,其独立的复制计划分别为 10 分钟、2 小时和 12 小时,则最长滞后时间可能长达 12 小时。但是,如果fg_3
在目标账户中最近刷新过,则其滞后时间会重置为 0,不同的故障转移组可能会有更长的滞后时间。您可以选择 Group Lag Distribution 磁贴中的单个条形图来将结果筛选到单个组。
您还可以使用搜索字段或下拉菜单来筛选组:
您可以使用 |sf-search-icon|(搜索框按复制组或故障转移组名称进行搜索。
选择 Type 即可按复制组或故障转移组筛选结果。
选择 Replicating 即可按主要组(选择 To)或次要组(选择 From)进行筛选。
选择 |sf-account-icon|(账户)菜单即可按账户名称筛选结果。
选择 Status 即可按刷新操作状态筛选结果:
Refresh Cancelled
Refresh Failed
Refresh In Progress
Refresh Successful
您可以查看有关复制组和故障转移组的以下详细信息:
列 |
描述 |
---|---|
Name |
复制组或故障转移组的名称。 |
Is Replicating |
指示组是否正在复制 到 目标账户或 从 源账户复制。 如果此列包含 可用的目标,则不存在辅助复制组或故障转移组。可用目标的数量表示主要组可以复制到的目标账户数量。 |
Status |
显示最新刷新操作的状态。 您必须登录目标账户才能访问复制详细信息。如果您没有登录,请选择 Sign in 以查看辅助组的刷新操作状态。 源账户和目标账户都必须使用相同的连接类型(公共互联网)。否则,登录目标账户将失败。 |
Replication Lag |
自上次刷新操作以来的时间长度。这是辅助复制组“滞后”于主要复制组的时间长度。 |
Next Refresh |
下一次计划刷新操作的日期和时间。 |
您可以选择一个复制组或故障转移组,查看有关每次刷新操作的详细信息。有关更多信息,请参阅 Snowsight 中有关复制历史记录的部分。
监控刷新操作的进度¶
本节提供了有关如何监控特定复制组或故障转移组的复制进度的信息。
使用 Snowsight 监控刷新操作的进度¶
您可以使用 Snowsight 查看正在进行的刷新操作的状态以及历史刷新操作的详细信息。
登录到 Snowsight 并导航至 Admin » Accounts。
依次选择 Replication、Groups。
选择复制组或故障转移组的名称。
有关详情视图的详细信息,请参阅 Snowsight 中有关复制历史记录的部分。
使用 SQL 监控刷新操作的进度¶
要监控复制组或故障转移组刷新的进度,请查询 REPLICATION_GROUP_REFRESH_PROGRESS、REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB 表函数(在 Snowflake Information Schema 中)。
示例¶
查看故障转移组 myfg
最近的刷新操作进度:
SELECT phase_name, start_time, end_time, progress, details
FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_PROGRESS('myfg'));
查看复制历史记录¶
您可以使用 Snowsight 或 SQL 查看复制历史记录。
备注
您可以查看具有 MONITOR、OWNERSHIP 或 REPLICATE 权限的复制组和故障转移组的复制历史记录。
使用 Snowsight 查看复制历史记录¶
您可以在组的详细信息页面中查看特定复制组或故障转移组每个刷新操作的复制历史记录和详细信息。
登录到 Snowsight 并导航至 Admin » Accounts。
依次选择 Replication、Groups。
选择复制组或故障转移组的名称。
然后,您可以查看有关该组的以下信息:
组类型(复制组或故障转移组)。
复制计划(例如,每 10 分钟一次)。
每次刷新操作的持续时间。
副本滞后时间(自上次刷新操作以来的时间长度)。
下一次计划刷新操作的日期和时间。
您可以按状态和时间段对页面上的数据进行筛选:
选择 Status 即可按刷新操作状态筛选结果:
Refresh Cancelled
Refresh Failed
Refresh In Progress
Refresh Successful
选择 Duration 以显示以下时间段的刷新操作详细信息:
Last hour
Last 24 hours
Last 7 days
All
选择 All 显示最近 14 天的刷新操作。
每次刷新操作的详细信息包括以下列:
列 |
描述 |
---|---|
Query ID |
刷新操作的查询 ID。 |
Status |
显示刷新操作的状态。有效值包括 |
Ended |
刷新操作结束的日期和时间。 |
Duration |
刷新操作完成所需的时间长度。 持续时间按 复制阶段 进行了细分,并用颜色进行了编码。每个色段的宽度表示在该阶段花费的时间比例。 以下图像仅供参考。当您 选择刷新操作 了解更多详情时,系统将显示此图表。 |
Transferred |
复制的字节数。 |
Objects |
复制的对象数量。 |
选择一行以查看有关特定刷新操作的其他详细信息,包括:
每个复制阶段的持续时间。
错误消息(针对失败的刷新操作)。
按类型和数量复制的数据库对象列表。
复制的数据库数量和数据库名称。
使用 SQL 查看复制历史记录¶
要查看指定日期范围内特定复制组或故障转移组的复制历史记录,请查询以下内容之一:
示例¶
查询 Information Schema REPLICATION_GROUP_REFRESH_HISTORY 表函数,以查看最近 7 天故障转移组 myfg
的账户复制历史记录:
SELECT PHASE_NAME, START_TIME, END_TIME, TOTAL_BYTES, OBJECT_COUNT
FROM TABLE(information_schema.replication_group_refresh_history('myfg'))
WHERE START_TIME >= current_date - interval '7 days';
查询 Account Usage REPLICATION_GROUP_REFRESH_HISTORY 视图,以查看当月账户复制历史记录:
SELECT REPLICATION_GROUP_NAME, PHASE_NAME, START_TIME, END_TIME, TOTAL_BYTES, OBJECT_COUNT
FROM snowflake.account_usage.replication_group_refresh_history
WHERE START_TIME >= date_trunc('month', current_date());
监控复制成本¶
要监控复制的 Credit 使用量,请查询以下内容之一:
示例¶
查询 REPLICATION_GROUP_USAGE_HISTORY 表函数,以查看最近 7 天用于账户复制的 Credit 使用情况:
SELECT start_time, end_time, replication_group_name, credits_used, bytes_transferred
FROM table(information_schema.replication_group_usage_history(date_range_start=>dateadd('day', -7, current_date())));
查询 Account Usage REPLICATION_GROUP_USAGE_HISTORY 视图,以查看当月复制组或故障转移组用于账户复制的 Credit 使用情况历史记录:
SELECT start_time,
end_time,
replication_group_name,
credits_used,
bytes_transferred
FROM snowflake.account_usage.replication_group_usage_history
WHERE start_time >= DATE_TRUNC('month', CURRENT_DATE());
监控数据库的复制成本¶
对于包含在复制或故障转移组中的单个数据库的复制成本,可以通过检索数据库的复制字节数并将其与使用的 Credit 相关联来计算。
示例¶
查询 Account Usage 视图¶
以下示例计算最近 30 天某个复制组中数据库的复制成本。
查询 REPLICATION_GROUP_REFRESH_HISTORY Account Usage 视图,并计算每个数据库复制的字节数总和。
例如,要计算最近 30 天复制组
myrg
中数据库复制的字节数总和,可参考以下内容:select sum(value:totalBytesToReplicate) as sum_database_bytes from snowflake.account_usage.replication_group_refresh_history rh, lateral flatten(input => rh.total_bytes:databases) where rh.replication_group_name = 'MYRG' and rh.start_time >= current_date - interval '30 days';
请注意数据库字节数总和的输出:
+--------------------+ | SUM_DATABASE_BYTES | |--------------------| | 22016 | +--------------------+
查询 REPLICATION_GROUP_USAGE_HISTORY Account Usage 视图,并计算用于复制的 Credit 总数和复制的字节数总和。
例如,要计算最近 30 天复制组
myrg
的 Credit 使用情况总数和复制的字节数总和,可参考以下内容:select sum(credits_used) as credits_used, SUM(bytes_transferred) as bytes_transferred from snowflake.account_usage.replication_group_usage_history where replication_group_name = 'MYRG' and start_time >= current_date - interval '30 days';
请注意 Credit 使用总数和传输字节数总和的输出:
+--------------+-------------------+ | CREDITS_USED | BYTES_TRANSFERRED | |--------------+-------------------| | 1.357923604 | 22013 | +--------------+-------------------+
使用前两个步骤中传输字节的数据库值、使用的 Credit 总数以及复制的所有字节总数,计算数据库的复制成本:
(<database_bytes_transferred> / <bytes_transferred>) * <credits_used>
例如:
(22016 / 22013) * 1.357923604 = 1.35810866)
查询 Information Schema 表函数¶
如需了解最近 14 天的刷新操作,可查询关联的 Information Schema 表函数。
查询 REPLICATION_GROUP_REFRESH_HISTORY 表函数,查看复制组
myrg
的数据库复制的字节数总和:select sum(value:totalBytesToReplicate) from table(information_schema.replication_group_refresh_history('myrg')) as rh, lateral flatten(input => total_bytes:databases) where rh.phase_name = 'COMPLETED' and rh.start_time >= current_date - interval '14 days';
查询 REPLICATION_GROUP_USAGE_HISTORY 表函数,查看复制组
myrg
的 Credit 使用总数和传输的字节数总和:select sum(credits_used), sum(bytes_transferred) from table(information_schema.replication_group_usage_history( date_range_start=>dateadd('day', -14, current_date()), replication_group_name => 'myrg' ));
比较主数据库和辅助数据库中的数据集¶
如果数据库对象在复制组或故障转移组中进行了复制,则可以使用 HASH_AGG 函数比较主数据库和辅助数据库中随机一组表中的行,以验证数据一致性。HASH_AGG 函数返回输入行集合(无序)的汇总 64 位哈希值。在辅助数据库的所有或随机子集上查询此函数,并在主数据库上查询(截取主数据库快照的时间戳),然后比较输出。
示例¶
在下面的示例中,数据库 mydb
包含在故障转移组 myfg
中。数据库 mydb
包含表 mytable
。
在目标账户上执行¶
查询 REPLICATION_GROUP_REFRESH_PROGRESS 表函数(在 Snowflake Information Schema 中)。请注意,
DETAILS
列中的primarySnapshotTimestamp
处于PRIMARY_UPLOADING_METADATA
阶段。这是主数据库最新快照的时间戳。SELECT PARSE_JSON(details)['primarySnapshotTimestamp'] FROM TABLE(information_schema.replication_group_refresh_progress('myfg')) WHERE PHASE_NAME = 'PRIMARY_UPLOADING_METADATA';
查询辅助数据库中指定表的 HASH_AGG 函数。以下查询会返回
mytable
表中所有行的哈希值:SELECT HASH_AGG( * ) FROM mytable;
在源账户上执行¶
查询主数据库中同一个表的 HASH_AGG 函数。使用 Time Travel,指定为辅助数据库拍摄最新快照时的时间戳:
SELECT HASH_AGG( * ) FROM mytable AT(TIMESTAMP => '<primarySnapshotTimestamp>'::TIMESTAMP);
比较这两个查询的结果。输出应该是相同的。
修改复制组或故障转移组¶
您可以使用 Snowsight 或者 SQL 编辑复制组或故障转移组的名称、包含的对象和复制计划。
使用 Snowsight 修改复制组或故障转移组¶
备注
只有账户管理员才能使用 Snowsight 编辑复制组或故障转移组(请参阅 使用 Snowsight 进行复制配置的限制)。
要编辑组名称,您必须登录目标账户。如果您尚未登录,则 Status 列会显示登录消息,而不是刷新状态。
源账户和目标账户都必须使用相同的连接类型(公共互联网)。否则,登录目标账户将失败。
登录到 Snowsight 并导航至 Admin » Accounts。
依次选择 Replication、Groups。
找到要编辑的复制组或故障转移组。选择位于该行最后一列的 More 菜单 (...)。
选择 Edit。
要更改组名称,请在 Group Name 框中,输入满足以下要求的新名称:
必须以字母字符开头,且不能包含空格或特殊字符,除非标识符字符串被双引号包围(例如“My object”)。放在双引号内的标识符也区分大小写。
有关更多信息,请参阅 标识符要求。
账户中的故障转移组和复制组的名称必须是唯一的。
选择 Select Objects 添加或删除共享对象和账户对象。
备注
账户对象只能添加到一个复制组或故障转移组。如果您的账户中已存在具有任何账户对象的复制或故障转移组,则无法选择这些对象。
选择 Select Databases 添加或删除数据库对象。
选择 Replication Frequency 更改组的复制计划。
选择 Save Changes 更新组。
如果未成功将变更保存到组,请参阅 使用 Snowsight 解决创建和编辑复制组方面的问题 了解常见错误以及解决方法。
使用 SQL 修改复制组或故障转移组¶
您可以使用 ALTER REPLICATION GROUP 或 ALTER FAILOVER GROUP 命令修改复制组或故障转移组属性。
删除辅助复制组或故障转移组¶
您可以使用 DROP REPLICATION GROUP 或 DROP FAILOVER GROUP 命令删除辅助复制或故障转移。只有复制组或故障转移组所有者(即具有 OWNERSHIP 组权限的角色)可以删除该组。
您必须在源账户中删除该组,才能使用 Snowsight 删除辅助复制组或故障转移组。请参阅 使用 Snowsight 删除复制组或故障转移组。
删除主复制组或故障转移组¶
您可以使用 Snowsight 或 SQL 删除主复制组或故障转移组。如果您要使用 SQL 删除主要组,您必须首先删除所有辅助组。请参阅 删除辅助复制组或故障转移组。
使用 SQL 删除主复制组或故障转移组¶
仅当删除主复制组或故障转移组的所有副本(即辅助复制组或故障转移组)后,才能删除主复制组或故障转移组。或者,您也可以将辅助故障转移组提升为主故障转移组,然后删除以前的主故障转移组。
请注意,只有组所有者才能删除组。
使用 Snowsight 删除复制组或故障转移组¶
备注
只有账户管理员可以使用 Snowsight 删除复制组或故障转移组(请参阅 使用 Snowsight 进行复制配置的限制)。
您可以删除主复制组或故障转移组以及任何链接的辅助组。
登录到 Snowsight 并导航至 Admin » Accounts。
依次选择 Replication、Groups。
找到要删除的复制组或故障转移组。选择位于该行最后一列的 More 菜单 (...)。
依次选择 Drop、Drop Group。
使用 Snowsight 解决创建和编辑复制组方面的问题¶
以下场景可以帮助您解决使用 Snowsight 创建或编辑复制组或故障转移组时可能出现的常见问题。
您无法将数据库添加到组中¶
错误 |
Database '<database_name>' is already configured to replicate to
account '<account_name>' by replication group '<group_name>'.
|
---|---|
原因 |
一个数据库只能属于一个复制组或故障转移组。您为该组选择的数据库之一已包含在另一个复制组或故障转移组中。 |
解决方案 |
选择 Select Databases 并取消选择已包含在另一组中的任何数据库。 |
错误 |
Cannot directly add previously replicated object '<database_name>' to a
replication group. Please use the provided system functions to convert
this object first.
|
---|---|
原因 |
要添加到复制组或故障转移组的数据库先前已配置为数据库复制。 |
解决方案 |
禁用数据库的数据库复制。请参阅 从 Database Replication 转换为基于组的复制。 |
使用 Snowsight 进行复制配置的限制¶
只有具有 ACCOUNTADMIN 角色的用户才能使用 Snowsight 创建复制组或故障转移组。具有 CREATE REPLICATION GROUP 或 CREATE FAILOVER GROUP 权限角色的用户可以使用相应的自 SQL 命令创建组。
只有具有 ACCOUNTADMIN 角色的用户才能使用 Snowsight 编辑或删除复制组或故障转移组。具有复制组或故障转移组 OWNERSHIP 权限角色的用户可以使用相应的 SQL 命令编辑和删除组。