创建和管理变更数据流

本页面介绍了如何创建、修改和查看 Spanner 更改 。如需详细了解变更数据流,请参阅变更数据流简介

由于变更数据流是架构对象,因此您可以创建和管理变更流 采用由 DDL 驱动的相同架构 用于任何其他类型的更新 数据库定义工作,例如创建表或添加索引。

Spanner 启动了长时间运行的时间 操作后 提交一个架构更改 DDL 语句 更改或删除变更数据流新增或更改的变更数据流将 开始观察新配置指定的列或表 会在此长时间运行的操作完成后触发

创建变更流

如需创建变更数据流,您需要提供其名称和架构 可以是整个数据库,也可以是一系列 表格和列。您可以选择指定以下内容:

GoogleSQL

使用 GoogleSQL 创建变更数据流的 DDL 语法如下所示: 如下所示:

CREATE CHANGE STREAM change_stream_name
  [FOR column_or_table_watching_definition[, ... ] ]
  [
    OPTIONS (
      retention_period = timespan,
      value_capture_type = type,
      exclude_ttl_deletes = boolean,
      exclude_insert = boolean,
      exclude_update = boolean,
      exclude_delete = boolean
    )
  ]

PostgreSQL

使用 PostgreSQL 创建变更流的 DDL 语法类似于 如下所示:

CREATE CHANGE STREAM change_stream_name
  [FOR column_or_table_watching_definition[, ... ] ]
  [
    WITH (
      retention_period = timespan,
      value_capture_type = type,
      exclude_ttl_deletes = boolean,
      exclude_insert = boolean,
      exclude_update = boolean,
      exclude_delete = boolean
    )
  ]

新的变更数据流一旦开始监控其分配的架构对象, 创建该查询的长时间运行的操作完成。

以下示例说明了如何使用 各种配置

监控整个数据库

创建变更数据流以监控执行的所有数据更改 在整个数据库表中,使用 ALL 关键字:

CREATE CHANGE STREAM EverythingStream
FOR ALL;

ALL 配置隐式 包含数据库的所有未来数据 立即使用这些表格和列它 包含视图、信息架构表或 常规数据表之外的其他对象。

查看特定表

将变更数据流的范围限定为特定表 而不是整个数据库,请指定由一个或多个 表:

CREATE CHANGE STREAM SingerAlbumStream
FOR Singers, Albums;

Spanner 自动更新更改 监控整个表,以反映任何影响架构更改的数据流 例如添加或删除的列。

查看特定列

使用 table(column_1[, column_2, ...]) 语法观察一个或多个特定更改 您命名的表中的非键列:

CREATE CHANGE STREAM NamesAndTitles
FOR Singers(FirstName, LastName), Albums(Title);

您无法在此处指定主键列,因为每个变更数据流 “always”会跟踪其所监控的每个表的主键。这样, 以便通过主键标识已更改的行。

在单个数据流中监控表和列

您可以将前两个示例中的表观察和列观察语法合并到一个变更数据流中:

CREATE CHANGE STREAM NamesAndAlbums
FOR Singers(FirstName, LastName), Albums;

指定更长的保留期限

指定变更数据流数据保留期限 长于默认的期限(一天),请将retention_period设置为周期 最多一周,以小时 (h) 或天 (d) 的形式表示。

两个示例:

GoogleSQL

CREATE CHANGE STREAM LongerDataRetention
FOR ALL
OPTIONS ( retention_period = '36h' );
CREATE CHANGE STREAM MaximumDataRetention
FOR ALL
OPTIONS ( retention_period = '7d' );

PostgreSQL

CREATE CHANGE STREAM LongerDataRetention
FOR ALL
WITH ( retention_period = '36h' );
CREATE CHANGE STREAM MaximumDataRetention
FOR ALL
WITH ( retention_period = '7d' );

指定其他值捕获类型

指定变更数据流值捕获类型value_capture_type 设置为 OLD_AND_NEW_VALUES 以外的任何一项, NEW_VALUESNEW_ROW,如以下示例所示:

GoogleSQL

