本页介绍了适用于以下使用情形的最佳实践:
- 用户在 BigQuery 中有一个现有表,需要使用变更数据捕获 (CDC) 将其数据复制到同一 BigQuery 表中。
- 用户需要将数据复制到现有 BigQuery 表中,而无需使用 Datastream 回填功能,这可能是因为回填需要花费的时间或产品限制。
问题
使用 BigQuery Storage Write API 填充的 BigQuery 表不允许执行常规数据操纵语言 (DML) 操作。这意味着,CDC 流开始写入 BigQuery 表后,便无法再添加尚未预先填充到表中的历史数据。
请考虑以下场景:
- TIMESTAMP 1:启动表复制操作。
- TIMESTAMP 2:在复制表时,源端的 DML 操作会导致数据发生更改(添加、更新或移除行)。
- TIMESTAMP 3:CDC 已启动,但未捕获 TIMESTAMP 2 中发生的更改,导致数据不一致。
解决方案
为确保数据完整性,CDC 进程必须捕获自上次更新(已复制到 BigQuery 表中)之后立即发生的源中所有更改。
通过以下解决方案,您可以确保 CDC 进程捕获 TIMESTAMP 2 之后的所有更改,而不会阻止复制操作将数据写入 BigQuery 表。
前提条件
- BigQuery 中的目标表必须具有与由 Datastream 创建的表完全相同的架构和配置。您可以使用 Datastream BigQuery 迁移工具包来实现此目的。
- 对于 MySQL 和 Oracle 来源,用户必须能够在启动复制操作时识别日志位置。
- 数据库必须有足够的存储空间和日志保留政策,才能完成表复制流程。
MySQL 和 Oracle 来源
- 创建您打算用于持续 CDC 复制的数据流,但不要启动该数据流。数据流需要处于已创建状态。
- 准备好开始表复制操作后,请确定数据库的当前日志位置:
- 对于 MySQL,请参阅 MySQL 文档,了解如何获取复制二进制日志坐标。确定日志位置后,关闭会话以释放数据库上的所有锁定。
- 对于 Oracle,请运行以下查询:
SELECT current_scn FROM V$DATABASE
- 将表从源数据库复制到 BigQuery。
- 复制操作完成后,请按照管理数据流页面中所述的步骤,从您之前标识的日志位置开始流式传输。
PostgreSQL 来源
- 准备好开始复制表时,请创建复制槽。如需了解详情,请参阅配置源 PostgreSQL 数据库。
- 将表从源数据库复制到 BigQuery。
- 复制操作完成后,创建并启动数据流。