从 SQL Server 数据库中流式传输数据

为了使分析和下游数据库保持同步,您可以使用 Datastream 复制 SQL Server 数据库中的历史数据和持续更改。

对于 Datastream 中的 SQL Server 来源,请查看复制行为和变更数据捕获 (CDC) 方法、支持的版本和版本以及已知限制。

行为

Datastream 使用以下 CDC 方法之一跟踪数据操纵语言 (DML) 更改:

变更表

与事务日志方法相比,更改表 CDC 方法可让用户在更短的时间内保留日志,从而节省存储空间,但支持的吞吐量较低。此方法的限制比事务日志少。例如,它消除了日志截断导致数据流永久失败的风险,并支持复制加密表。如需了解详情,请参阅已知限制。

使用此 CDC 方法时,系统会使用专用变更表跟踪对来源的更改。事务日志仍会使用,但使用范围有限,您无需长时间保留这些日志。当 DML 事件应用于源表时,更改会复制到相应的更改表。变更表的结构与源表相同,但包含额外的列来存储变更的元数据。只有已提交的事务才会添加到更改表中,同时还会添加提交操作的日志序列号 (LSN)。

Datastream 如何处理对源架构的 DDL 更改

使用变更表 CDC 方法时,系统会为每个变更表创建捕获实例。每个捕获实例都与它捕获和跟踪的列列表相关联。默认情况下,如果在创建捕获实例后源中发生数据定义语言 (DDL) 更改,则实例会忽略该更改。不过,您可以将 SQL Server 流配置为复制在创建流和捕获实例后添加到源架构的列。

准备工作
  • 确保您的 Datastream 用户已分配 db_owner 权限。

复制添加到源架构中的列

如需让 Datastream 支持复制在创建数据流后添加到源架构的列,您需要向数据流添加 enable_ddl_support_for_ct 标签:

  1. 前往 Google Cloud 控制台中的数据流页面。

    转到“数据流”页面

  2. 点击要修改的 SQL Server 数据流。

  3. 在数据流详情页面上,点击暂停。

  4. 依次点击修改 > 修改直播设置。

  5. 点击添加标签。

  6. 在键字段中,输入 enable_ddl_support_for_ct。

  7. 在值 (Value) 字段中,输入 true。

  8. 点击保存。

  9. 点击开始即可继续直播。

Datastream 每 5 分钟检查一次 cdc.ddl_history 表中是否有新的 DDL。如果向数据流配置中包含的表添加了新列,Datastream 会验证该表是否具有两个捕获实例:

  • 如果没有,Datastream 会创建一个新的捕获实例,读取原始捕获实例数据,直到发生 DDL 的时刻,然后开始从新的捕获实例中读取。

  • 如果达到上限,系统会添加一条日志条目,指出由于已达到捕获实例数上限,因此无法处理 DDL 更改。

事务日志

使用此 CDC 方法时,Datastream 会直接从事务日志中读取源中的更改。此方法需要的资源较少,数据检索速度更快,但限制较多。

为防止数据丢失,请务必确保在 Datastream 读取日志之前,日志不会被截断。另一方面,如果您将日志文件保留太长时间,它们会占用存储空间,最终可能会导致数据库实例进入只读模式。

为确保 CDC 读取器有足够的时间读取日志,同时允许日志截断以释放存储空间,您需要应用其他配置步骤,例如更改轮询间隔和设置截断保护措施。这些步骤提供了额外的保护层,可确保即使 Datastream 端出现停机或源数据库与 Datastream 之间存在连接问题,Datastream 也能读取数据。

如需详细了解如何应用这些额外措施,请参阅配置源 SQL Server 数据库页面,并选择您的数据库类型。

版本

Datastream 支持以下版本和版本的 SQL Server 数据库:

  • 自行管理(本地或云托管),使用以下版本:
    • 企业版:2008 及更高版本
    • 标准版:2016 SP1 及更高版本
    • 开发者:2008 年及之后
  • Amazon RDS for SQL Server
  • Azure SQL 数据库(S3 层级及以上)。

  • Cloud SQL for SQL Server

Datastream 不支持以下版本的 SQL Server 数据库:

  • SQL Server Standard 版本(2008 至 2014 版)
  • SQL Server Express
  • SQL Server Web

已知限制

