跨多个账户复制数据库¶
重要
本节介绍了一种有限的 Database Replication 功能,该功能不同于 账户复制功能。Snowflake 强烈建议使用账户复制功能对数据库进行复制和故障转移。
本主题介绍了跨多个 Snowflake 账户复制数据库以及保持数据库对象和存储数据同步所需的步骤。Database Replication 可以跨相同或不同 区域 的 Snowflake 账户进行。
本主题内容:
对数据库复制和故障转移/故障恢复的区域支持¶
Amazon Web Services、Google Cloud Platform 和 Microsoft Azure 上的所有 Snowflake 区域都支持数据库复制和故障转移/故障恢复。
请注意,账户可以在 区域组 (例如,在 Virtual Private Snowflake (VPS) 和多租户区域之间)之间复制数据库,以促进这些区域之间的数据共享和账户迁移。默认情况下,此功能处于禁用状态。您可以联系 Snowflake 支持部门 以启用访问权限。
用于数据库复制和故障转移/故障恢复的 Web 界面¶
注意
在 Snowsight 和 Classic Console 中管理和监控复制以及故障转移/故障恢复仅适用于使用专用连接的账户。
对于所有其他账户,请参阅 使用 Snowsight 监控复制 和 复制账户对象和数据库。
账户管理员(具有 ACCOUNTADMIN 角色的用户)可以在 Snowsight 或 Classic Console 中管理复制和故障转移/故障恢复操作。
Snowsight¶
- 导航:
Data » Databases
管理主数据库¶
注意
仅适用于使用专用连接的账户。对于所有其他账户,请参阅 使用 Snowsight 监控复制 和 复制账户对象和数据库。
通过 Snowsight 登录包含主数据库的 Snowflake 账户。
选择左上角的下拉菜单(在您的登录名旁边)|ra| Switch Role »
ACCOUNTADMIN
。从左侧导航窗格中选择 Data » Databases。在数据库对象资源管理器中选择主数据库。此时将打开数据库详细信息页面。
或者,如果要仅查看已启用复制的数据库,请使用 Replication Status » Primary 筛选器以列出账户中的主数据库。从列表中选择数据库以打开详细信息页面。
备注
Replication Status 筛选器仅在账户是数据库复制的源账户或目标账户时才可用。
选择
» Enable Replication。Enable replication 对话框随即打开。
选择要执行的操作:
启用故障转移。此功能需要 Business Critical Edition (或更高版本)。
在一个或多个目标账户中创建辅助数据库。
如果其他账户中的主数据库支持复制到当前账户,则可以在当前账户中创建辅助数据库。要添加其他目标账户,请在源账户中使用 ALTER DATABASE 命令以更新主数据库。
创建每个辅助数据库后,刷新一次。
对于此数据库的每个目标账户,请选中用于创建辅助数据库并刷新数据库的选项。
以之前在该账户中被授予 ACCOUNTADMIN 角色的用户身份登录到目标账户。
Snowflake 执行请求的操作并显示成功对话框。
从数据库详细信息中的 Replication 选项卡管理此数据库的复制。
管理辅助数据库¶
注意
仅适用于使用专用连接的账户。对于所有其他账户,请参阅 使用 Snowsight 监控复制 和 复制账户对象和数据库。
通过 Snowsight 登录包含辅助数据库的 Snowflake 账户。
选择左上角的下拉菜单(在您的登录名旁边)|ra| Switch Role »
ACCOUNTADMIN
。从左侧导航窗格中选择 Data » Databases。
通过页面右上角的操作 (...) 按钮可以执行以下操作:
创建辅助数据库。
备注
仅当账户是数据库复制的源账户或目标账户时,此选项才可用。
如果其他账户中的主数据库支持复制到当前账户,则可以在当前账户中创建辅助数据库。要添加其他目标账户,请在源账户中使用 ALTER DATABASE 命令以更新主数据库。
在数据库对象资源管理器中选择辅助数据库。此时将打开数据库详细信息页面。
选择 Replication 选项卡。
通过页面右上角的操作 (...) 按钮可以执行以下操作:
将辅助数据库提升为主数据库。此功能需要 Business Critical Edition(或更高版本)。
备注
为了将辅助数据库提升为主数据库,主数据库必须启用到辅助数据库所在的目标账户的故障转移。
如果此选项不可用,则可以使用源账户中的 ALTER DATABASE 命令启用主数据库到目标账户的故障转移。有关更多信息,请参阅 第 3 步:为主数据库启用故障转移。
刷新辅助数据库。
复制模板以创建按计划刷新辅助数据库的任务。将模板粘贴到 Snowsight 工作表中,并对其进行编辑以指定所需的计划。
Classic Console¶
注意
仅适用于使用专用连接的账户。对于所有其他账户,请参阅 使用 Snowsight 监控复制 和 复制账户对象和数据库。
使用 Classic Console 中 Databases 选项卡的 Replication 区域可以执行与配置和管理数据库复制相关的大多数操作,包括以下操作:
为本地数据库启用复制。这会将数据库提升为主数据库。
为主数据库(Business Critical Edition 账户或更高版本)启用故障转移。
刷新辅助数据库,一次(手动)或多次(按照计划,使用任务)刷新。
将辅助数据库提升为主数据库(Business Critical Edition 账户或更高版本)。
备注
为了能够将辅助数据库提升为主数据库,主数据库必须启用到辅助数据库所在目标账户的故障转移。
如果此选项不可用:
使用主数据库登录源账户。
从 Databases 区域中,选择 Replication。
选择 Primary 选项卡以列出主数据库。选择包含主数据库的行。
找到要为其启用故障转移的目标账户,然后选择 Failover。
禁用主数据库的复制和/或故障转移。
将数据库复制到另一个账户¶
本节中的说明描述了如何准备账户进行复制、将本地数据库提升为主数据库、执行此主数据库到另一个账户的初始复制以及计划辅助数据库的刷新。
先决条件:为组织中的账户启用复制¶
组织管理员(ORGADMIN 角色)必须在复制数据库之前启用源账户和目标账户的复制。有关详细说明,请参阅 先决条件:为组织中的账户启用复制。
启用数据库复制和故障转移,并刷新辅助数据库¶
备注
除非另有说明,否则只有账户管理员(具有 ACCOUNTADMIN 角色的用户)才能执行本节中的 SQL 语句。
第 1 步:查看组织中的所有账户¶
检索组织中已启用复制的账户列表。可以修改这些账户中的任何现有永久或临时数据库,以用作主数据库。主数据库的副本(即辅助数据库)只能在这些账户中创建。
若要查看组织中的账户列表,请查询 SHOW REPLICATION ACCOUNTS。
SHOW REPLICATION ACCOUNTS;
+------------------+---------------------------------+---------------+------------------+---------+-------------------+
| snowflake_region | created_on | account_name | account_locator | comment | organization_name |
|------------------+---------------------------------+---------------+------------------+---------+-------------------|
| AWS_US_WEST_2 | 2018-11-19 16:11:12.720 -0700 | ACCOUNT1 | MYACCOUNT1 | | MYORG |
| AWS_US_EAST_1 | 2019-06-02 14:12:23.192 -0700 | ACCOUNT2 | MYACCOUNT2 | | MYORG |
+------------------+---------------------------------+---------------+------------------+---------+-------------------+
查看 区域 IDs 的完整列表。
第 2 步:将本地数据库提升为主数据库¶
使用 ALTER DATABASE ...ENABLE REPLICATION TO ACCOUNTS。在组织中提供一个以逗号分隔的账户列表,这些账户可以存储此数据库的副本(即辅助数据库),从而允许这些账户中的用户查询辅助数据库中的对象。
示例¶
将本地数据库 mydb1
(在账户 account1
中)提升为主数据库,并指定账户 account2
和 account3
可以各自存储该数据库的副本:
ALTER DATABASE mydb1 ENABLE REPLICATION TO ACCOUNTS myorg.account2, myorg.account3;
第 3 步:为主数据库启用故障转移¶
备注
故障转移/故障恢复需要 Business Critical(或更高)。如需咨询升级事宜,请联系 Snowflake 支持部门。
使用 ALTER DATABASE ...ENABLE FAILOVER TO ACCOUNTS。这些任一账户中的主数据库的副本(即辅助数据库)都可以升级为主数据库。
请注意,可以在指定账户中创建主数据库的副本之前 或 之后为主数据库启用故障转移。
示例¶
启用主数据库 mydb1
到账户 account2
和 account3
的故障转移。
-- Executed from primary account
ALTER DATABASE mydb1 ENABLE FAILOVER TO ACCOUNTS myorg.account2, myorg.account3;
第 4 步:创建辅助数据库¶
在存储主数据库的同一账户或其他账户(位于相同或不同的区域)中创建现有主数据库的副本。请注意,您只能在 ALTER DATABASE ...ENABLE REPLICATION TO ACCOUNTS 语句(在 第 2 步:将本地数据库提升为主数据库 中)中指定的账户中创建辅助数据库。
备注
复制命令(例如,将数据库提升为源账户中的主数据库)通常会触发跨区域操作,并且可能需要几秒钟才能生效。例如,如果您以编程方式将数据库提升为源账户中的主数据库,并在目标账户中创建辅助数据库,则可能需要几秒钟的时间才能创建辅助数据库。
在每个目标账户中执行 CREATE DATABASE ...AS REPLICA OF 语句,以创建指定主数据库的副本。
重要
作为最佳实践,我们建议为每个辅助数据库提供与其主数据库相同的名称。此实践支持同一数据库中的其他对象引用完全限定对象(即 '<db>.<schema>.<object>'
),例如在视图中查询完全限定表名。
如果辅助数据库的名称与主数据库的名称不同,则这些对象引用将在辅助数据库中中断。
若要查看组织中的主数据库和辅助数据库的列表,请查询 SHOW REPLICATION DATABASES。创建辅助数据库后,账户管理员可以将数据库的所有权转移给另一个角色(使用 GRANT OWNERSHIP。)
示例¶
以下示例在 myorg.account2
账户中创建 myorg.account1.mydb1
主数据库的副本:
-- Log into the ACCOUNT2 account.
-- Query the set of primary and secondary databases in your organization.
-- In this example, the MYORG.ACCOUNT1 primary database is available to replicate.
SHOW REPLICATION DATABASES;
+------------------+-------------------------------+-----------------+----------+---------+------------+----------------------------+---------------------------------+------------------------------+-------------------+-----------------+
| snowflake_region | created_on | account_name | name | comment | is_primary | primary | replication_allowed_to_accounts | failover_allowed_to_accounts | organization_name | account_locator |
|------------------+-------------------------------+-----------------+----------+---------+------------+----------------------------+---------------------------------+------------------------------+-------------------+-----------------|
| AWS_US_WEST_2 | 2019-11-15 00:51:45.473 -0700 | ACCOUNT1 | MYDB1 | NULL | true | MYORG.ACCOUNT1.MYDB1 | MYORG.ACCOUNT2, MYORG,ACCOUNT1 | MYORG.ACCOUNT1 | MYORG | MYACCOUNT1 |
+------------------+-------------------------------+-----------------+----------+---------+------------+----------------------------+---------------------------------+------------------------------+-------------------+-----------------+
-- Create a replica of the 'mydb1' primary database
-- If the primary database has the DATA_RETENTION_TIME_IN_DAYS parameter set to a value other than the default value,
-- set the same value for the parameter on the secondary database.
CREATE DATABASE mydb1
AS REPLICA OF myorg.account1.mydb1
DATA_RETENTION_TIME_IN_DAYS = 10;
-- Verify the secondary database
SHOW REPLICATION DATABASES;
+------------------+-------------------------------+---------------+----------+---------+------------+-------------------------+---------------------------------+------------------------------+-------------------+-----------------+
| snowflake_region | created_on | account_name | name | comment | is_primary | primary | replication_allowed_to_accounts | failover_allowed_to_accounts | organization_name | account_locator |
|------------------+-------------------------------+---------------+----------+---------+------------+------------------------------------------+----------------+------------------------------+-------------------------------------|
| AWS_US_WEST_2 | 2019-11-15 00:51:45.473 -0700 | ACCOUNT1 | MYDB1 | NULL | true | MYORG.ACCOUNT1.MYDB1 | MYORG.ACCOUNT2, MYORG.ACCOUNT1 | MYORG.ACCOUNT1 | MYORG | MYACCOUNT1 |
| AWS_US_EAST_1 | 2019-08-15 15:51:49.094 -0700 | ACCOUNT2 | MYDB1 | NULL | false | MYORG.ACCOUNT1.MYDB1 | | | MYORG | MYACCOUNT2 |
+------------------+-------------------------------+---------------+----------+---------+------------+-------------------------+---------------------------------+------------------------------+-------------------+-----------------+
第 5 步:刷新每个辅助数据库¶
本节中的说明描述了如何从主数据库的快照刷新辅助数据库(使用 ALTER DATABASE ...REFRESH)。快照包括对对象和数据的更改。对于非常大的主数据库的初始复制,建议 延长语句超时时间。
备注
若要刷新辅助数据库,用于执行该操作的角色必须具有数据库的 OWNERSHIP 权限或角色必须被授予数据库的 OWNERSHIP 权限。
执行刷新操作的角色拥有因数据库刷新而添加的任何新对象。
要在登录账户后验证当前区域,请查询 CURRENT_REGION 函数。
ALTER DATABASE mydb1 REFRESH;
您还可以 在 Web UI 中刷新辅助数据库。
第 6 步:按计划刷新辅助数据库¶
作为最佳实践,我们建议计划辅助数据库刷新。本节提供有关按指定计划自动启动数据库刷新的说明。
刷新辅助数据库的频率取决于辅助数据库中数据的恢复点目标 (RPO)。例如,如果依赖于数据的应用程序可以容忍长达 1 小时的数据丢失,则必须至少每小时刷新一次数据。如果数据丢失容忍时间为 5 分钟,则至少每 5 分钟刷新一次辅助数据库。
备注
我们建议您手动执行主数据库的初始复制(使用 ALTER DATABASE ...REFRESH),并且仅计划后续刷新。
单次运行任务的默认限制为 60 分钟。实施此限制是为了防止非终止任务。在极少数情况下,刷新非常大的数据库可能会超过默认任务运行限制。要确定是否发生此情况,请查询 TASK_HISTORY 表函数。考虑通过执行 ALTER TASK ...SET USER_TASK_TIMEOUT_MS = <num> 来增加任务的超时限制。
完成本节中的步骤,按指定的计划自动启动数据库刷新。
- 先决条件:
存储辅助数据库的账户中需要以下 Snowflake 对象:
辅助数据库。
一个单独的数据库,用于存储在本节中创建的新对象。由于辅助数据库是只读的,因此该数据库必须与辅助数据库分开。此数据库还必须包含以下对象:
架构。使用 PUBLIC 架构,或使用 CREATE SCHEMA 创建新架构。
仓库。可以在此处提供任何仓库以满足语法要求,但 不 用于数据库刷新。使用 CREATE WAREHOUSE 创建新仓库。
按计划刷新辅助数据库的任务。
- 所需权限:
本节中的步骤要求在刷新辅助数据库的账户中具有以下权限的角色:
对象类型
对象
权限
备注
账户
存储辅助数据库的账户
EXECUTE TASK
运行新任务必需项。
数据库
辅助数据库
OWNERSHIP
刷新辅助数据库必需项。
数据库
存储新任务的数据库
USAGE
架构
存储新任务的架构
USAGE、CREATE TASK
任务
OWNERSHIP
默认情况下,创建任务的角色拥有该对象。可以使用 GRANT
privileges
...TO ROLE。仓库
用于配置任务的仓库
USAGE
需要指定仓库才能配置任务,但仓库 不 用于运行任务或刷新操作。
- 步骤:
对于要按计划刷新的每个辅助数据库,请完成以下步骤:
创建一个按计划启动数据库刷新的任务(使用 CREATE TASK)。请注意,尽管用于指定复制计划的 CREATE TASK 语法需要仓库,但该仓库并 不 用于复制。
例如,创建一个名为
refresh_mydb1_task
的任务,该任务每 10 分钟刷新一次名为mydb1
的辅助数据库,超时时间为 4 小时。该任务使用现有仓库mywh
进行配置:CREATE TASK refresh_mydb1_task WAREHOUSE = mywh SCHEDULE = '10 minute' USER_TASK_TIMEOUT_MS = 14400000 AS ALTER DATABASE mydb1 REFRESH;
默认情况下,任务在创建时处于暂停状态。恢复任务以允许其根据任务定义中指定的参数运行:
ALTER TASK refresh_mydb1_task RESUME;
示例¶
在首选的 Snowflake 客户端中执行以下 SQL 语句以启用复制和故障转移,执行初始数据库刷新并设置计划刷新。
在源账户中执行¶
-- The commands below are executed from the source account
-- View replication enabled accounts
SHOW REPLICATION ACCOUNTS;
ALTER DATABASE mydb ENABLE REPLICATION TO ACCOUNTS myorg.account2, myorg.account3;
ALTER DATABASE mydb ENABLE FAILOVER TO ACCOUNTS myorg.account2, myorg.account3;
在每个目标账户中执行¶
-- The commands below are executed from each target account
-- View replication enabled databases
-- Note the primary column of the source database for the CREATE DATABASE statement below
SHOW REPLICATION DATABASES;
-- If the primary database has the DATA_RETENTION_TIME_IN_DAYS parameter set to a value other than the default value,
-- set the same value for the parameter on the secondary database.
CREATE DATABASE mydb
AS REPLICA OF myorg.account1.mydb
DATA_RETENTION_TIME_IN_DAYS = 10;
-- Increase statement timeout for initial refresh
-- Optional but recommended for initial refresh of a large database
ALTER SESSION SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
-- If you have an active warehouse in current session, update warehouse statement timeout
SELECT CURRENT_WAREHOUSE();
ALTER WAREHOUSE my_wh SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
-- Reset warehouse statement timeout after initial refresh
ALTER WAREHOUSE my_wh UNSET STATEMENT_TIMEOUT_IN_SECONDS;
-- Refresh a secondary database
ALTER DATABASE mydb REFRESH;
-- Create task
-- Set up refresh schedule for each secondary database using a separate database
USE DATABASE my_db2;
-- Create a task and RESUME the task for each secondary database
-- Edit the task schedule and timeout for your specific use case
CREATE TASK my_refresh_task
WAREHOUSE = my_wh
SCHEDULE = '10 minute'
USER_TASK_TIMEOUT_MS = 14400000
AS
ALTER DATABASE mydb REFRESH;
-- Start task
ALTER TASK my_refresh_task RESUME;
使用旧版账户定位器¶
尽管在复制和故障转移命令中识别账户时,当前支持旧版 snowflake_region.account_locator
格式,但不建议使用它,因为它将来可能会停止工作。
增加初始复制的语句超时时间¶
数据库复制使用 Snowflake 提供的计算资源(而不是您自己的虚拟仓库)来复制对象和数据。但是,STATEMENT_TIMEOUT_IN_SECONDS 会话/对象参数仍控制语句在取消之前运行的时间。默认值为 ``172800``(2 天)。由于超大型主数据库的 初始复制 可能需要 2 天以上的时间才能完成(具体取决于数据库中的元数据量以及数据库对象中的数据量),因此建议将运行复制操作的会话的 STATEMENT_TIMEOUT_IN_SECONDS 值增加到 ``604800``(7 天,最大值)。
在同一会话中执行 ALTER DATABASE secondary_db_name REFRESH
语句之前,请运行以下 ALTER SESSION 语句:
ALTER SESSION SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
请注意,STATEMENT_TIMEOUT_IN_SECONDS 参数也适用于会话中的活动仓库。该参数遵循在会话或仓库级别设置的 较低 值。如果当前会话中有一个处于活动状态的仓库,也请将此仓库的 STATEMENT_TIMEOUT_IN_SECONDS 设置为 ``604800``(使用 ALTER WAREHOUSE)。
例如:
-- determine the active warehouse in the current session (if any)
SELECT CURRENT_WAREHOUSE();
+---------------------+
| CURRENT_WAREHOUSE() |
|---------------------|
| MY_WH |
+---------------------+
-- change the STATEMENT_TIMEOUT_IN_SECONDS value for the active warehouse
ALTER WAREHOUSE my_wh SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
复制操作完成后,您可以将参数值重置为默认值:
ALTER WAREHOUSE my_wh UNSET STATEMENT_TIMEOUT_IN_SECONDS;
监控数据库刷新的进度¶
要确定初始数据库复制或后续辅助数据库刷新的当前状态,请查询 DATABASE_REFRESH_PROGRESS、DATABASE_REFRESH_PROGRESS_BY_JOB 表函数(在 Snowflake Information Schema 中)。
数据库刷新操作可能需要几个小时或更长时间才能完成,具体取决于要复制的数据量。
要查看指定日期范围内指定数据库的复制历史记录,请查询以下任一选项:
DATABASE_REPLICATION_USAGE_HISTORY 表函数(在 Snowflake Information Schema 中)。此函数返回过去 14 天内的复制使用活动。
/sql-reference/account-usage/database_replication_usage_history`(在 :doc:/sql-reference/account-usage` 中)。此视图返回过去 365 天(1 年)内的复制使用活动。
示例¶
监控 mydb1
辅助数据库刷新的进度:
select *
from table(information_schema.database_refresh_progress(mydb1));
在 Classic Console 中监控数据库刷新进度¶
在 Classic Console 中手动启动辅助数据库刷新,以查看动态进度条,该进度条显示刷新操作的当前状态和统计信息。
要启动辅助数据库刷新操作,请执行以下操作:
选择要刷新的辅助数据库。
选择 Refresh now 按钮。Refresh Database 对话框随即打开。
选择 Refresh 按钮。
Last Refresh Status 列显示当前刷新操作的状态。进度条会动态更新。
侧边窗口中的 Refresh History 统计信息还显示当前刷新状态,以及刷新开始时间、传输的字节数和其他统计数据。

