暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

保姆级教程:Apache Flink CDC(standalone 模式)部署 MySQL CDC、PostgreSQL CDC 及使用方法

michaelliu 2026-03-23
135

环境准备
软件

版本

备注

操作系统

centos7.9

一台

flink

1.18.1

https://www.apache.org/dyn/closer.lua/flink/flink-1.18.1/flink-1.18.1-bin-scala_2.12.tgz

flink-cdc

3.2.0

https://github.com/apache/flink-cdc/releases

flink-connector-jdbc

3.2.0-1.18

https://repo1.maven.org/maven2/org/apache/flink/flink-connector-jdbc/3.2.0-1.18/

flink-sql-connector-postgres-cdc

3.2.0

https://github.com/apache/flink-cdc/releases

flink-sql-connector-mysql-cdc

3.2.0

https://github.com/apache/flink-cdc/releases

mysql jdbc驱动

8.0.28

https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.28

postgresql jdbc驱动

42.6.0

https://mvnrepository.com/artifact/org.postgresql/postgresql

mysql

5+

/

java

1.8.0_421

/

postgresql

15+

/

1、安装包部署
1、mysql、pg自行安装(mysql -->pg)
安装完成后查看mysql是否开启binlog(数据库连接工具自行准备,我这里用的dbeaver)

show variables like '%log_bin%';
一键获取完整项目代码
如图,如果为OFF,则需要编辑my.cnf配置文件



编辑my.cnf配置文件(可以输入whereis my.cnf查询文件位置)

whereis my.cnf

vim /etc/my.cnf
一键获取完整项目代码
bash
增加下面内容

server_id = 1
binlog_format = ROW
log-bin = mysql_log_bin
一键获取完整项目代码
java


重启mysql,再次查看mysql是否开启 binlog

service mysql restart
一键获取完整项目代码
bash
2、部署flink环境以及cdc驱动包
官网下载flink安装包。(链接见上面环境准备)

下载flink-cdc所需的驱动jar包。(链接见上面环境准备)



放入linux环境中并解压缩

tar -zxvf flink-1.18.1-bin-scala_2.12.tgz
一键获取完整项目代码
bash
进入flink的lib目录上传四个依赖

cd flink-1.18.1/lib/
一键获取完整项目代码
bash
如图



修改flink配置文件

vim flink-1.18.1/conf/flink-conf.yaml
一键获取完整项目代码
bash
如图



进入到flink-1.18.1目录下执行

./bin/start-cluster.sh
一键获取完整项目代码
bash
如果没有防火墙可访问 ip:8081 (默认是8081端口 可在配置文件里修改)

3、书写flink-sql实时同步mysql数据到postgresql
创建mysql库和表,再库中添加几条数据

create database wjx;

use wjx

CREATE TABLE players (
player_id INT NOT NULL AUTO_INCREMENT,
team_id INT,
player_name VARCHAR(255),
height FLOAT(53),
PRIMARY KEY (player_id)
);

insert into players (player_id,team_id,player_name,height) values
(1001,1001,'韦德','1.93'),
(1002,1002,'雷吉','1.91'),
(1003,1003,'安德烈','2.11'),
(1004,1004,'索恩','2.16'),
(1005,1005,'兰斯顿','1.88'),
(1006,1006,'格伦','1.98'),
(1007,1007,'伊斯梅尔','1.83'),
(1008,1008,'扎扎','2.11'),
(1009,1009,'乔恩','2.08');

select * from players;
一键获取完整项目代码
sql

如图





在pg库中创建一个数据库,不插入数据

create database wjx;

\c wjx

CREATE TABLE players3 (
player_id INT NOT NULL,
team_id INT,
player_name VARCHAR(255),
height FLOAT(53),
PRIMARY KEY (player_id)
);
一键获取完整项目代码
sql

进入到flink-1.18.1目录下,启动flink-sql

./bin/sql-client.sh embedded
一键获取完整项目代码
bash
创建flink-sql源表

CREATE TABLE nbaplayers (
player_id INT,
team_id INT,
player_name VARCHAR,
height FLOAT,
PRIMARY KEY (player_id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '10.16.16.164',
'port' = '3306',
'username' = 'admin',
'password' = '******',
'database-name' = 'wjx',
'table-name' = 'players',
'server-time-zone' = 'Asia/Shanghai'
);
一键获取完整项目代码
sql

查看表

select * from nbaplayers;
一键获取完整项目代码
sql


创建flink-sql结果表

CREATE TABLE nba (
player_id INT,
team_id INT,
player_name VARCHAR,
height NUMERIC(3,2),
PRIMARY KEY (player_id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:postgresql://10.16.16.164:1921/wjx??currentSchema=public&reWriteBatchedInserts=true',
'username' = 'admin',
'password' = '******',
'table-name' = 'players3'
);
一键获取完整项目代码
sql

执行从源表插入表操作,生成同步作业

INSERT INTO nba
SELECT
player_id,
team_id,
player_name,
height
FROM nbaplayers;
一键获取完整项目代码
sql
测试一下是否同步

mysql执行

insert into players (player_id,team_id,player_name,height) values (9999,9999,'wjx','1.85');
一键获取完整项目代码
sql
mysql端



pg端:



2、源码部署
附:pg同步pg
1、安装pg(略)并配置wal日志
SHOW wal_level;
一键获取完整项目代码
sql


编辑配置文件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
一键获取完整项目代码
sql

发布表并更改表的标识

# 发布表
-- 设置发布为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 players REPLICA IDENTITY FULL;

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

一键获取完整项目代码
sql

2、部署flink环境以及cdc驱动包
第二步配置flink环境与上面方法相同,略。

3、书写flink-sql实时同步pg数据库
-- 源表
-- 创建数据库 wjx
CREATE DATABASE wjx;

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

-- 创建 players 表
CREATE TABLE public.players (
player_id int4 NOT NULL,
team_id int4 NULL,
player_name varchar(255) NULL,
height float8 NULL,
CONSTRAINT players_pkey PRIMARY KEY (player_id)
);

-- 目标端表相同
一键获取完整项目代码
sql

CREATE TABLE table_source_pg (
player_id INT,
team_id INT,
player_name VARCHAR,
height NUMERIC(3,2),
PRIMARY KEY(player_id) NOT ENFORCED
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '10.16.16.164',
'port' = '1921',
'username' = 'dbadmin',
'password' = '123456',
'database-name' = 'wjx',
'schema-name' = 'public',
'table-name' = 'players',
'slot.name' = 'flink',
'decoding.plugin.name' = 'pgoutput'
);


CREATE TABLE table_sink_pg (
player_id INT,
team_id INT,
player_name VARCHAR,
height NUMERIC(3,2),
PRIMARY KEY(player_id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:postgresql://10.16.16.164:1922/wjx??currentSchema=public&reWriteBatchedInserts=true',
'username' = 'dbadmin',
'password' = '123456',
'table-name' = 'players'
);

-- insert语句
INSERT INTO table_sink_pg
SELECT
player_id,
team_id,
player_name,
height
FROM table_source_pg;
一键获取完整项目代码
sql

可能用到的pg命令汇总
-- 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;
一键获取完整项目代码
sql

————————————————
版权声明:本文为CSDN博主「WJX_KOI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53237920/article/details/157134524

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论