CREATE CHANGE STREAM NewRowChangeStream
FOR ALL
OPTIONS ( value_capture_type = 'NEW_ROW' );
CREATE CHANGE STREAM NewValuesChangeStream
FOR ALL
OPTIONS ( value_capture_type = 'NEW_VALUES' );

PostgreSQL

CREATE CHANGE STREAM NewRowChangeStream
FOR ALL
WITH ( value_capture_type = 'NEW_ROW' );
CREATE CHANGE STREAM NewValuesChangeStream
FOR ALL
WITH ( value_capture_type = 'NEW_VALUES' );

过滤基于 TTL 的删除操作

您可以过滤基于 TTL 的删除操作 使用 exclude_ttl_deletes 过滤条件从变更数据流的范围中移除。

有关此过滤器工作方式的详细信息,请参阅 基于存留时间的删除过滤条件

GoogleSQL

如需使用基于 TTL 的删除过滤条件创建变更数据流,请使用以下命令:

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
OPTIONS (exclude_ttl_deletes = true)

替换以下内容:

  • CHANGE_STREAM_NAME:新实例的名称 变更数据流

以下示例会创建一个名为 NewFilterChangeStream 的变更数据流 (排除所有基于 TTL 的删除):

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
OPTIONS (exclude_ttl_deletes = true)

PostgreSQL

如需使用基于 TTL 的删除过滤条件创建变更数据流,请使用以下命令:

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
WITH (exclude_ttl_deletes = true)

替换以下内容:

  • STREAM_NAME:新实例的名称 变更数据流

以下示例会创建一个名为 NewFilterChangeStream 的变更数据流 (排除所有基于 TTL 的删除):

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
WITH (exclude_ttl_deletes = true)

如需在现有过滤器中添加或移除基于 TTL 的删除过滤器,请执行以下操作: 请参阅修改基于 TTL 的删除过滤条件。 您可以通过以下方式确认变更数据流过滤条件: 以 DDL 形式查看变更数据流的定义

按表修改类型过滤

从您的 使用以下可用的过滤条件选项更改数据流的范围:

  • exclude_insert:排除所有 INSERT 表修改
  • exclude_update:排除所有 UPDATE 表修改
  • exclude_delete:排除所有 DELETE 表修改

有关这些过滤器工作方式的详细信息,请参阅 表修改类型过滤条件

GoogleSQL

创建具有一个或多个表修改类型的变更数据流 过滤器,请使用以下代码:

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
OPTIONS (MOD_TYPE_FILTER_NAME = true)

替换以下内容:

  • CHANGE_STREAM_NAME:新实例的名称 变更数据流
  • MOD_TYPE_FILTER_NAME:您 要添加:exclude_insertexclude_updateexclude_delete。 如果一次添加多个过滤条件,请使用英文逗号分隔每个过滤条件。

以下示例会创建一个名为 NewFilterChangeStream 的变更数据流 排除 INSERTUPDATE 表修改类型:

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
OPTIONS (exclude_insert = true, exclude_update = true)

PostgreSQL

创建具有一个或多个表修改类型的变更数据流 过滤器,请使用以下代码:

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
WITH (MOD_TYPE_FILTER_NAME = true)

替换以下内容:

  • CHANGE_STREAM_NAME:现有资源的名称 变更数据流
  • MOD_TYPE_FILTER_NAME:您 要添加:exclude_insertexclude_updateexclude_delete。 如果一次添加多个过滤条件,请使用英文逗号分隔每个过滤条件。

以下示例会创建一个名为 NewFilterChangeStream 的变更数据流 (不包括 INSERTUPDATE 表修改) 交易类型:

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
WITH (exclude_insert = true, exclude_update = true)

如需在现有过滤条件中添加或移除表修改类型过滤条件,请执行以下操作: 请参阅按表修改类型修改过滤器。 您可以确认您的数据表存在哪些表修改类型过滤条件 更改数据流依据 以 DDL 形式查看变更数据流的定义

修改变更数据流

如需修改变更数据流的配置,请使用 ALTER CHANGE STREAM DDL 声明。它使用的语法与 CREATE CHANGE STREAM 类似。您可以 更改数据流所监控的列或其数据长度 保留期限。你还可以暂停观看 并保留其数据更改记录。