查看数据库刷新历史记录¶
要查看辅助数据库刷新操作的历史记录,请查询 DATABASE_REFRESH_HISTORY 表函数(在 Snowflake Information Schema 中)。此函数返回过去 14 天内的数据库刷新活动。
或
查询 /sql-reference/account-usage/database_replication_usage_history`(在共享 Snowflake 数据库的 :doc:/sql-reference/account-usage` 架构中)。此视图返回过去 365 天(1 年)内的数据库复制使用活动。
示例¶
查看 mydb1
辅助数据库刷新操作历史记录:
select *
from table(information_schema.database_refresh_history(mydb1));
监控数据库复制成本¶
对于使用 数据库复制 进行复制的单个数据库,具有 ACCOUNTADMIN 角色的用户可以使用 Snowsight、Classic Console 或 SQL 查看指定日期范围内 Snowflake 账户传输的复制数据量(以字节为单位)。
要查看账户的数据传输量,请执行以下操作:
- Snowsight:
选择 Admin » Cost Management。
- Classic Console:
复制利用率显示为 Snowflake 提供的特殊仓库,名为
REPLICATION。选择 Data Transfer 以查看数据传输成本。请注意,Web 界面并不细分复制的数据传输成本。
- SQL:
查询以下任一内容:
DATABASE_REPLICATION_USAGE_HISTORY 表函数(在 Snowflake Information Schema 中)。此函数返回过去 14 天内的数据库复制使用活动。
DATABASE_REPLICATION_USAGE_HISTORY 视图 视图(在 Account Usage 中)。此视图返回过去 365 天(1 年)内的数据库复制使用活动。
可对 DATABASE_REPLICATION_USAGE_HISTORY 视图执行以下查询:
查询:复制成本历史记录(按天、按对象)
此查询提供复制数据库的完整列表,以及过去 30 天通过复制服务使用的 Credit(按天细分)。Credit 使用中的任何违规行为或持续高使用量都是需要进行进一步调查的标志。
SELECT TO_DATE(start_time) AS date, database_name, SUM(credits_used) AS credits_used FROM snowflake.account_usage.database_replication_usage_history WHERE start_time >= DATEADD(month,-1,CURRENT_TIMESTAMP()) GROUP BY 1,2 ORDER BY 3 DESC;查询:复制历史记录和 m 天平均值
此查询显示去年复制服务使用的 Credit 每日平均值(按周分组)。它可以帮助识别每日平均值的任何异常情况,以便您可以调查使用量的任何峰值或变化。
WITH credits_by_day AS ( SELECT TO_DATE(start_time) AS date, SUM(credits_used) AS credits_used FROM snowflake.account_usage.database_replication_usage_history WHERE start_time >= DATEADD(year,-1,CURRENT_TIMESTAMP()) GROUP BY 1 ORDER BY 2 DESC ) SELECT DATE_TRUNC('week',date), AVG(credits_used) AS avg_daily_credits FROM credits_by_day GROUP BY 1 ORDER BY 1;
比较主数据库和辅助数据库中的数据集¶
(可选)使用 HASH_AGG 函数比较主数据库和辅助数据库中随机一组表中的行,以验证数据一致性。HASH_AGG 函数返回输入行集合(无序)的汇总 64 位哈希值。在辅助数据库的所有或随机子集上查询此函数,并在主数据库上查询(截取主数据库快照的时间戳),然后比较输出。
示例¶
在辅助数据库上执行¶
在辅助数据库上,查询 DATABASE_REFRESH_PROGRESS 表函数(在 Snowflake Information Schema 中)。请注意,
DETAILS
列中的snapshot_transaction_timestamp
处于PRIMARY_UPLOADING_DATA
阶段。这是主数据库最新快照的时间戳。select parse_json(details)['snapshot_transaction_timestamp'] from table(information_schema.database_refresh_progress(mydb)) where phase_name = 'PRIMARY_UPLOADING_DATA';
查询指定表的 HASH_AGG 函数。以下查询会返回
mytable
表中所有行的哈希值:SELECT HASH_AGG( * ) FROM mytable;
在主数据库上执行¶
在主数据库中,针对同一个表查询 HASH_AGG 函数。使用 Time Travel,指定为辅助数据库拍摄最新快照时的时间戳:
SELECT HASH_AGG( * ) FROM mytable AT(TIMESTAMP => '<snapshot_transaction_timestamp>'::TIMESTAMP);
比较这两个查询的结果。输出应该是相同的。
删除辅助数据库¶
您可以随时使用 DROP DATABASE 命令删除辅助数据库。只有数据库所有者(即对数据库具有 OWNERSHIP 权限的角色)才能删除数据库。
删除主数据库¶
如果存在主数据库的一个或多个副本(即辅助数据库),则无法删除该数据库。若要删除主数据库,请先将辅助数据库提升为主数据库,然后删除以前的主数据库。或者,删除主数据库的所有辅助数据库,然后删除主数据库。
请注意,只有数据库所有者才能删除数据库。