flink postgresql cdc实时同步(含pg安装配置等)

1. 环境信息

类型版本/描述
docker20.10.9
Postgresql10.6
初始化账号密码:postgres/postgres
普通用户:test1/test123
数据库:test_db
flink1.13.6

2. 安装

step1: 拉取 PostgreSQL 10.6 版本的镜像:

docker pull postgres:10.6

step2:创建并启动 PostgreSQL 容器,在这里,我们将把容器的端口 5432 映射到主机的端口 30028,账号密码设置为postgres,并将 pgoutput 插件加载到 PostgreSQL 实例中:

docker run -d -p 30028:5432 --name postgres-10.6 -e POSTGRES_PASSWORD=postgres postgres:10.6 -c 'shared_preload_libraries=pgoutput'

step3: 查看容器是否创建成功:

docker ps | grep postgres-10.6

3. 配置

step1:docker进去Postgresql数据的容器:

docker exec -it postgres-10.6  bash

step2:编辑postgresql.conf配置文件:

vi /var/lib/postgresql/data/postgresql.conf 

配置内容如下:

# 更改wal日志方式为logical(方式有:minimal、replica 、logical  )
wal_level = logical  

# 更改solts最大数量(默认值为10),flink-cdc默认一张表占用一个slots
max_replication_slots = 20

# 更改wal发送最大进程数(默认值为10),这个值和上面的solts设置一样
max_wal_senders = 20     

# 中断那些停止活动超过指定毫秒数的复制连接,可以适当设置大一点(默认60s,0表示禁用)
wal_sender_timeout = 180s	          

step3:重启容器:

docker restart postgres-10.6

连接数据库,如果查询一下语句,返回logical表示修改成功:

SHOW wal_level;

4. 新建用户并赋权

使用创建容器时的账号密码(postgres/postgres)登录Postgresql数据库。

先创建数据库和表:

-- 创建数据库 test_db
CREATE DATABASE test_db;

-- 连接到新创建的数据库 test_db
\c test_db

-- 创建 t_user 表
CREATE TABLE "public"."t_user" (
    "id" int8 NOT NULL,
    "name" varchar(255),
    "age" int2,
    PRIMARY KEY ("id")
);

新建用户并且给用户权限:

-- pg新建用户
CREATE USER test1 WITH PASSWORD 'test123';

-- 给用户复制流权限
ALTER ROLE test1 replication;

-- 给用户登录数据库权限
GRANT CONNECT ON DATABASE test_db to test1;

-- 把当前库public下所有表查询权限赋给用户
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO test1;

5. 发布表

-- 设置发布为true
update pg_publication set puballtables=true where pubname is not null;

-- 把所有表进行发布
CREATE PUBLICATION dbz_publication FOR ALL TABLES;

-- 查询哪些表已经发布
select * from pg_publication_tables;

更改表的复制标识包含更新和删除的值:

-- 更改复制标识包含更新和删除之前值(目的是为了确保表 t_user 在实时同步过程中能够正确地捕获并同步更新和删除的数据变化。如果不执行这两条语句,那么 t_user 表的复制标识可能默认为 NOTHING,这可能导致实时同步时丢失更新和删除的数据行信息,从而影响同步的准确性)
ALTER TABLE t_user REPLICA IDENTITY FULL;

-- 查看复制标识(为f标识说明设置成功,f(表示 full),否则为 n(表示 nothing),即复制标识未设置)
select relreplident from pg_class where relname='t_user';

6. flink sql

-- 源表定义
CREATE TABLE `table_source_pg` (
      id BIGINT,
      name STRING,
      age INT
      ) WITH (
      'connector' = 'postgres-cdc',
      'hostname' = '10.194.183.120',
      'port' = '30028',
      'username' = 'test1',
      'password' = 'test123',
      'database-name' = 'test_db',
      'schema-name' = 'public',
      'table-name' = 't_user',
      'decoding.plugin.name' = 'pgoutput'
)

-- 目标表表定义
CREATE TABLE `table_sink_mysql` (
      id BIGINT,
      name STRING,
      age INT,
      PRIMARY KEY (`id`) NOT ENFORCED
      ) WITH (
      'connector' = 'jdbc',
      'url' = 'jdbc:mysql://10.194.183.120:30306/test',
      'username' = 'root',
      'password' = 'root',
      'table-name' = 't_user_copy'
)

-- insert语句
INSERT INTO `table_sink_mysql` (`id`, `name`, `age`) (SELECT `id`, `name`, `age` FROM `table_source_pg`)

7. 命令汇总

-- pg新建用户
CREATE USER test1 WITH PASSWORD 'test123';

-- 给用户复制流权限
ALTER ROLE ODPS_ETL replication;

-- 给用户数据库权限
GRANT CONNECT ON DATABASE test_db to test1;

-- 设置发布开关
update pg_publication set puballtables=true where pubname is not null;

-- 把所有表进行发布
CREATE PUBLICATION dbz_publication FOR ALL TABLES;