修改变更数据流所监控的内容

此示例将整个 Songs 表添加到 NamesAndAlbums 中, 之前配置的变更数据流:

ALTER CHANGE STREAM NamesAndAlbums
SET FOR Singers(FirstName, LastName), Albums, Songs;

Spanner 会将已命名变更数据流的行为替换为 长时间运行的操作完成后的新配置 用于更新数据库的 架构。

修改变更数据流的数据保留期限

修改变更数据流保留其内部数据流的时间长度 记录,请在 ALTER CHANGE STREAM DDL 语句中设置 retention_period

此示例根据 NamesAndAlbums 调整数据保留期限 之前创建的变更数据流:

GoogleSQL

ALTER CHANGE STREAM NamesAndAlbums
SET OPTIONS ( retention_period = '36h' );

PostgreSQL

ALTER CHANGE STREAM NamesAndAlbums
SET ( retention_period = '36h' );

修改变更数据流的值捕获类型

如需修改变更数据流的值捕获类型,请将 ALTER CHANGE STREAM DDL 语句中的 value_capture_type 子句。

此示例将值捕获类型调整为 NEW_VALUES

GoogleSQL

ALTER CHANGE STREAM NamesAndAlbums
SET OPTIONS ( value_capture_type = 'NEW_VALUES' );

PostgreSQL

ALTER CHANGE STREAM NamesAndAlbums
SET ( value_capture_type = 'NEW_VALUES' );

修改基于 TTL 的删除过滤条件

针对某项更改修改基于 TTL 的删除过滤条件 数据流,请在 ALTER CHANGE STREAM DDL 中设置 exclude_ttl_deletes 过滤条件 声明。你可以在此菜单中添加或移除过滤条件 变更数据流

有关这些过滤器工作方式的详细信息,请参阅 基于存留时间的删除过滤条件

将基于 TTL 的删除过滤条件添加到现有变更数据流

GoogleSQL

如需将基于 TTL 的删除过滤条件添加到现有变更数据流,请执行以下操作: 请使用以下命令将过滤条件设置为 true

ALTER CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
SET OPTIONS (exclude_ttl_deletes = true)

替换以下内容:

  • CHANGE_STREAM_NAME:现有资源的名称 变更数据流

在以下示例中,exclude_ttl_deletes 过滤条件已添加到 名为“NewFilterChangeStream”的现有变更数据流: (排除所有基于 TTL 的删除):

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET OPTIONS (exclude_ttl_deletes = true)

这会从变更数据流中排除所有基于 TTL 的删除操作。

PostgreSQL

如需将基于 TTL 的删除过滤条件添加到现有变更数据流,请执行以下操作: 请使用以下命令将过滤条件设置为 True

ALTER CHANGE STREAM STREAM_NAME FOR ALL
SET (exclude_ttl_deletes = true)

替换以下内容:

  • STREAM_NAME:现有资源的名称 变更数据流

在以下示例中,exclude_ttl_deletes 过滤条件已添加到 名为“NewFilterChangeStream”的现有变更数据流:

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET (exclude_ttl_deletes = true)

这会从变更数据流中排除将来所有基于 TTL 的删除操作。

从现有变更数据流中移除基于 TTL 的删除过滤条件

GoogleSQL

如需为现有变更数据流移除基于 TTL 的删除过滤条件,请执行以下操作: 请使用以下命令将过滤条件设置为 False

ALTER CHANGE STREAM STREAM_NAME FOR ALL
SET OPTIONS (exclude_ttl_deletes = false)

替换以下内容:

  • STREAM_NAME:新实例的名称 变更数据流

在以下示例中,exclude_ttl_deletes 过滤条件已从 名为“NewFilterChangeStream”的现有变更数据流:

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET OPTIONS (exclude_ttl_deletes = false)

这包括将来对变更数据流进行的所有基于 TTL 的删除操作。

您还可以将过滤条件设置为 null,以移除基于 TTL 的删除过滤条件。

PostgreSQL

如需为现有变更数据流移除基于 TTL 的删除过滤条件,请执行以下操作: 请使用以下命令将过滤条件设置为 False

