PostgreSQL 数据源为您提供读取和写入 PostgreSQL 的双向通道数据集成能力,实现不同数据源与 PostgreSQL 之间进行数据传输。本文为您介绍 DataSail 的 PostgreSQL 数据同步的能力支持情况。
PostgreSQL 离线读写目前支持以下两种版本:
您可以在数据库中执行以下语句,查看 PostgreSQL 数据库的版本:
show server_version
子账号新建数据源时,需要有项目的管理员角色,方可以进行新建数据源操作。各角色对应权限说明,详见管理成员。对账号及其相关权限的要求如下:
建议创建专用同步账号
为保障安全性和可追溯性,建议为数据集成任务创建一个专用的 PostgreSQL 账号,避免使用业务账号或高权限账号进行数据同步。创建用户 SQL 示例如下:
-- 创建 DataSail 专用同步用户 CREATE USER datasail_user PASSWORD 'your_password';
离线读 PostgreSQL 数据时,配置的账号需拥有同步表所在 Schema 的读权限。授权 SQL 示例如下:
-- 授予指定 Schema 的使用权限 GRANT USAGE ON SCHEMA "public" TO datasail_user; -- 授予指定 Schema 下所有表的读权限 GRANT SELECT ON ALL TABLES IN SCHEMA "public" TO datasail_user; -- 【推荐】确保未来新建的表也自动授予读权限 ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT SELECT ON TABLES TO datasail_user;
说明
如需授权其他 Schema(非 public),请将上述语句中的 "public" 替换为对应的 Schema 名称。如需授权多个 Schema,请对每个 Schema 分别执行上述命令。
离线写 PostgreSQL 数据时,配置的账号需拥有同步表的写(INSERT、DELETE、UPDATE)权限。
授权 SQL 示例
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA "public" TO datasail_user; -- 【推荐】确保未来新建的表也自动授予写权限 ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT INSERT, UPDATE, DELETE ON TABLES TO datasail_user;
限制特定表的访问(可选)
如果您希望仅同步部分表,可以精细化控制权限:
-- 先撤销 Schema 级别的默认权限 ALTER DEFAULT PRIVILEGES IN SCHEMA "your_schema" REVOKE SELECT ON TABLES FROM datasail_user; REVOKE SELECT ON ALL TABLES IN SCHEMA "your_schema" FROM datasail_user; -- 再单独授权指定表 GRANT SELECT ON "your_schema"."your_table" TO datasail_user;
数据同步解决方案(实时 WAL 读取) 使用 PostgreSQL 数据源配置实时方案时,需要配置的账号具备 SuperUser 或 replication 角色权限,两者区别如下:
SuperUser 权限(推荐用于快速配置)
PostgreSQL 实时整库解决方案执行时,需要拥有 SuperUser 权限的用户来创建 publication。
-- 查看当前用户账号是否有 SuperUser 权限,返回 False 则表示无权限 SELECT usesuper FROM pg_user WHERE usename = 'datasail_user'; -- 若当前账号无高权限,则需请拥有高权限的账号授予 SuperUser ALTER USER datasail_user WITH SUPERUSER;
replication 权限(推荐用于最小权限原则)
如果不希望授予 SuperUser 权限,可以使用 replication 权限配合手动创建 publication 的方式:
-- 检查账号是否有 replication 权限,预期返回 True SELECT userepl FROM pg_user WHERE usename = 'datasail_user'; -- 若无 replication 权限,执行以下语句授权 ALTER USER datasail_user REPLICATION;
如果使用 replication 权限(非 SuperUser),需要由具有高权限的账号手动创建 publication:
-- 默认订阅全部表,支持新增表自动添加 CREATE PUBLICATION dbz_publication FOR ALL TABLES; -- 或者仅指定部分表 CREATE PUBLICATION dbz_publication FOR TABLE table1, table2, table3;
说明
FOR ALL TABLES,后续无法通过 ALTER PUBLICATION ... DROP TABLE 移除单表。FOR TABLE ...,可以后续通过以下命令添加或移除表:ALTER PUBLICATION dbz_publication ADD TABLE new_table; ALTER PUBLICATION dbz_publication DROP TABLE old_table;
注意
如果您需要使用实时同步(解决方案中的 WAL 日志读取),必须在 PostgreSQL 服务端完成以下配置。配置不正确会导致实时同步任务启动失败或数据丢失。
第一步:设置 wal_level 为 logical
在 PostgreSQL 配置文件(postgresql.conf)中,设置以下参数:
# 【必须】开启逻辑复制 wal_level = logical # 【推荐】设置最大复制槽数量,需大于等于使用逻辑复制的连接器数量 + 其他复制槽数量 max_replication_slots = 10 # 【推荐】设置最大 WAL 发送进程数,建议至少为复制槽总数的 2 倍 max_wal_senders = 20 # 【推荐】禁用 WAL 发送超时,避免长时间同步时连接中断 wal_sender_timeout = 0 # 【推荐】确保 statement_timeout 为 0(默认值)或大于 5 分钟 # statement_timeout = 0
注意
wal_level 为 logical,修改后需重启集群生效。postgresql.conf 文件。第二步:配置 pg_hba.conf(自建数据库)
对于自建 PostgreSQL,需要在 pg_hba.conf 文件中添加允许复制连接的记录:
# 允许 DataSail 资源组 IP 段进行复制连接 host replication datasail_user 0.0.0.0/0 md5
第三步:重启 PostgreSQL 服务
修改配置文件后,需要重启 PostgreSQL 服务使配置生效:
sudo systemctl restart postgresql
第四步:创建逻辑复制槽
必须在完成 publication 创建之后再创建复制槽。请确保在创建复制槽时已连接到正确的目标数据库。
-- 创建逻辑复制槽(必须使用 pgoutput 插件) SELECT pg_create_logical_replication_slot('datasail_pgoutput_slot', 'pgoutput');
说明
第五步:验证配置是否生效
-- 检查 wal_level 是否为 logical SHOW wal_level; -- 期望结果:logical -- 检查 max_replication_slots SHOW max_replication_slots; -- 期望结果:大于等于当前复制槽数量 -- 检查 max_wal_senders SHOW max_wal_senders; -- 检查可用的 WAL 发送进程数 SELECT count(*) FROM pg_stat_replication; -- max_wal_senders 值应大于此查询结果 -- 验证 publication 是否创建成功 SELECT * FROM pg_publication; -- 验证 publication 中包含的表 SELECT * FROM pg_publication_tables; -- 验证复制槽是否创建成功 SELECT * FROM pg_replication_slots;
PostgreSQL 实时同步依赖复制标识(Replica Identity)来精准识别数据变更。必须将需要同步的表设置为 FULL 模式:
-- 检查表的复制标识设置 -- d=默认(主键) n=无 f=全列 i=索引 SELECT relreplident FROM pg_class WHERE relname = 'your_table_name'; -- 设置为 FULL 模式(推荐) ALTER TABLE your_table_name REPLICA IDENTITY FULL;
说明
d(默认):如果表有主键,则使用主键作为复制标识;n(无):不存在复制标识,无法精准识别 UPDATE 和 DELETE 操作,对应数据可能不会实时同步到目标表;f(全列):使用所有列作为复制标识,UPDATE 和 DELETE 操作时都能精准识别每行每列;对于生产环境的大表全量同步,建议在 PostgreSQL 只读副本(Read Replica / Standby) 上进行数据采集,而非直接读取主库,以避免对线上业务造成性能影响。
注意
为支持全量同步读从库、增量同步读主库(WAL 必须从主库读取),需要在 PostgreSQL 数据源配置时,新增高级参数 slave_host,其对应参数值为从库域名信息。该数据源建议只在解决方案场景中使用。
确保集成同步任务使用的独享数据集成资源组,具有 PostgreSQL 数据库节点的网络访问能力。网络互通方案详见网络连通解决方案。
注意