-- 查询哪些表已经发布
select * from pg_publication_tables;

-- 给表查询权限
grant select on TABLE aa to ODPS_ETL;

-- 给用户读写权限
grant select,insert,update,delete ON  ALL TABLES IN SCHEMA public to bd_test;

-- 把当前库所有表查询权限赋给用户
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ODPS_ETL;

-- 把当前库以后新建的表查询权限赋给用户
alter default privileges in schema public grant select on tables to ODPS_ETL;

-- 更改复制标识包含更新和删除之前值
ALTER TABLE test0425 REPLICA IDENTITY FULL;

-- 查看复制标识
select relreplident from pg_class where relname='test0425';

-- 查看solt使用情况
SELECT * FROM pg_replication_slots;

-- 删除solt
SELECT pg_drop_replication_slot('zd_org_goods_solt');

-- 查询用户当前连接数
select usename, count(*) from pg_stat_activity group by usename order by count(*) desc;

-- 设置用户最大连接数
alter role odps_etl connection limit 200;

附:

  • 参考文章:https://www.cnblogs.com/xiongmozhou/p/14817641.html
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果 Flink CDC 消费 PostgreSQL 数据时,所有的值都是 null,可能是以下几个原因导致的: 1. PostgreSQL 数据库连接参数配置有误,导致 Flink CDC 无法连接到数据库。 2. Flink CDC 配置中指定的数据表不存在,或者所消费的数据表中没有任何数据。 3. Flink CDC 使用的插入模式不正确,导致消费到的数据为空。 4. Flink CDC 在消费数据时遇到了其他问题,例如数据损坏、网络故障等。 要解决这个问题,需要检查并确保 PostgreSQL 数据库连接参数正确,指定的数据表存在且有数据,插入模式正确,并排查其他可能的问题。 ### 回答2: 当使用Flink CDC消费PG数据时,遇到全部为NULL值的情况,可能存在以下几种情况和解决办法: 1. 检查数据源:首先,确认数据源PG数据库中是否确实存在非NULL值的数据。可以通过手动查询PG数据库表,或者使用PG客户端工具验证数据源的正确性。 2. 检查CDC配置:确认Flink CDC配置是否正确。包括CDC连接PG数据库的用户名和密码等配置信息,确保能够正确连接到PG数据库。 3. 检查解析器配置Flink CDC使用解析器来解析CDC消息,并将其转换为Flink的数据流。检查解析器配置是否正确,确保解析器能够正确地将PG数据转换为Flink的数据格式。 4. 检查字段映射:Flink CDC对于PG数据表的每个字段都需要进行映射,确保每个字段的映射关系都正确。如果字段映射不正确,可能会导致所有字段值都为NULL。 5. 检查数据格式:验证PG数据表的字段类型和Flink的数据类型是否匹配。如果不匹配,可能会导致数据解析错误,从而产生全部为NULL值的情况。 6. 检查数据筛选条件:在CDC消费过程中,可能设置了数据筛选条件。确保筛选条件不导致无数据可消费的情况。 在解决以上问题之后,重新启动Flink CDC应用程序,观察是否仍然存在全部为NULL值的情况。如果问题仍然存在,可以进一步检查PG数据库和Flink CDC的日志,以确定具体的异常原因,并参考FlinkPG数据库的文档和社区资源获取更多的帮助。 ### 回答3: 当Flink CDC消费PG数据时,如果所有的值都变成了null值,可能是由于以下原因造成的: 1. 数据格式错误:首先需要确保数据源和CDC连接器的配置正确,并且数据源中的数据类型与CDC连接器中的数据类型相匹配。检查数据源的结构和类型是否与CDC连接器中定义的一致。 2. CDC连接器配置错误:在CDC连接器的配置中,确保已正确设置了表名、数据库连接信息和其他必要的参数。不正确的配置可能导致数据无法正确解析和读取。 3. 数据源表结构更改:如果在Flink CDC进行消费之前,源表的结构发生了变化(例如,列添加或删除),则可能导致CDC消费器无法正确解析数据,并将所有值都设置为null。在这种情况下,需要更新CDC连接器配置以适应新的表结构。 解决这个问题的方法包括: 1. 仔细检查CDC连接器和数据源的配置,确保配置正确且一致。 2. 检查源表结构是否有变化,如果有变化需要更新CDC连接器的配置。 3. 在消费过程中添加日志输出,以便能够观察到具体的解析过程和数据情况,从而更好地定位问题。 4. 检查数据源中的数据是否存在异常或错误格式,可能需要预处理数据来确保其格式正确。 5. 如果问题仍然存在,可以尝试使用其他的CDC工具或方法来消费PG数据,比如使用第三方的CDC工具。 总之,消费PG数据时出现全部为null值的情况可能是由于配置错误、表结构变化或数据格式问题导致的。通过仔细检查配置、更新表结构和进行数据预处理等方法,可以解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值