将 Datastream 与现有 BigQuery 表搭配使用

本页面介绍了适用于以下用例的最佳实践:

  • 用户在 BigQuery 中已有表,并且需要使用变更数据捕获 (CDC) 将其数据复制到同一 BigQuery 表中。
  • 由于需要的时间或产品限制,用户需要在不使用 Datastream 回填功能的情况下将数据复制到现有 BigQuery 表中。

问题

使用 BigQuery Storage Write API 填充的 BigQuery 表不允许常规数据操纵语言 (DML) 操作。这意味着,一旦 CDC 流开始写入 BigQuery 表,便无法添加表中预先填充的历史数据。

请考虑以下场景:

  1. TIMESTAMP 1:启动表复制操作。
  2. 时间戳 2:在复制表时,源中的 DML 操作会导致数据更改(添加、更新或移除行)。
  3. 时间戳 3:CDC 已启动,系统未捕获时间戳 2 中发生的更改,从而导致数据差异。

解决方案

为了确保数据完整性,CDC 流程必须捕获从上次复制到 BigQuery 表的上次更新后立即在来源中发生的所有更改。

通过下面的解决方案,您可以确保 CDC 进程捕获 TIMESTAMP 2 的所有更改,而不会阻止复制操作将数据写入 BigQuery 表。

前提条件

  • BigQuery 中的目标表的架构和配置必须与 Datastream 创建该表时完全相同。您可以使用 Datastream BigQuery 迁移工具包来完成此操作。
  • 对于 MySQL 和 Oracle 源,用户必须能够在复制操作启动时确定日志位置。
  • 数据库必须具有足够的存储空间和日志保留政策,才能完成表复制过程。

MySQL 和 Oracle 来源

  1. 创建要用于持续进行 CDC 复制的流,但不启动该流。数据流需要处于 CREATED 状态。
  2. 当您准备好开始复制表操作时,确定数据库的当前日志位置:
    • 对于 MySQL,请参阅 MySQL 文档,了解如何获取复制二进制日志坐标。确定日志位置后,关闭会话以释放对数据库的所有锁定。
    • 对于 Oracle,请运行以下查询:SELECT current_scn FROM V$DATABASE
  3. 将源数据库中的表复制到 BigQuery 中。
  4. 完成复制操作后,按照管理数据流页面中所述的步骤,从您之前指定的日志位置启动数据流。

PostgreSQL 来源

  1. 准备好开始复制表后,请创建复制槽。如需了解详情,请参阅配置源 PostgreSQL 数据库
  2. 将源数据库中的表复制到 BigQuery 中。
  3. 完成复制操作后,创建并启动数据流。