为 Snowflake Connector for PostgreSQL 配置复制

备注

使用 Snowflake Connector for PostgreSQL 需遵守 Connector 条款

为 Snowflake Connector for PostgreSQL 配置复制的过程包括以下步骤:

以及可选步骤:

添加数据源

一个数据源是一个 PostgreSQL 服务器的表示形式。Snowflake Connector for PostgreSQL 可以从多个数据源复制数据。在开始复制前,至少需要添加一个数据源。

Snowflake Connector for PostgreSQL 会将每个数据源的数据复制到 Snowflake 中的一个独特目标数据库中。同一个目标数据库不能同时供多个数据源使用。

要添加数据源,请运行以下命令:

CALL PUBLIC.ADD_DATA_SOURCE('<data_source_name>', '<dest_db>');
Copy

其中:

data_source_name

指定数据源的唯一名称。此名称应与代理配置中定义的数据源名称匹配。 请确保所选名称符合以下要求:

  • 名称仅包含大写字母 (A-Z) 和十进制数字 (0-9)。

  • 名称长度不能超过 50 个字符。

dest_db

指定 Snowflake 中目标数据库的名称。如果数据库不存在,将由过程自动创建。否则,连接器会使用现有数据库。在这种情况下,必须在添加数据源之前向连接器授予对该数据库的权限。

备注

数据源一经添加,便无法重命名或删除。

(可选)授予对目标数据库的权限

要将现有数据库用作目标数据库,Snowflake Connector for PostgreSQL 需对该数据库具有 CREATE SCHEMA 权限。连接器是包含已引入 PostgreSQL 数据的架构和表的所有者。

要授予 CREATE SCHEMA 权限,请运行以下命令:

GRANT CREATE SCHEMA ON DATABASE <dest_db> TO APPLICATION <app_db_name>;
Copy

其中:

dest_db

指定目标数据库的名称,以用于存储来自数据源的数据。

app_db_name

指定连接器数据库的名称。

添加其他数据源

您可以随时添加新的数据源。要在代理已运行的情况下添加新的数据源,请执行以下操作:

  1. 添加数据源

  2. 确保代理已停止。

  3. 配置代理与新数据源的连接

  4. 运行代理的 Docker 容器

添加用于复制的源表

要添加用于复制的源表,请运行以下命令:

CALL PUBLIC.ADD_TABLES('<data_source_name>', '<schema_name>', <table_names_array>);
Copy

其中:

data_source_name

指定包含源表的数据源的名称。

schema_name

指定源表的架构的名称。

table_names_array
指定表名称的数组:

ARRAY_CONSTRUCT('<table_name>', '<other_table_name>', ...)

添加源表会产生以下效果:

  • schema_nametable_name 会分别作为从源数据库中复制源数据时使用的架构名称和表名称。

备注

在一个过程调用中,可以添加来自同一数据源和架构的多个表。

备注

架构名称和表名称必须匹配

必须使用与源数据库中定义的表名称和架构名称完全相同的名称,包括大小写。您提供的名称将一字不差地用于在源数据库中生成 SELECT 查询。PostgreSQL 服务器名称是区分大小写的,使用不同的大小写可能会导致“表不存在”异常。

最近移除的表

如果最近移除了一些表(从复制中移除表),可能暂时无法添加它们。如果出现 Tables are not ready to be re-added 错误消息,请等几分钟后再试。

添加带有列筛选器的源表

要添加带有筛选列的源表,请运行以下命令:

CALL PUBLIC.ADD_TABLE_WITH_COLUMNS('<data_source_name>', '<schema_name>', '<table_name>', <included_columns_array>, <excluded_columns_array>);
Copy

其中:

data_source_name

指定包含源表的数据源的名称。

schema_name

指定源表的架构的名称。

table_name

指定源表的名称。

included_columns
指定应复制的列名称的数组:

ARRAY_CONSTRUCT('<column_name>', '<other_column_name>', ...)

excluded_columns
指定应忽略的列名称的数组:

ARRAY_CONSTRUCT('<column_name>', '<other_column_name>', ...)

注意

传递给过程的列名称必须区分大小写,必须与源数据库中的表示方式完全相同。

以下规则适用于上述过程:

  • 数据筛选操作在将数据引入到 Snowflake 之前执行 – 只有所选列中的数据才会以快照和增量加载的方式流式传输到 Snowflake。

  • included_columnsexcluded_columns 只是掩码。这样,如果指定的列不存在,连接器就不会报错。对于不存在的列,掩码将简单地被忽略。

  • 您不应同时提供 included_columnsexcluded_columns。如果要列出 included_columns,则应将 excluded_columns 留空,反之亦然。

  • 如果两个数组均非空,并且没有任何冲突的列,则 included_columns 优先于 excluded_columns

  • 如果一个列同时出现在 included_columnsexcluded_columns 中,则过程会报错。

  • 如果 included_columnsexcluded_columns 均为空数组,则将引入所有可用列。

  • 无论配置如何,主键列都会被复制。