将 SQL Server 数据库用作来源时的已知限制包括:

  • 数据流限 10,000 个表。
  • 除非满足以下条件,否则无法回填行数超过 5 亿的表:
    1. 该表具有唯一索引。
    2. 所有索引列都不可为 null。
    3. 索引的所有列都会包含在数据流中。
  • 不支持启用了延迟耐用性或加速数据库恢复 (ADR) 的数据库。
  • 不支持流式传输对系统表的更改。
  • 不支持 Windows Active Directory (AD) 身份验证。
  • Datastream 支持除代码页为 0 的排序规则之外的所有 SQL Server 排序规则。如需检查特定排序规则的代码页,请在 SQL Server 实例上运行以下查询:

    SELECT *, CAST(COLLATIONPROPERTY(name, 'CodePage') AS INT) FROM sys.fn_helpcollations() WHERE name = COLLATION_NAME;
    
  • 以下数据类型不受支持,不会复制到目标位置:

    • SQL_VARIANT
    • HIERARCHYID
  • Datastream 会复制用户定义的数据类型,但存储在目标位置的是派生用户定义类型的基础数据类型。例如,如果您根据 VARCHAR(50) 数据类型定义 USERNAME 数据类型,则数据会以 VARCHAR(50) 形式存储在目标位置。

  • Datastream 不支持对没有唯一索引的表中的大型对象列(TEXT、NTEXT、XML、IMAGE、GEOMETRY、GEOGRAPHY)和最大可变长度列(VARCHAR(MAX)、VARBINARY(MAX)、NVARCHAR(MAX))进行 CDC。

    如果数据流中不包含大型对象列,则支持 CDC。

  • 使用变更表 CDC 方法时,不支持复制以下源架构更改,并且可能会导致数据损坏或无法处理事件:

    • 删除列:这些列中的数据会被替换为 NULL 值。
    • 重命名列:启用 CDC 时,SQL Server 不支持此操作。
    • 修改数据类型:SQL Server CDC 捕获作业仅传播以下数据类型更改:

      • 更改字符串的最大长度:例如,将 VARCHAR(50) 数据类型更改为 VARCHAR(100)。BigQuery STRING 列没有固定长度,并且接受较长的字符串。
      • 增加整数值范围:例如,将 INT 数据类型更改为 BIGINT。BigQuery INT64 数据类型可容纳新类型,而无需更改架构。
      • 更改数值的精度和标度:例如,将 DECIMAL(10, 2) 数据类型更改为 DECIMAL(18, 4)。BigQuery NUMERIC 类型具有较大的固定精度 (38) 和标度 (9),并且支持此类更改。

      对于其他数据类型修改,Datastream 会尝试将数据插入到目标位置,如果数据被拒绝,则会引发错误。

  • Datastream 不支持复制包含数据遮盖列的表。数据在复制时不会进行遮盖。

  • Datastream 不支持复制使用数据层应用软件包 (DACPAC) 软件包应用于数据库的更改。

  • Datastream 不会复制使用 WRITETEXT 或 UPDATETEXT 语句所做的更改。

  • 如果您使用 enable_ddl_support_for_ct 标签来复制添加到源架构的列,则不能将多个数据流附加到同一 SQL Server 源表。由于 SQL Server 支持每个表最多两个捕获实例,因此架构更改可能会导致 Datastream 尝试创建捕获实例时出现竞态条件,这可能会导致数据流失败。

  • Datastream 不支持复制计算列,除非该列标记为 PERSISTED。

  • Datastream 不支持 PAGE、COLUMNSTORE 或 COLUMNSTORE ARCHIVE 压缩类型。

使用事务日志方法时的其他限制

如果您使用事务日志 CDC 方法,则还需遵循以下额外限制:

  • 不支持透明数据加密 (TDE)。
  • 不支持列级加密。这些列中的数据会被替换为 NULL 值。
  • 使用事务日志 CDC 方法时,Datastream 不支持复制在创建数据流后添加到源架构中的列。新列不会复制到目标位置。
  • Datastream 不支持 ROLLBACK TO SAVEPOINT 语句。 此类回滚事件会被忽略,不会复制到目标位置。
  • Datastream 不支持在以下类型的表中对大于 8 KB 的行进行 CDC:
    • 没有唯一索引的表
    • 仅包含一个唯一非聚簇索引且具有一个或多个可变长度列(VARCHAR、VARBINARY、NVARCHAR、GEOMETRY、GEOGRAPHY)的表
  • Datastream 不支持在以下类型的表中对大型对象列(TEXT、NTEXT、XML、IMAGE、GEOMETRY、GEOGRAPHY)进行 CDC:

    • 没有唯一索引的表
    • 仅包含一个唯一非聚簇索引且具有一个或多个可变长度列(VARCHAR、VARBINARY、NVARCHAR、GEOMETRY、GEOGRAPHY)的表

    如果数据流中不包含大型对象列,则仅当此类表具有有效索引时,才支持 CDC。

  • 使用事务日志方法时,Datastream 会查询源数据库,以在称为“补充”的主动查找过程中提取时间点缺失值。补充适用于 XML、TEXT、NTEXT、IMAGE、GEOMETRY 和 GEOGRAPHY 数据类型,以及当行超出 8 KB 页面限制时适用于可变长度类型(例如 VARCHAR(MAX) 或 VARBINARY)。由于 Datastream 通过查询数据库来补充这些列,因此在涉及快速、连续更新或插入后快速删除的场景中,可能无法捕获中间更改。DELETE 操作不会触发补充。使用仅附加写入模式时,此限制尤为明显,因为该模式要求捕获所有中间更改。

后续步骤