PostgreSQL 数据转移简介
您可以使用适用于 PostgreSQL 的 BigQuery Data Transfer Service 连接器将数据从 PostgreSQL 加载到 BigQuery。该连接器支持托管在本地环境、Cloud SQL 以及其他公有云提供商(例如 Amazon Web Services [AWS] 和 Microsoft Azure)中的 PostgreSQL 实例。本文档概述了 PostgreSQL 转移的数据注入选项,并提供了有关数据类型映射和价格的信息。
如需了解如何安排 PostgreSQL 转移作业,请参阅将 PostgreSQL 数据加载到 BigQuery 中。
数据注入选项
以下部分介绍了设置 PostgreSQL 数据转移时可用的数据注入选项。
TLS 配置
PostgreSQL 连接器支持传输层安全性 (TLS) 配置,以加密您向 BigQuery 传输的数据。PostgreSQL 连接器支持以下 TLS 配置:
加密数据,并验证 CA 和主机名模式。此模式使用基于 TCPS 协议的 TLS 对服务器执行完整验证。它会加密传输中的所有数据,并验证数据库服务器的证书是否由受信任的证书授权机构 (CA) 签名。此模式还会检查您要连接的主机名是否与服务器证书上的通用名称 (CN) 或主题备用名称 (SAN) 完全一致。此模式可防止攻击者使用其他网域的有效证书来冒充您的数据库服务器。
如果主机名与证书 CN 或 SAN 不匹配,连接会失败。您必须配置与证书匹配的 DNS 解析,或使用其他安全模式。使用此模式可获得最安全的选项,以防止中间人 (PITM) 攻击。
加密数据,仅验证 CA 模式。此模式使用基于 TCPS 协议的 TLS 加密所有数据,并验证服务器的证书是否由客户端信任的 CA 签名。不过,此模式不会验证服务器的主机名。只要证书有效且由可信的 CA 签发,此模式就能成功连接,无论证书中的主机名是否与您要连接的主机名匹配。
如果您想确保自己连接到的服务器的证书是由可信的 CA 签名的,但主机名无法验证,或者您无法控制主机名配置,请使用此模式。
仅加密模式。此模式会加密客户端与服务器之间传输的所有数据。它不会执行任何证书或主机名验证。
此模式通过保护传输中的数据来提供一定程度的安全性,但可能会受到 PITM 攻击。
如果您需要确保所有数据都经过加密,但无法或不想验证服务器的身份,请使用此模式。建议您在使用专用 VPC 时使用此模式。
不加密或不验证模式。此模式不会加密任何数据,也不会执行任何证书或主机名验证。所有数据都以纯文本形式发送。
我们不建议在处理敏感数据的环境中使用此模式。我们建议仅在安全不是问题的隔离网络中将此模式用于测试目的。
可信服务器证书 (PEM)
如果您使用的是加密数据,并验证 CA 和主机名模式或加密数据,并验证 CA 模式,则还可以提供一个或多个 PEM 编码的证书。在某些情况下,BigQuery Data Transfer Service 需要在 TLS 连接期间验证数据库服务器的身份,此时需要这些证书:
- 如果您使用的是由组织内的私有 CA 签名的证书或自签名证书,则必须提供完整的证书链或单个自签名证书。对于由受管理的云提供商服务(例如 Amazon Relational Database Service (RDS))的内部 CA 签发的证书,这是必需的。
- 如果您的数据库服务器证书是由公共 CA(例如 Let's Encrypt、DigiCert 或 GlobalSign)签名的,则无需提供证书。这些公共 CA 的根证书已预安装并受到 BigQuery Data Transfer Service 的信任。
您可以在转移配置的 Trusted PEM Certificate(受信任的 PEM 证书)字段中指定 PEM 编码的证书,但需满足以下要求:
- 证书必须是有效的 PEM 编码证书链。
- 证书必须完全正确。证书链中缺少任何证书或内容不正确都会导致 TLS 连接失败。
- 对于单个证书,您可以提供数据库服务器中的单个自签名证书。
- 对于由私有 CA 颁发的完整证书链,您必须提供完整的信任链。这包括数据库服务器的证书以及任何中间 CA 证书和根 CA 证书。
完整转移或增量转移
在设置 PostgreSQL 转移作业时,您可以在转移作业配置中选择完整或增量写入偏好设置,以指定数据加载到 BigQuery 的方式。 预览版支持增量转移。
您可以配置完整数据转移,以便在每次数据转移时转移 PostgreSQL 数据集中的所有数据。或者,您也可以配置增量数据转移([预览版](https://cloud.google.com/products#product-launch-stages)),以仅转移自上次数据转移以来更改的数据,而不是在每次数据转移时都加载整个数据集。如果您为数据转移选择增量,则必须指定附加或 upsert 写入模式,以定义在增量数据转移期间如何将数据写入 BigQuery。以下各部分介绍了可用的写入模式。
附加写入模式
附加写入模式只会向目标表中插入新行。此选项会严格附加转移的数据,而不检查是否存在现有记录,因此这种模式可能会导致目标表中的数据重复。
选择附加模式时,您必须选择水位线列。PostgreSQL 连接器需要一个水位线列来跟踪源表中的更改。
对于 PostgreSQL 转移,我们建议选择仅在创建记录时更新的列,且该列不会随后续更新而变化。例如,CREATED_AT 列。
Upsert 写入模式
upsert 写入模式会通过检查主键来更新目标表中的行或在其中插入新行。您可以指定主键,以便 PostgreSQL 连接器确定需要进行哪些更改才能使目标表与源表保持同步。如果在数据转移期间,指定的主键存在于目标 BigQuery 表中,则 PostgreSQL 连接器会使用源表中的新数据更新该行。如果在数据转移期间不存在主键,则 PostgreSQL 连接器会插入新行。
选择 upsert 模式时,您必须选择水位线列和主键:
- PostgreSQL 连接器需要一个水位线列来跟踪源表中的更改。
- 选择一个每次修改行时都会更新的水位线列。建议使用与
UPDATED_AT或LAST_MODIFIED列类似的列。
- 选择一个每次修改行时都会更新的水位线列。建议使用与
主键可以是表中的一列或多列,PostgreSQL 连接器需要使用这些列来确定是否需要插入或更新行。
选择包含非 null 值且在表的所有行中都唯一的列。我们建议使用包含系统生成的标识符、唯一参考代码(例如自动递增的 ID)或不可变、基于时间的序列 ID 的列。
为防止潜在的数据丢失或数据损坏,您选择的主键列必须具有唯一值。如果您对所选主键列的唯一性有疑问,建议您改用附加写入模式。
增量提取行为
当您更改数据源中的表架构时,这些表中的增量数据转移会以以下方式反映在 BigQuery 中:
| 数据源变更 | 增量提取行为 |
|---|---|
| 添加新列 | 系统会在目标 BigQuery 表中添加一个新列。 此列的所有先前记录都将具有 null 值。 |
| 删除列 | 已删除的列仍保留在目标 BigQuery 表中。向此已删除的列添加的新条目会填充 null 值。 |
| 更改列中的数据类型 | 该连接器仅支持
ALTER COLUMN DDL 语句支持的数据类型转换。
任何其他数据类型转换都会导致数据转移失败。
如果您遇到任何问题,建议您创建新的转移配置。 |
| 重命名列 | 原始列会按原样保留在目标 BigQuery 表中,同时系统会向目标表添加一个具有更新名称的新列。 |
数据类型映射
下表将 PostgreSQL 数据类型映射到相应的 BigQuery 数据类型:
| PostgreSQL 数据类型 | BigQuery 数据类型 | 更新后的 BigQuery 数据类型 |
|---|---|---|
array |
STRING |
|
bigint |
INTEGER |
|
bigserial |
INTEGER |
|
bit(n) |
STRING |
|
bit varying(n) |
STRING |
|
boolean |
BOOLEAN |
|
box |
STRING |
|
bytea |
BYTES |
|
character |
STRING |
|
character varying |
STRING |
|
cidr |
STRING |
|
circle |
STRING |
|
circularstring |
STRING |
|
compoundcurve |
STRING |
|
curvepolygon |
STRING |
|
date |
DATE |
|
double precision |
FLOAT |
|
enum |
STRING |
|
geometrycollection |
STRING |
|
inet |
STRING |
|
integer |
INTEGER |
|
interval |
STRING |
|
json |
STRING |
JSON |
jsonb |
STRING |
JSON |
line |
STRING |
|
linestring |
STRING |
|
lseg |
STRING |
|
macaddr |
STRING |
|
macaddr8 |
STRING |
|
money |
STRING |
|
multicurve |
STRING |
|
multilinestring |
STRING |
|
multipoint |
STRING |
|
multipolygon |
STRING |
|
multisurface |
STRING |
|
numeric(precision, scale)/decimal(precision, scale) |
NUMERIC |
|
path |
STRING |
|
point |
STRING |
|
polygon |
STRING |
|
polyhedralsurface |
STRING |
|
range |
STRING
|
|
real |
FLOAT |
|
serial |
INTEGER |
|
smallint |
INTEGER |
|
smallserial |
INTEGER |
|
text |
STRING |
|
time [ (p) ] [ without timezone ] |
TIMESTAMP |
|
time [ (p) ] with time zone |
TIMESTAMP |
|
tin |
STRING |
|
timestamp [ (p) ] [ without timezone ] |
TIMESTAMP |
DATETIME |
timestamp [ (p) ] with time zone |
TIMESTAMP |
|
triangle |
STRING |
|
tsquery |
STRING |
|
tsvector |
STRING |
|
uuid |
STRING |
|
xml |
STRING |
价格
如需了解 PostgreSQL 传输相关的价格信息,请参阅 Data Transfer Service 价格。
后续步骤
- 了解如何设置 PostgreSQL 转移。
- 详细了解 BigQuery Data Transfer Service。