例如,假设有一个源表包含以下四列:A、B、C、D,其中 A 为主键列,则:

包含的列

排除的列

预期结果

[]

[]

[A, B, C, D]

[A, B]

[]

[A, B]

[B]

[]

[A, B]

[]

[C, D]

[A, B]

[]

[A, B]

[A, C, D]

[A, B, Z]

[]

[A, B]

[A]

[A]

错误

从复制中移除表

要从复制中移除源表,请运行以下命令:

CALL PUBLIC.REMOVE_TABLE('<data_source_name>', '<schema_name>', '<table_name>');
Copy

其中:

data_source_name

指定包含源表的数据源的名称。

schema_name

指定源表的架构的名称。

table_name

指定源表的名称。

备注

从复制中移除表的过程需要几分钟时间。完成后,该表将从连接器的 PUBLIC.REPLICATION_STATE 视图中消失(请参阅 监控 Snowflake Connector for PostgreSQL)。只有在此之后,才能重新启用该表进行复制。

此时,目标表仍 由连接器应用程序拥有。如果您希望删除或以其他方式修改目标表,则需要首先将其所有权转移给您账户中的角色。以 ACCOUNTADMIN 角色执行以下查询:

GRANT OWNERSHIP ON TABLE <destination_database_name>.<schema_name>.<table_name>
  TO ROLE <role_name>
  REVOKE CURRENT GRANTS;
Copy

备注

如果要从复制中移除一个表,并修复其 FAILED 状态,则还需在再次启用复制之前手动重命名或删除目标表。

配置计划的复制

连接器可以以两种模式复制数据:连续模式或计划模式。默认以连续模式复制。

连续模式能以尽可能快的速度复制数据。它要求运营仓库全天候运行,这可能会产生不必要的成本,即使没有正在进行的复制也是如此。

计划模式会根据配置的计划复制数据。它旨在降低在不需要持续复制数据时,或者数据量较小(导致连接器大部分时间处于空闲状态)时的复制成本。

计划模式引入了复制完成的概念。快照复制从 SELECT <columns> FROM <TABLE> 查询执行开始时开始,并在数据复制到目标表时结束。增量复制从先前存储的变更数据捕获 (CDC) 指针开始,但是不会结束,因为数据是持续引入的。因此,连接器会从先前存储的 CDC 指针开始复制数据,直到最新的 CDC 指针(在复制开始时确定)。通过这种方式,连接器能以计划模式完成复制。

计划模式通过暂停运营仓库来降低复制成本。当每个源表的复制完成时,仓库可以暂停。仓库将保持暂停状态,直到根据计划执行下一次复制。

备注

同一时间只能运行一个复制任务。如果一个复制任务在下一计划运行时间到来时仍在运行,则会跳过该计划时间。

要启用计划模式,请运行以下命令:

CALL PUBLIC.ENABLE_SCHEDULED_REPLICATION('<data_source_name>', '<schedule>');
Copy

其中:

data_source_name

指定数据源的名称。

schedule

指定连接器执行数据源复制的计划或频率。允许的最小频率为 15 分钟。有关指定计划或频率的详细信息,请参阅 SCHEDULE 参数

计划示例:

  • 60 MINUTE

    将复制安排为每 60 分钟执行一次。

  • USING CRON 0 2 * * * UTC

    将复制安排为每天凌晨 2 点(UTC 时间)进行。

要禁用计划模式,请运行以下命令:

CALL PUBLIC.DISABLE_SCHEDULED_REPLICATION('<data_source_name>');
Copy

其中:

data_source_name

指定数据源的名称。

要查看当前计划,请参阅 查看数据源

备注

运营仓库会处理来自所有数据源的复制。只有在每个数据源的每个源表都完成复制后,仓库才会暂停。换句话说,您必须为所有数据源启用计划模式,以确保自动暂停功能正常工作。

警告

以较低频率执行的复制可能会导致预写式日志 (WAL) 文件显著增长。请确保磁盘上有足够的空闲空间来存储 WAL 文件,并考虑到数据源中的更改频率及其大小。

后续步骤

完成以上过程后,请按照 在 Snowflake 中查看 PostgreSQL 数据 中的步骤操作。

语言: 中文