本文介绍增量复制在 Microsoft Fabric 数据工厂中的复制作业中的工作原理。 它涵盖了支持的水印列类型,以及如何将增量复制重置为完整复制。
有关复制作业的概述,请参阅Microsoft Fabric 的数据工厂中的复制作业是什么?
复制模式(完整复制、增量复制)
可以选择将数据从源复制到目标的方式:
- 完整副本:每次运行作业时,都会将所有数据从源复制到目标。
- 增量复制:第一次运行将复制所有内容,后续运行仅移动自上次运行以来的新数据或更改的数据。
增量复制的工作原理
在增量复制中,在初始完整副本(称为“后续加载”)之后的每个运行仅传输某些更改。 复制作业会自动跟踪和管理上次成功运行的状态,因此它知道接下来要复制哪些数据。
- 当复制作业使用增量列(“水印列”)从数据库复制时,每个后续加载仅复制该列中的值大于以前复制的任何行的行。
- 当复制作业从已启用 CDC 的数据库中复制数据时,每次后续加载都会复制自上次成功运行以来插入、更新或删除的所有行。
- 复制作业复制文件时,每个后续加载仅复制自上次成功运行以来创建或修改的文件。
如果数据库启用了 CDC,则无需选择增量列 - 复制作业会自动检测更改。 查看 复制作业中的变更数据捕获(CDC)的更多详细信息。
如果复制作业失败,则无需担心数据丢失。 复制作业始终从上次成功运行结束时恢复。 失败不会更改由复制作业管理的状态。
何时使用 CDC 或者基于水印的增量复制
复制作业支持两种方法来检测数据库源中的更改:CDC 和基于水印的增量复制。 选择最适合您的源系统、数据模式和下游需求的选项。
何时使用 CDC
当 CDC 被认为是一个好的选择时:
- 源数据库已启用 CDC ,复制作业支持 CDC 与该连接器的集成。 有关支持的源列表,请参阅 复制作业中的“更改数据捕获”(CDC)。
- 需要同步删除操作,而不仅仅是插入和更新操作。 CDC 捕获删除事件,以便目标可以与源保持同步。
- 你希望将目标作为镜像副本,例如使用 SCD 类型 1(合并)写入行为,使目标与源保持连续同步。
- 需要对 目标处的更改进行历史跟踪。 复制作业中的 CDC 支持 SCD 类型 2,该类型保留每个记录的早期版本。
- 你想要将源上的负载降到最低。 CDC 从数据库的变更日志读取数据,而不是扫描源表中那些比水印更新的行,这对于高更改量的表可能更有效。
- 您的源没有可靠的增量列可以用作水印。
何时使用基于水印的增量复制
基于水印的增量复制在以下情况下非常适合:
- CDC 未启用或未 在源数据库上可用,或者由于权限、许可或源系统约束而无法启用它。
- 源表具有可靠的增量列 ,每当插入或更新行时,该列就会单调增加。 有关支持的类型,请参阅 支持的水印列类型。
- 只需跟踪插入和更新,而不需要删除。 基于水印的增量复制无法检测从源中删除的行。
- 您正在根据其上次修改日期复制文件。 基于文件的增量复制使用文件修改时间戳作为水印。
快速比较
| 注意事项 | CDC | 基于水印的增量复制 |
|---|---|---|
| 源先决条件 | 在源数据库上启用 CDC,并受复制作业连接器支持 | 在插入或更新时单调增加的列 |
| 检测插入 | 是的 | 是的 |
| 检测更新 | 是的 | 是(水印列更改时) |
| 检测删除 | 是的 | 否 |
| 典型的写入方法 | 合并或SCD类型2 | 追加或合并(配置时) |
如果数据库启用了 CDC,则无需选择增量列 - 复制作业会自动检测更改。 当源表未启用 CDC 时,复制作业将采用基于水印的增量复制方法。
支持的水印列类型
复制作业支持以下水印列类型,用于从数据库进行基于水印的增量复制:
- ROWVERSION:一个二进制列,每当行被修改时它会自动更改。 它非常适合使用高吞吐量事务工作负荷的基于 SQL 的系统,因为每次插入或更新都可靠地捕获,而无需依赖于应用程序管理的时间戳。
-
Datetime:日期/时间列,例如
LastUpdatedDatetime或ModifiedAt存储日期和时间。 复制作业使用精确的时间戳来跟踪运行中的增量进度。 当需要以高频率精确跟踪更改时,首选使用日期时间。 -
日期:仅限日期的列,例如
LastUpdatedDate。 由于日期值不包括时间组件,因此复制作业会自动应用过去一天的延迟提取,以确保运行之间没有数据丢失或重叠,从而安全地管理增量窗口。 日期字段适用于日常批处理。 - 字符串(解释为 datetime):可将其值解释为 datetime 的字符串列。 这样,即使时间戳存储为字符串,也无需转换列类型或更改源模式,即可使用增量复制。
- 整数:跟踪行更改的递增数字。
通过 Query 进行类型转换,将不受支持的列类型用作水印。
如果要用作水印的列不是受支持的类型之一,但其值实际上是可比的,则仍可以通过将其转换为复制作业的 查询 功能中受支持的类型来将其用于增量复制。 例如,varchar 仅存储数值的列(例如 "1001","1002" 等等)可以转换为整数类型。
配置源时,使用 “查询” 选项将列类型投影为受支持的类型(例如,将数字 varchar 转换为整数)。 然后,复制作业会将投影列视为受支持的类型,以便可以选择它作为增量列。
例如,如果 CustomerID 是 varchar 类型的列,并且该列存储整数值,则可以使用类似于下面的查询,使其可用作整数水印列:
SELECT
CAST(CustomerID AS INT) AS CustomerID,
Name,
LastUpdated
FROM dbo.Customers
然后选择投影 CustomerID 列作为增量列。
此方法仅在基础值可比较时有效,例如数值或存储为字符串的日期。 真正的字母数字值(如任意顺序混合字母和数字的 ID)不能用作水印列,因为这些值的比较方式不足以可靠地识别新行或更改的行。
如何处理水印列中的 NULL 值
基于水印的增量复制通过在多次运行中比较水印列中的值来检测新增或更改的行。 由于无法以这种方式比较 NULL 值,因此会按如下方式处理这些值:
- 初始完整加载:包括水印列中具有 NULL 值的行。 无论水印值如何,初始运行都会复制完整的数据集。
- 后续增量加载:排除水印列中具有 NULL 值的行。 仅复制那些水印值大于上次记录水印的行,并且 NULL 值无法满足这一比较条件。 因此,在初始加载后,任何被插入或更新为 NULL 水印值的行无法被后续的增量运行选取。
- 下拉列表中的列可用性:在“复制作业”中选择增量列时,对基于水印跟踪无效的列可能不会出现在下拉列表中。 请确保列类型是 受支持的水印列类型 之一,并且可供所使用的连接访问该列。
重置增量复制
你可以灵活地管理增量复制,包括能够在下次运行时将其重置回完整副本。 当源和目标之间存在数据差异时,这非常有用-只需让复制作业在下一次运行中执行完整副本即可解决此问题,然后继续执行增量更新。
可以按整个作业或按每个表重置增量复制,为您提供更细致的控制。 例如,可以重新复制较小的表,而不会影响较大的表。 这意味着更智能的故障排除、更少的中断和更高效的数据移动。
在某些情况下,编辑复制作业(例如更新源表中的增量列)时,复制作业会在下一次运行时将增量副本重置为完整副本。 这可确保源和目标之间的数据一致性。
了解重置行为
如果复制作业使用增量复制,Fabric 会维护内部状态(例如水印或检查点),以了解已处理的数据。
重置的作用
重置 会清除所选源的复制作业的增量状态(水印/检查点)。 重置后,下一个运行的行为类似于增量逻辑的初始运行(例如,它可以根据配置重新读取整个数据范围)。
重置不执行的操作
重置不会删除、截断或更改目标中的数据。 现有行保留在目标表或文件中。
为什么重置可能会创建重复项
如果重置并下一次运行读取以前加载的数据,结果取决于目标写入行为:
- 追加:可以再次写入以前加载的行,从而导致重复。
- 覆盖/合并/Upsert(如果已配置):由于现有数据可能被替换或匹配,因此减少了重复的风险,但确切的行为取决于目标和映射/键。
将 Reset 与 Append 配合使用时的最佳做法
如果必须使用 Append,并且还需要 重置:
- 在再次运行复制作业之前截断或清除目标表/数据(例如,删除现有行)。
- 清除目标后运行复制作业。
这可确保重新加载的数据不会堆叠在现有数据之上。