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

本页面包含以下信息:

  • Datastream 如何处理从来源 SQL Server 数据库中拉取的数据的行为。
  • Datastream 支持的变更数据捕获 (CDC) 方法。
  • Datastream 支持的 SQL Server 数据库版本。
  • 将 SQL Server 数据库用作来源的已知限制。

行为

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. 字段中,输入 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 支持所有 SQL Server 排序规则,但代码页为 0 的排序规则除外。如需检查特定排序规则的代码页,请在 SQL Server 实例上运行以下查询:

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

    • SQL_VARIANT
    • HIERARCHYID
    • GEOMETRY
    • GEOGRAPHY
  • Datastream 会复制用户定义的数据类型,但存储在目标中的是您从中派生用户定义类型的基本数据类型。例如,如果您根据 VARCHAR(50) 数据类型定义 USERNAME 数据类型,则数据在目标中存储为 VARCHAR(50)

  • 对于没有唯一 索引的表中的大型对象列(TEXT NTEXTXMLIMAGE)和最大可变长度列 (VARCHAR(MAX)VARBINARY(MAX)NVARCHAR(MAX)),Datastream 不支持 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 不会复制使用 WRITETEXTUPDATETEXT 语句进行的更改。

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

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

  • Datastream 不支持 PAGECOLUMNSTORECOLUMNSTORE ARCHIVE 压缩类型。

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

如果您使用事务日志 CDC 方法,则适用以下其他限制:

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

    • 没有唯一索引的表
    • 仅包含一个唯一非聚簇索引且具有一个或多个 可变长度列(VARCHARVARBINARYNVARCHAR)的表

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

后续步骤