注意
若考虑安全因素,减少 IP CIDR 的访问范围,您至少需要将集成资源组绑定的子网下的 IPv4 CIDR 地址加入到数据库白名单中。


注意
注意
对于跨公网传输的数据同步场景,强烈建议启用 SSL 加密连接,防止数据在传输过程中被窃取或篡改。
DataSail 的 PostgreSQL 数据源支持以下四种 SSL 模式,具体说明请参见 PostgreSQL SSL 官方文档。
SSL 模式 | 说明 | 适用场景 |
|---|---|---|
Disable | 不使用 SSL 模式 | 私网访问,无加解密性能损耗 |
Allow | 允许使用 SSL 模式,只有 Server 端一定需要使用 SSL 通信时才启用 | 一般场景 |
Prefer | 倾向于使用 SSL 模式,只要 Server 端支持 SSL 就会启用 | 推荐的默认选项 |
Require | 强制使用 SSL 模式 | 公网访问,会有加解密的性能损耗 |
当前主要字段支持情况如下:
字段类型 | 离线读(PostgreSQL Reader) | 离线写(PostgreSQL Writer) |
|---|---|---|
char | 支持 | 支持 |
bpchar | 支持 | 支持 |
varchar | 支持 | 支持 |
text | 支持 | 支持 |
character varying | 支持 | 支持 |
character | 支持 | 支持 |
smallint / int2 | 支持 | 支持 |
integer / int / int4 | 支持 | 支持 |
bigint / int8 | 支持 | 支持 |
smallserial | 支持 | 支持 |
serial | 支持 | 支持 |
bigserial | 支持 | 支持 |
double / float8 | 支持 | 支持 |
double precision | 支持 | 支持 |
money | 支持 | 支持 |
numeric / decimal | 支持 | 支持 |
real / float4 | 支持 | 支持 |
boolean / bool | 支持 | 支持 |
date | 支持 | 支持 |
time | 支持 | 支持 |
timetz | 支持 | 支持 |
timestamp | 支持 | 支持 |
timestamptz | 支持 | 支持 |
bytea | 支持 | 支持 |
bit | 支持 | 支持 |
bit varying / varbit | 支持 | 支持 |
uuid | 支持 | 支持 |
cidr | 支持 | 支持 |
xml | 支持 | 支持 |
inet | 支持 | 支持 |
macaddr | 支持 | 支持 |
enum | 支持 | 支持 |
json | 支持 | 支持 |
jsonb | 支持 | 支持 |
interval | 支持 | 支持 |
oid | 支持 | 支持 |
box | 支持 | 支持 |
line | 支持 | 支持 |
lseg | 支持 | 支持 |
tsquery | 支持 | 支持 |
tsvector | 支持 | 支持 |
polygon | 支持 | 支持 |
circle | 支持 | 支持 |
point | 支持 | 支持 |
path | 支持 | 支持 |
geography | 支持 | 支持 |
roaringbitmap | 支持 | 不支持 |
geometry | 支持 | 不支持 |
_aclitem | 不支持 | 不支持 |
_int2 / _int4 / _int8 | 不支持 | 不支持 |
_float4 / _float8 | 不支持 | 不支持 |
_bool / _text / _char | 不支持 | 不支持 |
_oid | 不支持 | 不支持 |
说明
PostgreSQL 数组类型(以 _ 开头的类型,如 _int4、_text 等)目前不支持直接同步。如您有数组数据同步需求,建议在源端使用 array_to_string() 函数将数组转换为文本格式后,通过 VARCHAR/TEXT 字段进行同步。
在多环境模式的项目下,数据源能够实现开发环境与生产环境的注册隔离。并且在进行离线集成任务配置时,多环境下的数据源信息均需要进行注册。
新建数据源操作详见配置数据源,下面为您介绍用连接串方式配置 PostgreSQL 数据源信息:
参数 | 说明 |
|---|---|
基本配置 | |
数据源类型 | PostgreSQL |
接入方式 | 连接串 |
数据源名称 | 数据源的名称,可自行设置,仅支持中文,英文,数字,“_”,100个字符以内。 |
参数配置 | |
Database | 输入已创建成功的 PostgreSQL 数据库名称。 |
SSL 模式 | SSL 加密模式可以提供窃听攻击、中间人攻击(Man-in-the-middle MITM)、假冒攻击的保护措施。不同的 SSL 模式用于提供不同等级的保护,支持 Disable、Allow、Prefer、Require 四个选项,详细说明请参见2.6 连接安全(SSL)。 |
Host | 输入连接数据库时,使用的主机名或 IP 地址。 |
Port | PostgreSQL 数据库连接的端口号。 |
是否使用KMS密码 | 可选择是否使用KMS密码连接数据库。默认关闭不使用,开启后将使用KMS密码。 |
用户名 | 有权限访问数据库的用户名信息。 说明 是否使用KMS密码为关闭状态时,需设置该参数。 |
密码 | 输入用户名对应的密码信息。 说明 是否使用KMS密码为关闭状态时,需设置该参数。 |
Secret | 用于连接数据库的KMS密码,下拉可选已创建的 PostgreSQL 凭据。KMS相关信息统一在密钥管理系统中管理,创建凭据的操作可参见凭据管理。 说明 是否使用KMS密码为开启状态时,需设置该参数。 |
高级参数 | 数据源配置支持添加 PostgreSQL 相关的高级参数,如配置 PostgreSQL 从库相关的 Host 信息,以参数名和参数值的形式填入。目前需配置的高级参数如下:
|
数据源注册完成后,单击测试连通性按钮,系统将依次检查以下项目:
测试项 | 说明 | 常见失败原因 |
|---|---|---|
网络连通 | 资源组能否访问 PostgreSQL 主机和端口 | 白名单未配置、VPC 未打通、防火墙拦截 |
认证校验 | 用户名和密码是否正确 | 密码错误、账号不存在、pg_hba.conf 限制 |
权限检查 | 账号是否具备所需权限 | 缺少 SELECT / REPLICATION 权限 |
数据库存在性 | 指定的数据库是否存在 | 数据库名拼写错误 |
如果测试失败,请根据错误提示逐项排查。您也可以在 PostgreSQL 客户端(psql)执行以下命令自行验证:
-- 验证账号是否能连接 -- psql -h <host> -p <port> -U <user> -d <database> -- 验证权限 SELECT * FROM information_schema.role_table_grants WHERE grantee = 'datasail_user'; -- 验证 WAL 配置(实时同步场景) SHOW wal_level; SELECT * FROM pg_replication_slots; SELECT * FROM pg_publication;
DataSail 提供以下多种 PostgreSQL 数据同步方式,请根据您的业务场景选择合适的方式:
同步方式 | 适用场景 | 实时性 | 对源库影响 | 操作入口 |
|---|---|---|---|---|
离线全量同步 | 首次迁移、定期全量刷新 | 低(按调度周期) | 较大(需全表扫描) | 数据开发 > 数据集成 > 新建任务 |
离线增量同步(带过滤条件) | 按时间字段增量拉取 | 低(按调度周期) | 较小 | 数据开发 > 数据集成 > 新建任务 |
实时整库同步(解决方案) | 整库实时入仓、CDC 场景 | 高(秒级延迟) | 极小(仅读取 WAL 日志) | DataSail 控制台 > 数据同步方案 > 新建 |
流式写入 | 实时写入 PostgreSQL 目标表 | 高 | N/A(作为目标端) | 数据开发 > 数据集成 > 新建任务 |
下面列举解决方案和单表任务同步操作时,在不同维度的差异:
对比维度 | 单表任务(数据集成入口) | 解决方案(数据同步方案入口) |
|---|---|---|
操作入口 | 数据开发 > 数据集成 > 新建任务 | DataSail 控制台 > 数据同步方案 > 新建 |
同步粒度 | 单表级别,需逐表配置 | 整库级别,一次选择多张表 |
同步模式 | 离线批式读/写、流式写(需分别创建) | 全增量一体(自动创建全量批任务 + 增量流任务) |
目标表创建 | 需手动提前创建 | 支持自动建表、使用已有表 |
DDL 同步 | 不支持 | 支持新建表、新增列、删除列、重命名列、修改列类型等 DDL 策略 |
数据缓存 | 不支持 | 支持通过 Kafka/BMQ/DataSail 内置 Topic 缓存,提升稳定性 |
数据转换 | 支持基础模式/转换模式 | 支持自定义 SQL 转换规则 |
适用场景 | 定期同步少量表、简单 ETL | PostgreSQL 实时入仓、整库迁移、CDC 场景 |