部分内容来源:流计算 Oceanus 数据库 PostgreSQL CDC-SQL 开发指南-文档中心-腾讯云
Postgres 的 CDC 源表(即 Postgres 的流式源表)用于依次读取 PostgreSQL 数据库全量快照数据和变更数据,保证不多读也不少读一条数据。即使发生故障,也能采用 Exactly Once 方式处理。
PostgreSQL CDC 只支持作为源表。支持的 PostgreSQL 版本为9.6及以上版本。
# 更改wal发送最大进程数(默认值为10),这个值和上面的solts设置一样
max_wal_senders = 10 # max number of walsender processes
wal_keep_segments = 2 # in logfile segments; 0 disables
# 中断那些停止活动超过指定毫秒数的复制连接,可以适当设置大一点(默认60s)
wal_sender_timeout = 60s # in milliseconds; 0 disables
#更改solts最大数量(默认值为10),flink-cdc默认一张表占用一个slots
max_replication_slots = 10 # max number of replication slots
#指定为logical
wal_level = logical # minimal, replica, or logical
# - Archiving -
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/11/arch/%f && cp %p /var/lib/pgsql/11/arch/%f'
添加
# IPv4 local connections:
host all all 0.0.0.0/0 md5
host replication all 0.0.0.0/0 md5
CREATE TABLE postgres_cdc_source_table (
id INT,
name STRING,
PRIMARY KEY (`id`) NOT ENFORCED -- 如果要同步的数据库表定义了主键, 则这里也需要定义
) WITH (
'connector' = 'postgres-cdc', -- 固定值 'postgres-cdc'
'hostname' = 'yourHostname', -- 数据库的 IP
'port' = '5432', -- 数据库的访问端口
'username' = 'yourUserName', -- 数据库访问的用户名(需要提供 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT权限)
'password' = 'yourPassWord', -- 数据库访问的密码
'database-name' = 'yourDatabaseName', -- 需要同步的数据库
'schema-name' = 'yourSchemaName', -- 需要同步的数据表所属schema (支持正则表达式)
'table-name' = 'yourTableName', -- 需要同步的数据表名 (支持正则表达式)
'debezium.slot.name' = 'customslotname' -- 定义一个唯一slot名称,可以包含小写字母、数字和下划线字符
);
参数 | 说明 | 是否必填 | 备注 |
---|---|---|---|
connector | 源表类型 | 是 | 固定值为 postgres-cdc |
hostname | Postgres 数据库的 IP 地址或者 Hostname | 是 | - |
username | Postgres 数据库服务的用户名 | 是 | 有特定权限(包括 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT)的 Postgres 用户 |
password | Postgres 数据库服务的密码 | 是 | - |
database-name | Postgres 数据库名称 | 是 | - |
schema-name | Postgres Schema 名称 | 是 | Schema 名称支持正则表达式以读取多个 Schema 的数据 |
table-name | Postgres 表名 | 是 | 表名支持正则表达式以读取多个表的数据 |
port | Postgres 数据库服务的端口号 | 否 | 默认值为5432 |
decoding.plugin.name | Postgres Logical Decoding 插件名称 | 否 | 根据 Postgres 服务上安装的插件确定。支持的插件列表如下:
|
debezium.* | Debezium 属性参数 | 否 | 从更细粒度控制 Debezium 客户端的行为。例如'debezium.slot.name' = 'xxxx' ,以避免出现 PSQLException: ERROR: replication slot "dl_test" is active for PID 19997 详情请参见 配置属性 |
Postgres CDC 和 Flink 字段类型对应关系如下:
Postgres CDC 字段类型 | Flink 字段类型 |
---|---|
SMALLINT | SMALLINT |
INT2 | |
SMALLSERIAL | |
SERIAL2 | |
INTEGER | INT |
SERIAL | |
BIGINT | BIGINT |
BIGSERIAL | |
REAL | FLOAT |
FLOAT4 | |
FLOAT8 | DOUBLE |
DOUBLE PRECISION | |
NUMERIC(p, s) | DECIMAL(p, s) |
DECIMAL(p, s) | |
BOOLEAN | BOOLEAN |
DATE | DATE |
TIME [(p)] [WITHOUT TIMEZONE] | TIME [(p)] [WITHOUT TIMEZONE] |
TIMESTAMP [(p)] [WITHOUT TIMEZONE] | TIMESTAMP [(p)] [WITHOUT TIMEZONE] |
CHAR(n) | STRING |
CHARACTER(n) | |
VARCHAR(n) | |
CHARACTER VARYING(n) | |
TEXT | |
BYTEA | BYTES |
CREATE TABLE postgres_cdc_source_table (
id INT,
name STRING,
PRIMARY KEY (`id`) NOT ENFORCED -- 如果要同步的数据库表定义了主键, 则这里也需要定义
) WITH (
'connector' = 'postgres-cdc', -- 固定值 'postgres-cdc'
'hostname' = 'yourHostname', -- 数据库的 IP
'port' = '5432', -- 数据库的访问端口
'username' = 'yourUserName', -- 数据库访问的用户名(需要提供 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT权限)
'password' = 'yourPassWord', -- 数据库访问的密码
'database-name' = 'yourDatabaseName', -- 需要同步的数据库
'schema-name' = 'yourSchemaName', -- 需要同步的数据表所属schema (支持正则表达式)
'table-name' = 'yourTableName', -- 需要同步的数据表名 (支持正则表达式)
'debezium.slot.name' = 'customslotname' -- 定义一个唯一slot名称,可以包含小写字母、数字和下划线字符
);
CREATE TABLE `print_table` (
`id` INT,
`name` STRING
) WITH (
'connector' = 'print'
);
insert into print_table select * from postgres_cdc_source_table;
来源: 流计算 Oceanus 数据库 PostgreSQL CDC-SQL 开发指南-文档中心-腾讯云
用户权限
用来同步的用户至少具有 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT 权限。
CREATE ROLE debezium_user REPLICATION LOGIN;
GRANT USAGE ON SCHEMA schema_name TO debezium_user;
GRANT USAGE ON DATABASE schema_name TO debezium_user;
GRANT SELECT ON scheam_name.table_name, scheam_name.table_name TO debezium_user;
1. number of requested standby connections exceeds max_wal_senders (currently 1)。
max_wal_senders 须大于 wal_keep_segments
2.org.postgresql.util.PSQLException: ERROR: could not access file "decoderbufs": No such file or directory。
如果是 table sql 方式,pgoutput是 PostgreSQL 10+ 中的标准逻辑解码输出插件。需要设置一下。添加如下配置
WITH(
'decoding.plugin.name' = 'pgoutput'
)
3 .io.debezium.DebeziumException: Failed to start replication stream at LSN{0/1100AA50}; when setting up multiple connectors for the same database host, please make sure to use a distinct replication slot name for each.
org.postgresql.util.PSQLException: ERROR: replication slot "flink" is active for PID 26632
同一个数据源存在两个复制槽,因此需要为每个指定不同的名称。
WITH(
'debezium.slot.name' = '自定义名称'
)