ALTER CHANGE STREAM STREAM_NAME FOR ALL
SET (exclude_ttl_deletes = false)

替换以下内容:

  • STREAM_NAME:新实例的名称 变更数据流

在以下示例中,exclude_ttl_deletes 过滤条件已从 名为“NewFilterChangeStream”的现有变更数据流:

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET (exclude_ttl_deletes = false)

这包括将来对变更数据流进行的所有基于 TTL 的删除操作。

您还可以将过滤条件设置为 null,以移除基于 TTL 的删除过滤条件。

按表修改类型修改过滤条件

如需修改变更数据流的表修改类型过滤条件,请执行以下操作: 在 ALTER CHANGE STREAM DDL 语句中设置过滤条件类型。您可以使用 向变更数据流添加新过滤条件或从中移除现有过滤条件。

向现有变更数据流添加表修改类型过滤条件

GoogleSQL

向现有表格添加一个或多个新的表格修改类型过滤条件 变更数据流,请使用以下命令将过滤条件设置为 true

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET OPTIONS (MOD_TYPE_FILTER_NAME = true)

替换以下内容:

  • CHANGE_STREAM_NAME:替换为您现有名称 变更数据流
  • MOD_TYPE_FILTER_NAME:请替换为您所用的过滤条件 要添加:exclude_insertexclude_updateexclude_delete。 如果一次添加多个过滤条件,请使用英文逗号分隔每个过滤条件。

在以下示例中,exclude_delete 过滤条件已添加到 名为 NewFilterChangeStream 的变更数据流:

ALTER CHANGE STREAM NewFilterChangeStream
SET OPTIONS (exclude_delete = true)

PostgreSQL

向现有表格添加一个或多个新的表格修改类型过滤条件 变更数据流,请使用以下命令将过滤条件设置为 true

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET (MOD_TYPE_FILTER_NAME = true)

替换以下内容:

  • CHANGE_STREAM_NAME:替换为您现有名称 变更数据流
  • MOD_TYPE_FILTER_NAME:请替换为您所用的过滤条件 要添加:exclude_insertexclude_updateexclude_delete。 如果一次添加多个过滤条件,请使用英文逗号分隔每个过滤条件。

在以下示例中,exclude_delete 过滤条件已添加到 名为 NewFilterChangeStream 的变更数据流:

ALTER CHANGE STREAM NewFilterChangeStream
SET (exclude_delete = true)

从现有变更数据流中移除表修改类型过滤条件

GoogleSQL

要移除一个或多个现有的表修改类型过滤条件,请执行以下操作: 变更数据流,请使用以下命令将过滤条件设置为 false

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET OPTIONS (MOD_TYPE_FILTER_NAME = false)

替换以下内容:

  • CHANGE_STREAM_NAME:替换为您现有名称 变更数据流
  • MOD_TYPE_FILTER_NAME:请替换为您所用的过滤条件 要移除的内容:exclude_insertexclude_updateexclude_delete。 如果一次移除多个过滤条件,请使用英文逗号分隔各个过滤条件。

在以下示例中,exclude_delete 过滤条件已从现有 名为 NewFilterChangeStream 的变更数据流:

ALTER CHANGE STREAM NewFilterChangeStream
SET OPTIONS (exclude_delete = false)

您还可以通过设置过滤条件来移除表格修改过滤条件 还原为默认值。为此,请将过滤条件值设置为 null

PostgreSQL

要移除一个或多个现有的表修改类型过滤条件,请执行以下操作: 变更数据流,请使用以下命令将过滤条件设置为 False

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET (MOD_TYPE_FILTER_NAME = false)

替换以下内容:

  • CHANGE_STREAM_NAME:替换为您现有名称 变更数据流
  • MOD_TYPE_FILTER_NAME:请替换为您所用的过滤条件 要添加:exclude_insertexclude_updateexclude_delete。 如果一次添加多个过滤条件,请使用英文逗号分隔每个过滤条件。

在以下示例中,exclude_delete 过滤条件已从现有 名为 NewFilterChangeStream 的变更数据流:

ALTER CHANGE STREAM NewFilterChangeStream
SET (exclude_delete = false)

