数据库复制注意事项¶
本主题描述了使用 数据库复制 时辅助数据库中某些 Snowflake 功能的行为。有关处理复制对象和数据的详细指导,请参阅 复制的注意事项。
备注
Snowflake 建议使用 账户复制功能 复制数据库。复制组和故障转移组 可启用多个数据库和其他账户对象的复制,并确保组中对象时间点的一致性。有关 功能可用性 和 受支持对象 的完整列表,请参阅 跨多个账户的复制和故障转移简介。
本主题内容:
数据库复制和安全对象¶
本节介绍了安全策略和密钥的数据库复制行为。
- 掩码和行访问策略:
如果满足以下任一条件,则复制操作会失败:
主数据库位于 Enterprise 版本的账户(或更高版本)中,包含策略/标签,但批准复制的一个或多个账户的版本较低。
主数据库中包含的对象可对其他数据库中的标签进行 悬空引用。
在 复制或故障转移组 中复制多个数据库时,可避免数据库复制的悬空引用。
- 基于标签的掩码策略:
如果满足以下任一条件,则复制操作会失败:
主数据库位于 Enterprise 版本的账户(或更高版本)中,包含策略/标签,但批准复制的一个或多个账户的版本较低。
主数据库中包含的对象可对其他数据库中的标签进行 悬空引用。
有关基于标签的掩码策略的更多信息,请参阅 基于标签的掩码策略。
- 密码、会话和身份验证策略:
如果满足以下任一条件,则复制操作会失败:
主数据库位于企业账户(或更高版本)中,包含策略,但批准复制的一个或多个账户的版本较低。
主数据库中包含的两个对象中的任何一个都附加到同一账户中的用户。在这种情况下,Snowflake 会使复制操作失败。
为避免由于引用用户而导致数据库复制操作失败,请改用 复制或故障转移组。
有关详细信息,请参阅 复制与安全策略。
- 密钥:
您无法使用 Database Replication 来复制密钥。使用副本或故障转移组复制密钥。有关详细信息,请参阅 复制和密钥。
悬空引用¶
引用其他数据库中的对象¶
仔细分析主数据库中的视图或表约束是否引用其他数据库中的对象。对于数据库对象,您可以在 Account Usage OBJECT_DEPENDENCIES 视图 中查看 对象相关性。
下表描述了数据库中的一个对象(引用对象)引用另一个数据库中的一个对象(被引用的对象)时的数据库复制行为:
引用的对象 |
受引用的对象 |
复制行为 |
---|---|---|
对象 |
成功 |
|
对象 |
失败 |
|
物化视图 |
失败 |
|
主键 |
失败 |
|
表 |
失败 |
|
已分配对象策略/标签 |
失败 |
|
对象 |
失败 |
非物化视图¶
非物化视图引用其他数据库(例如表列、其他视图、UDFs 或暂存区)中的对象,可以复制非物化视图,因为这类引用是基于名称的。基于名称的引用不会导致复制失败;但是,如果其他数据库未复制到同一区域,则无法对辅助数据库中的视图进行查询。
例如,假设数据库 d1
中的视图 v1
分别引用数据库 d1
和 d2
中的表 t1
和表 t2
。要成功查询辅助数据库 d1
中的 v1
,账户中还必须存在辅助数据库 d2
(例如,作为其他辅助数据库)。此外,为了与主数据库、辅助数据库 d1
和 d2
保持一致的查询结果,辅助数据库必须同时刷新。
物化视图¶
物化视图中的悬空引用可能会导致复制失败,并显示以下错误消息:
Dangling references in the snapshot. Correct the errors before refreshing again. The following references are missing (referred entity <- [referring entities])
在以下情况下,可能会出现悬空引用:
约束¶
当前,悬空外键会导致复制失败,并显示以下错误消息:
Dangling references in the snapshot. Correct the errors before refreshing again. The following references are missing
(referredentity <- [referring entities])
当主数据库中的外键引用其他数据库中的主键时,就会出现这种情况,反之亦然。那是因为约束引用是基于 ID 的。对数据库外部对象基于 ID 的引用,数据库快照无法对其进行解析。
要查看账户中的外键引用,请查询 Information Schema TABLE_CONSTRAINTS 视图 或 Account Usage TABLE_CONSTRAINTS 视图。
要解决此限制,请将两个数据库一起复制到同一个 复制或故障转移组 中。还可以将链接表存储在同一个数据库中。
序列¶
当前,悬空序列会导致复制失败,并显示以下错误消息:
Dangling references in the snapshot. Correct the errors before refreshing again. The following references are missing
(referred entity <- [referring entities])
当主数据库中的表引用其他数据库中的序列时,就会出现这种情况。那是因为序列引用基于 ID。对数据库外部对象基于 ID 的引用,数据库快照无法对其进行解析。
要解决此限制,请将两个数据库一起复制到同一个 复制或故障转移组 中。还可以在同一个数据库中引用序列。
引用已删除的对象¶
删除由同一个或另一个数据库中的另一个对象引用的对象,会导致悬空引用。当主数据库中的对象引用已删除的对象时,复制操作会失败,并显示以下错误消息:
Dangling references in the snapshot. Correct the errors before refreshing again. The following references are missing
(referred entity <- [referring entities])
要绕过此限制,建议完成以下 任一 步骤:
取消删除所引用的对象。
修改引用的对象(例如,使用 ALTER MATERIALIZED VIEW 修改物化视图)。要么引用其他对象,要么移除对已删除对象的引用。
如果主数据库引用已删除的对象,则删除主数据库中的所有对象。
复制多个数据库¶
当复制多个数据库时,数据库之间的时间点一致性不可用。每个主数据库的快照是独立创建的,对辅助数据库的更改是独立提交的。如果视图跨不同数据库中的表进行联合,或者依赖于跨数据库事务,则可能会出现问题。例如,以原子方式更新两个主数据库的事务,可能不会同时反映在辅助数据库中。
要在同一时间点复制多个数据库,请使用 复制或故障转移组。