Snowflake Connector for PostgreSQL 特征

版本支持

Snowflake Connector for PostgreSQL 支持任何官方支持的 PostgreSQL 版本。Snowflake 会随着客户迁移到较新版本而放弃对较旧版本的支持。Snowflake 在新版本发布时会宣布支持新版本。

虽然连接器支持许多 PostgreSQL 云版本,但有些版本需要额外设置。有关更多信息,请参阅 Snowflake Connector for PostgreSQL 数据源的先决条件

以下是支持的 PostgresSQL 版本。

支持的 PostgreSQL 版本

11

12

13

14

15

16

17

Standard (https://www.postgresql.org/)

AWS RDS (https://docs.aws.amazon.com/AmazonRDS/latest/PostgreSQLReleaseNotes/Welcome.html)

Amazon Aurora (https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/Welcome.html)

GCP Cloud SQL (https://cloud.google.com/sql/docs/postgres/)

Azure Database (https://learn.microsoft.com/en-us/azure/postgresql/)

服务器设置

根据需要查看并调整 PostgreSQL 服务器上的以下设置:

wal_level

设置为 logical

连接器依靠主键将变更合并到目标表中。以下设置可确保 Write-Ahead Log (WAL) 记录包括主键信息:

max_replication_slots

为数据库代理中此数据库的每个数据源配置条目增加 1。

max_connections

为数据库代理中此数据库的每个数据源配置条目增加 1。

max_wal_senders

为数据库代理中此数据库的每个数据源配置条目增加 1。

发布

连接器需要 PostgreSQL 发布 (https://www.postgresql.org/docs/current/logical-replication-publication.html) 来访问表以进行复制。

  • 数据库代理只支持每个数据源一项发布。如果需要在单个 PostgreSQL 服务器中使用多项发布,则可以将该服务器多次配置为单独的数据源,每个数据源都有自己的发布。

  • 发布应包括对数据所做的所有变更,包括 INSERTUPDATEDELETETRUNCATE

  • 可以为 ALL TABLES 或表的子集设置发布,但为了获得最佳性能,请仅添加那些应复制的表。连接器将只接收来自发布中包含的表的变更。

  • 可以将表及其所有列或列的子集添加到发布中。使用列的子集进行添加时,请使用 ADD_TABLE_WITH_COLUMNS 过程

警告

将表添加到具有列子集的发布中,然后使用 ADD_TABLES 过程启用以用于复制时,发布中缺少的列将在目标表中标记为已删除。以后向发布添加任何其他列都将导致表被标记为永久失败。

有关发布配置的更多信息,请参阅 配置发布

复制槽

为了复制数据和架构变更,连接器会创建一个 复制槽 (https://www.postgresql.org/docs/current/logicaldecoding-explanation.html#LOGICALDECODING-REPLICATION-SLOTS)。将给定数据源中的第一个表添加到复制时,将创建槽,并将其用于该数据源中的所有表。

槽的名称结构为 sf_db_conn_rs_kbmd_<data-source-name>,其中 <data-source-name> 是数据库代理配置中数据源的标识符。

  • 如果将数据库代理配置为多次连接到同一数据库,则通过添加多个数据源,连接器将创建 多个 复制槽。

  • 如果将多个数据库代理配置为连接到同一 PostgreSQL 服务器,则必须为每个数据库代理提供唯一的数据源名称。

小心

数据库代理 不会删除 未使用的复制槽。如果您断开数据库代理与 PostgreSQL 实例的连接,或者从复制中移除其所有表,那么您还 必须 手动删除复制槽,以防止它阻碍 WAL 修剪。

WAL 增长和复制槽位置

复制槽创建后,将导致 PostgreSQL 从复制槽所保留的位置保留 WAL 数据,直到连接器确认并推进该位置。连接器在记录存储在其日志表中之后定期确认位置,即使这些记录尚未合并到目标表中。

  • 连续模式 下,连接器每分钟确认一次位置。

  • 计划模式 下,连接器根据配置的计划确认位置。请记住,更长的计划 将导致 WAL 更大

必须确保 PostgreSQL 服务器上有足够的磁盘空间用于 WAL。如果您检测到 WAL 持续增长,请检查以下内容:

  • 数据库代理是否已连接,并且连接器是否正在主动复制数据?如果不是,则表示复制槽没有推进,并阻止 WAL 修剪。

  • 复制是否与复制表中的数据变更保持同步?如果不是,则意味着源中的数据变更与其在 Snowflake 目标表中的出现时间之间的延迟持续增长,复制槽推进得太慢。您需要从复制中移除一些表,或者增加计算仓库的大小。

如果由于复制槽未推进而导致增长,则 PostgreSQL 中的 max_wal_size 设置对 WAL 增长没有影响。

小技巧

在紧急情况下,您可以手动删除连接器使用的复制槽。这将中断连接器中运行的任何复制,但允许 PostgreSQL 修剪 WAL 和回收磁盘空间。

主键和表副本标识

连接器依靠主键将变更合并到目标表中。因此:

  • 为复制启用的每个表都必须有一个主键。键可以是单个列或组合。

  • 表也必须将其 REPLICA IDENTITY (https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY) 设置为 DEFAULT。这确保了主键在 WAL 中表示,并且连接器可以读取它们。

代理身份验证

当前唯一支持的身份验证方法是用户名和密码。数据库代理配置中的每个数据源条目都包括自己的凭据集,这些凭据在数据源之间可能会有所不同。

数据库代理的用户必须具有带 REPLICATION 属性的角色,或者如果不能应用前者,则为 SUPERUSER

有关如何为数据库代理创建用户的说明,请参阅 创建所需的用户

有关保护数据库代理访问源数据库的更多信息,请参阅 PostgreSQL 文档 (https://www.postgresql.org/docs/current/logical-replication-security.html)。

语言: 中文