您还可以通过设置过滤条件来移除表格修改过滤条件 还原为默认值。为此,请将过滤条件值设置为 null

暂停变更数据流

如果您希望变更数据流停止其活动,但保留其 内部记录(至少在数据保留期限内), 可以改变它,使其什么都不看

为此,可发出一个 ALTER CHANGE STREAM DDL 语句来替换 使用特殊短语 DROP FOR ALL 替换变更数据流的定义。 例如:

ALTER CHANGE STREAM MyStream DROP FOR ALL;

该数据流继续存在于数据库中,但不会观察任何对象, 并且不会生成更多数据变更记录。其现有更改 记录完好无损,但受数据流的数据保留政策的约束。

如需恢复已暂停的数据流,请再发出一个 ALTER CHANGE STREAM 语句与其之前的配置相关联。

删除变更数据流

如需永久删除变更数据流,请发出 DROP CHANGE STREAM 包含流名称的语句:

DROP CHANGE STREAM NamesAndAlbums;

Spanner 立即停止数据流,并将其从 数据库架构,并删除其数据变更记录。

列出和查看变更数据流

Google Cloud 控制台提供了一个网页界面,用于列出和 查看数据库的变更数据流定义。您还可以查看 变更数据流的结构作为其等效 DDL 语句,或通过 查询数据库的信息架构。

使用 Google Cloud 控制台查看变更数据流

如需查看数据库的变更数据流列表并查看其定义,请执行以下操作:

  1. 访问 Google Cloud 控制台的 Spanner 实例页面。

    打开实例页面

  2. 前往相应的实例和数据库。

  3. 点击导航菜单中的变更数据流

系统会显示该数据库的所有变更数据流列表,以及 汇总了各条规则的配置信息。点击数据流的名称 会显示有关所监控的表和列的更多详细信息。

以 DDL 形式查看变更数据流的定义

以 DDL 的形式查看数据库的架构,包含其所有 变更数据流,在变更数据流中显示为 CREATE CHANGE STREAM 语句。

  • 如需从控制台执行此操作,请在以下位置点击显示等效 DDL 链接: Google Cloud 控制台中的数据库页面。

  • 要从命令行执行此操作,请使用 ddl describe 命令 Google Cloud CLI

查询有关变更数据流的信息架构

您可以直接查询数据库的信息 架构。通过 下表包含定义变更数据流的元数据 他们监控的表和列,以及他们的保留期限 周期:

变更数据流最佳实践

以下是配置和管理变更的一些最佳实践 。

考虑使用单独的元数据数据库

变更数据流使用元数据数据库来维护内部状态。 元数据数据库可以与之前创建的数据库 包含变更数据流我们建议您为 元数据存储。

Spanner 变更数据流连接器需要读写 对元数据数据库的权限。您无需为此准备 具有架构的数据库连接器会负责完成这项工作

使用单独的元数据数据库可消除可能出现的复杂性 允许该连接器直接写入您的应用数据库:

  • 通过将元数据数据库与 包含变更数据流的生产数据库,连接器只需 对生产数据库的读取权限。

  • 将连接器的流量限制为单独的元数据 连接器本身执行的写入不包括在内 部署变更数据流这对于变更数据流非常有用 监控整个数据库

如果未使用单独的数据库来存储元数据,我们建议 监控变更数据流连接器对其实例的 CPU 影响。

对新的变更数据流进行基准测试,并根据需要调整大小

在向生产实例添加新的变更数据流之前,请考虑以下事项: 通过更改对预演实例上的实际工作负载进行基准测试 视频流。这样你就可以确定是否需要向 以增加其计算和存储空间 容量。

运行这些测试,直到 CPU 和存储指标稳定为止。理想情况下, 实例的 CPU 利用率应低于 建议的上限,以及 其存储空间用量不应超过实例的存储空间上限。

使用不同的区域进行负载均衡

多区域实例配置时 考虑跑步 其处理流水线位于与默认主要区域不同的区域 区域。这有助于在非主要副本之间分布流式负载。如果 您需要优先考虑尽可能短的流式传输延迟时间 但是,在主要区域中运行流式负载。

后续步骤