
前言
最近项目上要求把数据库从MySQL迁移到国产数据库人大金仓,其中涉及到两个技术问题:
-
将
MySQL的数据迁移到金仓数据库; -
将项目上
Flink-MySQL-CDC的代码修改成Kingbase-CDC的代码;
第一个问题可以通过金仓官网提供的迁移工具KDTS,它支持WEB版,在linux环境也能使用。
第二个问题,看了一圈Flink和金仓数据库的官网,没有找到官方提供的CDC方案。又想到Flink官方对MySQL、PostgreSQL和Oracle这些主流数据库都提供了官方CDC方案,而金仓数据库对它们也做了高度的兼容性适配,所以我就从这个角度开始寻找解决思路,最后我的答案是使用Postgre-CDC。
**为什么人大金仓数据库可以使用PostgreSQL数据库的驱动包实现Flink-CDC功能?**从下表可以看出人大金仓数据库是基于PostgreSQL开发,同样都支持WAL日志的逻辑复制,所以人大金仓数据库对PostgreSQL高度兼容。

添加依赖
添加 PostgreSQL 驱动包,重启 Flink 服务和 Dinky服务。不知道怎么部署 Flink 和 Dinky的童鞋可以看我以前发表过的文章。
bash
# 在 ${FLINK_HOME}/lib 下添加 PostgreSQL 驱动包
mv /ops/app/postgresql-42.5.0.jar /ops/app/flink/lib/postgresql-42.5.0.jar
# 在 ${DINKY_HOME}/lib 下添加 PostgreSQL 驱动包
mv /ops/app/postgresql-42.5.0.jar /ops/app/dinky/customJar/postgresql-42.5.0.jar
# 重启Flink
/ops/app/flink/bin/stop-cluster.sh
/ops/app/flink/bin/start-cluster.sh
# 重启Dinky
/ops/app/dinky/bin/auto.sh restart
修改数据库配置
本文部署的Kingbase数据库版本是V008R006C009B0014 ,通过select version()语句查询。kingbase.conf配置文件的默认路径是在数据库的数据目录下,例如:/opt/Kingbase/ES/V8/data/kingbase.conf
ini
vim /ops/app/kingbase/data/data/kingbase.conf
#修改wal_level配置为logical,默认是replica
wal_level = logical
# 重启服务
docker restart kingbase
#数据库查看配置是否生效
SHOW wal_level;
wal_level的各个级别以及所代表的含义如下表:

Flink-CDC SQL
在Dinky的数据开发中新建一个任务脚本,写下如下SQL代码:
SQL
SET sql-client.execution.result-mode=tableau;
CREATE TABLE source_table (
`id` STRING COMMENT '主键id',
`created_time` BIGINT NOT NULL COMMENT '创建时间',
`remark` STRING,
PRIMARY KEY ( `id` ) NOT ENFORCED
) WITH (
'connector' = 'postgres-cdc',
'hostname' = 'xxx.xxx.xxx.xxx',
'port' = '54321',
'username' = 'kingbase',
'password' = 'xxxxxx',
'database-name' = 'kingbase',
'schema-name' = 'public',
'table-name' = 'iot_dict_info',
'slot.name' = 'postgre_cdc_slot_source_table', -- 请修改为具有业务意义的唯一名称,可以随意
'scan.startup.mode' = 'initial',
'debezium.database.tablename.case.insensitive' = 'false',
'debezium.lob.enabled' = 'true'
);
CREATE TABLE target_table (
`id` STRING COMMENT '主键id',
`created_time` BIGINT NOT NULL COMMENT '创建时间',
`remark` STRING,
PRIMARY KEY ( `id` ) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' ='jdbc:postgresql://xxx.xxx.xxx.xxx:54321/kingbase',
'username' = 'kingbase',
'password' = 'xxxxxx',
'table-name' = 'public.iot_dict_info2',
'driver' = 'org.postgresql.Driver',
'scan.fetch-size' = '200'
) ;
insert into target_table
select * from source_table;
以上代码主要目的就是通过CDC方式,从源表iot_dict_info读取数据写到目标表iot_dict_info2。和MySQL-CDC的主要不同点是,Postgre-CDC有一个slot.name的必填配置,一般来说建议每个任务都有各自的唯一名称,名称可以自由发挥。Kingbase和PostgreSQL一样都支持Schema,这一点和MySQL也不同,所以还需要一个schema-name配置。本文示例中的database-schema-table的三层结构是kingbase-public-iot_dict_info。
iot_dict_info源表数据如下

iot_dict_info2目标表同步后数据如下

参考
KingbaseES V9 --- KingbaseES产品手册