flink cdc捕获postgresql变化数据
环境准备
- flink 1.11
- postgresql数据库,版本要大于9.4,postgresql 9.5以下版本不支持upsert。
- flink jar包
1.flink-connector-postgres-cdc.jar
2.flink-connector-jdbc_2.11-1.11.2.jar
点击下载 提取码:3p16
flink cdc功能测试
- 修改postgresql配置文件
vi postgresql.conf
修改 wal_level = logical ,重启数据库,使配置生效
- 注意:wal_level = logical源表的数据修改时,默认的逻辑复制流只包含历史记录的primary key,如果需要输出更新记录的历史记录的所有字段,需要在表级别修改参数:ALTER TABLE tableName REPLICA IDENTITY FULL; 这样才能捕获到源表所有字段更新后的值
- 将jar包导入flink lib目录
- 启动flink sql客户端
bin/sql-client.sh embedded
4.在postgre中创建测试表
create table pg_cdc_source(id int,name varchar);
5.flink sql客户端中创建测试表
CREATE TABLE flink_cdc_source (
id INT,
name STRING
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '10.***.***.***',
'port' = '5432',
'database-name' = 'postgres',
'schema-name' = 'public',
'username' = 'postgres',
'password' = '123456',
'table-name' = 'pg_cdc_source',
'decoding.plugin.name' = 'pgoutput'
);
6.往pg_cdc_source插入一条数据,同时flink sql客户端中查看结果
insert into pg_cdc_source values(1,'tom');
如果出现上述错误,表示没识别到flink-connector-postgres-cdc.jar,如果确定已经导入,则重启一下flink.
我们查看flink中的表:select * from flink_cdc_source;
可以看到flink已经捕获到这条数据。
- 注意:
flink cdc的建表脚本和flink通过jdbc连接数据库的脚本是不一样的,flink jdbc连接jdbc的sql脚本如下:
CREATE TABLE flink_cdc_sink (
id INT,
name STRING,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:postgresql://10.**.**.**:5432/test',
'username' = 'gpadmin',
'password' = '123456',
'table-name' = 'tbl'
);
WITH后的参数是不一样的,要注意一下,不要搞混了。
另外,flink cdc的任务在UI上是一直为running状态的。