达梦 & 人大金仓适配实战:SeaTunnel 在信创数据平台中的应用与踩坑总结

作者 | 三线程序员
Tags | MySQL Doris PG 达梦 金仓
关键词 | SeaTunnel、DolphinScheduler、信创、国产、达梦、人大金仓
- 适用版本:apache-seatunnel-2.3.8+、apache-dolphinscheduler-3.1.7、人大金仓8.6/9.x
- 预估阅读:10 min
一、为什么要写这篇
集团内部关于数据平台近期遇到了两次异构数据源的问题,洽好利用了开源工具简单应对,验证了自己目前工作的思路,正好总结一下分享过程中的收获也经验。以下只谈技术方案选择与经验分享,不讨论数据量、性能、安全等其它内容。
a) 数据中转归集:现有数据平台需要将部分数据数据上报给行业平台,同时还要将另一条第三方物联数据做数据归集中转后再进行上报行业平台。。
b) 国产化信创可控切换:明年技术平台指标项信创切换的前期验证工作,需要验证业务系统与数据平台一体信创国产化信创切换风险验证,将现有 MySQL → 达梦 / 人大金仓 之间做迁移。
根据二三线城市实际公司和技术水平情况、调研了数据采集/集成项目后,暂定 Apache SeaTunnel 的核心原因:
- 插件式架构,Source/Sink 支持 100+,新增国产库只需改 JDBC Driver; 考虑使用SeaTunnel 进行导入数据,同时考虑datax做为备用方案;(原则seatunnel支持自动建表,datax只支持导入无法自动建表,需要手动建表工作量较大。)
- 天然集成 DolphinScheduler,调度方便可观测性及管理运维易用性高;
笔者在整个过程中趟了不少坑,经验在四五六节中进行了总结,因此成文,给社区回流经验,也作为内部复盘的内容。
二、整体需求
- 利用 SeaTunnel 的 jdbc source和达梦专用sink实现数据数据上报,由于上报表比较多,需要利用seatunnel的自动建表和字段映射解决过程中兼容问题;
- 使用人大金仓数据库替换数据平台webDB和ds的调度持久化DB,同时验证seatunnel做为数据平台的数据采集模块的延伸方案(原有为doris jdbc catalog),读写kingbase数据库进行数据采集计算;
三、前置条件
| 内容项 | 要求说明 |
|---|---|
| 目标库 | 达梦数据库,人大金仓数据库 V8.6以上,账号具备 SELECT, SHOW VIEW等 权限 |
| 相关数据库jdbc驱动依赖jar包 | connectors目录:connector-jdbc-2.3.12.jar lib目录:达梦DmJdbcDriver8.jar、金仓kingbase8-8.6.0.jar、mysql-connector-j-8.3.0.jar、postgresql-42.7.3.jar |
四、安装测试运行
有经验的朋友可直接跳过,本节主要介绍个人遇到的一些安装注意事项。
1. 安装一个字,简单快捷。
步骤:下载、解压、安装连接器、测试。(本人暂时只试用了自带的 Zeta 引擎,其它引擎和集群未使用,目前满足离线 ETL 常规需求)
需要重点介绍一下安装连接器,如果网络不好或者maven懒得改代理、着急快速部署、验证新版本什么的,可以直接修改apache-seatunnel-2.3.8\config目录下的plugin_config文件,只保留需要的连接器;

如我只连常用数据库就保留connector-jdbc,只连DDoris数据仓库就保留connector-doris其它的删除掉或注释掉。具体所需对照可以查看\apache-seatunnel-2.3.8\connectors目录下的plugin-mapping.properties文件,里面有详细的source和sink所需要对应的连接器。

配置好了直接运行脚本就可以了,进目录cd apache-seatunnel-2.3.8/安装命令sh bin/install-plugin.sh 2.3.8,不指定版本号注安装当前版本的;安装完毕,你的connector目录就会多出许多连接器jar包。老手熟的话可以不安装(panda哥就没用过),直接从原有安装机器或本地把下载好的连接器,手动传上去也可以正常运行。
这里有个神奇的情况,在Windows环境下有时候连接器历史下载过可能重新部署后没再次下载,仍然可以运行。但在某一个特定的时间点就又开始报错说缺少jdbc连接器。神奇的系统。

2. 这里有两个概念需要理解一下
一个是连接器: 既使用什么方式进行数据连接,常见的http、文件、数据库jdbc。(一般运行时报什么jdbc错误,八成是没下载jdbc连接器。install-plugin没?)
一个是驱动包: 特定数据源的连接驱动、常见的mysql、pg等。(一般运行时连接失败,九成是没放对应的数据库驱动。)驱动包要自己手动扔啊,手动,手动。

3.测试demo
# 切换工作目录至Apache SeaTunnel 2.3.8的安装目录
cd /opt/apache-seatunnel-2.3.8/
# 执行SeaTunnel批处理任务
# 参数说明:
# --config:指定任务配置文件路径,此处为默认的批处理配置模板
# -m local:指定运行模式为本地模式(无需集群环境)
./bin/seatunnel.sh --config ./config/v2.batch.config.template -m local
运行时需要注意的就是windows命令行乱码,字符集换行符什么的这些问题,最一统的解决方案就是别直接windows的传linux上去混用,大不了重写或贴过去。cmd运行时控制台中文信息乱码解决是 chcp 65001 。

⚠️ 再次提醒,无论运行什么类型的etl,涉及的连接器和驱动包要保证都有,报错时第一时间核对这个,不要死盯着报错重试了。特别是在Windows环境下,Linux大法还是好。
4. 小分享
作业文件习惯单独建一个job目录存放。(与DolphinScheduler集成有时间再写吧,欠的东西太多了。)
常用conf样例,可直接cv修改,注意Doris作为sink写入时使用的是streamload方式,要用对应的http端口,不是Navicat连接的端口(大年纪程序员经常忘):
mysql 2doris样例
env {
parallelism = 2
job.mode = "BATCH"
}
source {
Jdbc {
url = "jdbc:mysql://192.168.0.31:3306/cons"
driver = "com.mysql.cj.jdbc.Driver"
connection_check_timeout_sec = 100
user = "root"
password = "123456"
table_path = "cons.community_info"
query = "select * from cons.community_info"
}
}
sink {
Doris {
fenodes = "192.168.0.110:8030"
username = "root"
password = "123456"
database = "data_test"
table = "ods_xyz_communityinfo_base"0
sink.enable - 2pc = "true"
sink.label - prefix = "test123"
doris.config = {
format = "json"
read_json_by_line = "true"
}
}
}
mysql 2doris 多表样例(有复杂业务需要json一条数据变拆分成多行的可参考 https://github.com/apache/seatunnel/issues/7961 使用SELECT * FROM fake LATERAL VIEW OUTER EXPLODE(cpe_nodes) as cpe_nodes函数)
env {
job.mode = "BATCH"
parallelism = 4
}
source {
Jdbc {
url = "jdbc:mysql://192.168.0.31:3306/cons"
driver = "com.mysql.cj.jdbc.Driver"
connection_check_timeout_sec = 100
user = "root"
password = "qianhe999"
"table_list"=[
{
"table_path"="cons.gas_alarm_events"
},
{
"table_path"="cons.gas_check_dispatch"
}
]
}
sink {
Doris {
fenodes = "192.168.0.110:8030"
username = "root"
password = "123456"
database = "data_test"
sink.enable - 2pc = "true"
sink.label - prefix = "test123"
table = "ods_xyz_${table_name}_base"
doris.config = {
format = "json"
read_json_by_line = "true"
}
}
}
自动建表模板doris版本
save_mode_create_template = """CREATE TABLE IF NOT EXISTS ${database}.${table_name} (
${rowtype_primary_key},
${rowtype_fields},
decoded_project_description STRING
)
ENGINE=OLAP
UNIQUE KEY (${rowtype_primary_key})
COMMENT '${comment}'
DISTRIBUTED BY HASH (${rowtype_primary_key})
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"in_memory" = "false",
"storage_format" = "V2",
"disable_auto_compaction" = "false"
)"""
http接口2 Doris 样例(http的主要参考了git的文章 https://github.com/apache/seatunnel/issues/8431)
env {
execution.parallelism = 2
job.mode = "BATCH"
checkpoint.interval = 10000
}
source {
Http {
url = "http://192.168.0.1120:31907/biz-data-service/241211/ABC_o1_XYZ"
method = "POST"
format = "json"
headers = {Accept="application/json",Content-Type="application/json;charset=utf-8"}
body= "{\"params\":{\"branch\":\"长安区\"},\"size\":10,\"current\":1}"
content_field = "$.data.records.*"
schema = {
fields {
mc=string
dz=string
last_update=timestamp
jd="decimal(20, 5)"
id :int
mplx=string
wd=string
}
}
}
}
sink {
Doris {
fenodes = "192.168.0.110:8030"
username = "root"
password = "123456"
database = "data_test"
table = "ods_xyz_http_base"
save_mode_create_template = """CREATE TABLE IF NOT EXISTS ${database}.${table_name} (
cid bigint NOT NULL AUTO_INCREMENT(1) COMMENT '主键',
${rowtype_fields}
) ENGINE=OLAP
UNIQUE KEY (cid)
DISTRIBUTED BY HASH (cid) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"in_memory" = "false",
"storage_format" = "V2",
"disable_auto_compaction" = "false"
)"""
data_save_mode = "DROP_DATA" # 默认是追加,这里测试了一下清表。既每次只保留最新一次。
sink.enable - 2pc = "true"
sink.label - prefix = "test123"
doris.config = {
format = "json"
read_json_by_line = "true"
}
}
}
五、读Doris写达梦数据库操作步骤
首先需要确保SeaTunnel能正常运行,需要在Linux服务器库或Windows命令行上进行验证,基础的SeaTunnel本地的Zeta引擎可以正常工作运行。
如用 Windows,可能会出现SeaTunnel今天能运行,明天不能运行的特殊情况(报错内容是“找不到或无法加载主类”);我没有彻底解决,但在网上找的方案大部分都是java环境变量设置的情况,还有就是关掉命令窗口重新打开。但偶尔有机会确实再次出现,隔天就没事了。神奇的系统!
1. 正常情况
-- 官方模板一次通
env {
parallelism = 1
job.mode = "BATCH"
}
source {
Jdbc {
url = "jdbc:dm://e2e_dmdb:5236"
driver = "dm.jdbc.driver.DmDriver"
connection_check_timeout_sec = 1000
user = "SYSDBA"
password = "SYSDBA"
query = """select * from "SYSDBA".e2e_table_source"""
}
}
sink {
Jdbc {
url = "jdbc:dm://e2e_dmdb:5236"
driver = "dm.jdbc.driver.DmDriver"
connection_check_timeout_sec = 1000
user = "SYSDBA"
password = "SYSDBA"
query = """
INSERT INTO SYSDBA.e2e_table_sink (DM_BIT, DM_INT, DM_INTEGER, DM_PLS_INTEGER, DM_TINYINT, DM_BYTE, DM_SMALLINT, DM_BIGINT, DM_NUMERIC, DM_NUMBER,
DM_DECIMAL, DM_DEC, DM_REAL, DM_FLOAT, DM_DOUBLE_PRECISION, DM_DOUBLE, DM_CHAR, DM_CHARACTER, DM_VARCHAR, DM_VARCHAR2, DM_TEXT, DM_LONG,
DM_LONGVARCHAR, DM_CLOB, DM_TIMESTAMP, DM_DATETIME, DM_DATE, DM_BLOB, DM_BINARY, DM_VARBINARY, DM_LONGVARBINARY, DM_IMAGE, DM_BFILE)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
}
}
2.我跳的坑(读Doris写达梦,流水帐形式就当小说看)
2.1.SeaTunnel使用中遇到的问题
(1) 表或视图不存在
手写query正常,动态却不行,generate_sink_sql =true不行。最终需要追加上数据库名称,而且源表是Doris表都是小写,而目标表是达梦表库表字段都是大写,所以会报表不存在。
(2) 源与目标表名大小写方式不一致
需要追加转换功能,字段大小写也需要转换。
表转换需要使用Transform,并且追加源表别名与目标表表别名,方便操作。
transform {
TableRename {
plugin_input = "source_doris"
plugin_output = "desc_dameng"
convert_case = "UPPER"
}
}
字段转换
sink {
Jdbc {
plugin_input = "desc_dameng"
url = "jdbc:dm://dmhost:2070?schema=X_Y_Z_KFC"
driver = "dm.jdbc.driver.DmDriver"
user = "X_Y_Z_USE"
password = "123456"
database = "DAMENGKFC"
table = "X_Y_Z_KFC.${table_name}"
generate_sink_sql = true
field_ide="UPPERCASE"
schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
data_save_mode="DROP_DATA"
dialect ="Dameng" --好像没啥实际意义(说是会根据jdbc连接串推算)
}
}
(3) 无法创建表
低版本不支持达梦建表(2.3.8就没有达梦的ddl创建表的方法,达梦数据库sink写入时ddl自动建表方法是在2.10后才追加的),最终升级到2.3.10并下载对应的connector连接包还是不行。
版本升级最新与更新最新的连接包(中间下载时间太长,使用了从maven上直接手动下载的包,最后对了一下大小都一样。没有问题。。。)又升级到了2.3.12版本也是无法自动建表。
Dialect方言显示指定也不行(包括相应的lib包也都加上了。。。还是不行,甚至怀疑过达梦的驱动包有问题,是否需要找商厂要个驱动才能用)。
最终验证与字段注释有关,表注释直接就扔了根本不建。只要表中有字段就报commont 语法解析问题。
2.2. 两头走不通的折中方案
(1) 使用达梦迁移工具
在测试环境没有问题,在生产环境Doris版本升级了竟然报读取错误了。。。(测试环境是Doris 2.1.3,生产是2.1.9版本,估计是哪有差异。)
(2) 手动建表
参考MySQL导入达梦,使用Linux的脚本处理dump的SQL脚本 。
把字段和表注释去除,使用AI处理了一上午,只能把表字段注释去掉。但是无法把字段注释和表注释单独弄到一个脚本中,只能生成一个所谓的纯净建表语句。
但突然发现导出的数据类型肯定在达梦中无法执行,需要转换。对应到各种不同的类型,这个对应再用手工做一遍,考虑放弃此方案。
(3) 灵感闪现-直接删除表的注释
通过schema_info直接用sql拼出一堆清注释的语句。
还有个小波折,差点这个方案也不能用了。就是Doris的默认值,开始转换时使用的SQL
ALTER TABLE dwd_X_Y_base MODIFY COLUMN filedA1 varchar(255) COMMENT "";指定了字段类型,当有字段last_update有默认值时不允许修改。后来仔细查了查官网文档,Doris还是做了人的,有专门单独去注释的语句,不加字段类型就行了。
2.3 最终可行方案-半手工方案
利用现有的备份库,或者直接重新做个临时备份;思路就是通过备份库去把表建上,再切到正式库去做真实的数据同步。
(1) 在备份库上把所有注释去了
a. 选择表范围。(只取Xyz的底层数据表,用于分业务去做同步SeaTunnel拼哪些表做同步)
SELECT * FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'data_test_backup'
AND ( TABLE_NAME like 'ods_xyz_%' or TABLE_NAME like 'dwd_xyz%') ;
b. 选择去除字段注释的内容。
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.',TABLE_NAME, ' MODIFY COLUMN ', COLUMN_NAME, ' ', ' COMMENT "";') AS alter_sql
FROM
information_schema.columns
WHERE
TABLE_SCHEMA = 'data_test_backup'
AND (table_name LIKE 'ods_xyz_%' OR TABLE_NAME LIKE 'dwd_xyz%')
AND LENGTH(COLUMN_COMMENT) > 0;
c. 复制出清除字段脚本,在备份库上直接执行。
alter table ods_xyz_1001_base modify column filed1 comment "";
alter table ods_xyz_1001_base modify column filed2 comment "";
.....
ctrl+A 、 ctrl +R 全选运行。
(2) 使用备份库把数据第一次自动建表导进去。
新建xyz_low1.conf读取备份库建表初始化到达梦,未把多表改成正则去匹配,是方便调试找错。直接把表名扔给AI生成table_path数组,也方便以后做真增量时,直接在sql中追加限制条件。
env {
parallelism = 2
job.mode = "BATCH"
}
source {
Jdbc {
plugin_output = "source_doris"
url = "jdbc:mysql://backuphost:9030/data_test_backup"
driver = "com.mysql.cj.jdbc.Driver"
connection_check_timeout_sec = 100
user = "XXX"
password = "******"
table_list = [
{
table_path = "data_test_backup.dwd_xyz_1001_base"
query = "select * from data_test_backup.dwd_xyz_1001_base"
},
{
table_path = "data_test_backup.dwd_xyz_1002_base"
query = "select * from data_test_backup.dwd_xyz_1002_base"
},
.....
]
}
}
transform {
TableRename {
plugin_input = "source_doris"
plugin_output = "desc_dameng"
convert_case = "UPPER"
}
}
sink {
Jdbc {
plugin_input = "desc_dameng"
url = "jdbc:dm://101.2.3.4:2026?schema=X_Y_Z_KFC"
driver = "dm.jdbc.driver.DmDriver"
user = "X_Y_Z_USE"
password = "123456"
database = "DAMENGKFC"
table = "X_Y_Z_KFC.${table_name}"
generate_sink_sql = true
field_ide="UPPERCASE"
schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
data_save_mode="DROP_DATA"
dialect ="Dameng"
}
}
(3) 切回同步从库直接读取最新数据
复制备份库的配置文件,修改数据库ip地址端口密码等信息,就可直接运行了。
(4) 同时拼出来在达梦里需要追加的语句
追加表注释。
SELECT CONCAT('COMMENT ON TABLE ', upper(TABLE_NAME), ' IS ''', TABLE_COMMENT, ''';')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'data_test'
AND (table_name LIKE 'ods_xyz_%' OR TABLE_NAME LIKE 'dwd_xyz_%')
在达梦数据库上执行!把自动建表的表注释补出来。
有条件追加字段注释(当时任务急,未来可期你懂的)。
(5) 加工层导入时的遇到的新问题(ads层字段创建不规范导致)
个别语句有问题的需要调整修改一下,记得重新把先表删除了,再改配置文件中的内容。
{
table_path = "data_test_backup.ads_xyz_1001_agg"
query = "select label_type,`sum(total)` as 'totalnum',sord_num from data_test_backup.ads_xyz_1001_agg"
},
2.4 配个定时就OK
Windows、Linux直接脚本定时,或者集成ds进行配置可视化任务。
Windows下的bat脚本
@echo off
rem 先切到 SeaTunnel 的 bin 目录
cd /d "E:\apache-seatunnel-2.3.12-bin\apache-seatunnel-2.3.12\bin"
rem 执行作业
seatunnel.cmd --config ./job/xyz_low.conf -m local
3. 写达梦数据库的总结
通过学习达梦数据库,笔者发现它本身就是Oracle的魔改版本,有点像把PG和Oracle捏在了一起,加了个PG的Schema,语法全是Oracle的。笔者主要利用了SeaTunnel的自动建表功能,特别是字段类型映射转换节省了大量时间,但研究的时间也不短。
同时,笔者也发现了一些问题,比如表注释会丢弃,这些还好,反正就是一次性的事手动补一下,直接用sql生成一下脚本即可。
在报错调试方面,似乎由于线程的问题,会把同线程的其它表的无错的内容报成异常打印出来。
还有就是关于表结构的问题,要注意调试过程中手动删除表,因为默认使用的参数是schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST",如果表已经存在不会再创建表,容易造成建的表有问题,而发生奇怪的异常报错。
4. 另一时间线
后续平台又需要与第三方物联系统做数据对接,就直接利用了Doris stream load技术来实现,分享一下经验:最终需要将http接口外网暴露的地址是Doris的be端口,而非fe端口。
中间还验证了一个拉的方式,就是利用SeaTunnel的http连接器,去拉数据。这里有个小问题,就是需要做鉴权,有时间会再做个分享。(方法很low但验证可行。)
六、读写人大金仓数据库操作步骤(信创)
信创就是我人生的至暗时刻,刚经历了达梦又得弄Kingbase,但最终对自己个人成长还是有助力的,不说信创数据库怎么兼容的各种问题吧,在时下这个环境换个角度看,这可能就是一种“技术壁垒”。也没时间写内部技术文档了,直接从头回忆吧。
1. 坑Kingbase初理解
先说开放性kingbase至少比达梦强,官网给下载安装程序包,包括安装版和docker版本,还可以免费申请测试的授权证书,开发授权最多有1年的试用期。这一点就敞亮、局气。首先和身边的前同事(现在还是好朋友)打听了一下,他们之前试用过,大概就是Kingbase是个套壳,底层是pg,改了改几个函数,论开放性有个叫瀚高的更开放,基本没有魔改的,本着原生的一致进行了二开。
然后运维大哥三下五除二就把docker拉起来,高高兴兴选择了下MySQL模式,结果MySQL的驱动不能直接连,必须要用Kingbase的原生,中间省略各种问题,最终又装了一个pg模式的。
概念就一个:Kingbase有多种兼容模式,mysql/pg/sqlserver什么的。。。理论上不考虑这个兼容模式用Kingbase原生的驱动肯定都能连接。如果知道具体的兼容模式,可以尝试用兼容的驱动连接。如pg模式直接用pg驱动就可以连接,但MySQL模式Navicat就不能用MySQL的驱动连接。
KSQL是Kingbase自己的连接工具,有必要也安装一个,它的驱动就是用的Kingbase原生的驱动。
2. 预期设想
听劝MySQL兼容模式不好用,咱就用底层原生的最稳定了,当年kmx直接用的Cassandra读的妥妥的好。那就准备用Kingbase的pg兼容模式做为源和目标了。
在SeanTunnel官方文档上查了一下,支持Kingbase,但是,但是,但是,只有部分类型兼容!又在技术群里圈了一下panda大佬交流了Kingbase的读写情况,收获良多,再次感谢!!!感谢!!!感谢!!!
jdbc:kingbase8的不归路就开始了....(这里source和sink的库都是Kingbase的pg模式)
env {
parallelism = 2
job.mode = "BATCH"
}
source {
Jdbc {
driver = "com.kingbase8.Driver"
url = "jdbc:kingbase8://192.168.0.31:4322/sourcedb"
user = "kingbase"
password = "123456"
query = "select * from source_user_detail"
}
}
sink {
jdbc {
url = "jdbc:kingbase8://192.168.0.119:4322/targerdb"
driver = "com.kingbase8.Driver"
user = "kingbase"
password = "123456"
generate_sink_sql = true
database = targerdb
table = public.target_user_detail
#schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
data_save_mode="APPEND_DATA"
}
}
一切顺利,不到“10”分钟就搞定了;当时测试的小遗憾是不能schema_save_mode自动建表。在交流群里吐槽了一下,也感谢迅哥儿和西门分享经验和想法!!
后来panda大佬要给Kingbase立flag说可以支持,我是测试了不行;panda佬说Kingbase是继承pg的代码都支持,还提醒嘱咐source不能用query,无法自动建表,要用tabl_path是个坑,让我记到文章里提醒大家,“造福更多使用者”。最终panda佬可能查了查源码确认了打脸,“Kingbase在建表那块没适配”,但这不是重点。
重点是:“用pg连接器是可以地,如果你Kingbase本身是pg兼容模式 那可以用pg的,只要元数据检查能通过。那就换成pg驱动和配置试试”,结论就是“把kingbase的pg模式就当成jdbc的pg用”,而且可以自动建表等参数都能用了。“pg支持啥它支持啥”。
source {
Jdbc {
driver = "org.postgresql.Driver"
url = "jdbc:postgresql://192.168.0.31:4322/sourcedb"
user = "kingbase"
password = "123456"
table_path = "sourcedb.public.source_user_detail"
}
}
sink {
jdbc {
url = "jdbc:postgresql://192.168.0.119:4322/targerdb"
driver = "org.postgresql.Driver"
user = "kingbase"
password = "123456"
generate_sink_sql = true
database = targerdb
table = public.target_user_detail
schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
data_save_mode="APPEND_DATA"
}
}
满心欢喜的下班,一切都太顺利了。。。
3. 突变大转折
业务也要做信创准备,那帮子老古董就咬死了我这祖传代码就是MySQL,信创我也是用金仓的MySQL兼容模式!!!!!我还提前分享了验证结论,告诉他们推荐用pg模式,可是人家业务就是这么横,让我们换pg,我这完全不接受,我找领导去!!!!!可想而知的结果,弄不了就是你们技术不行。我这血压一下子就上去了,@#¥%……&%……&……&(&¥%&……(**()¥%&……()¥#¥%
4. 背叛
这Kingbase的兼容MySQL模式肯定是类型有问题啊,这可怎么办?赶紧找其它办法吧。网上找了有什么Datamover,DataX( 老家伙),还有一直关注没用过的Tis赶紧弄过来试吧,时间紧任务重,Tis有docker版本,赶紧拉起来。试了一下还真行,点点点就弄好一张表!!!表也建上了数据也导过去了,挺好。
顺利吗....没过一会,说表的字段都是大写的,Kingbase默认是区分大小写的和pg一样。但是可以通过数据库初始化时指定,Docker下面指定那个参数是起不来的,运维大哥说只能填pg,填不了其它的。又是个两头堵死的情况,像不像达梦?。。。
简单看了看Tis底层用的DataX,建表语句可以自己修改字段名变小写,但是DataX的脚本不让改,直接拷出来在DataX上执行有问题,看不懂的错误。没时间了研究了。。。
5. 赌一把
晕晕忽忽一下午,压力大吃碳水多,感觉到压力与生活的影响了,就要自己调节。工作只是工作,还有生活。重新调整饮食,早上有时间还把家里的毛巾洗了洗,心情拉满去上班。
来吧,再试一把老朋友SeaTunnel!还是老三样,connector重下,驱动重放,执行文件编码问题。一关一关过呗,MySQL兼容类型有问题,我先跳过那个字段直接写死几个列,先跑一把给给自己信心。
注意环境有改变:192.168.0.31:4321 的Kingbase是MySQL兼容模式,192.168.0.119:4322是Kingbase的pg兼容模式。
所以source要用Kingbase的原生去读,字段转小写的问题,通过SQL先尝试解决,大力出奇迹,这些个牛马的事扔给AI弄;sink保留原来的pg也没事。
env {
parallelism = 2
job.mode = "BATCH"
}
source {
Jdbc {
driver = "com.kingbase8.Driver"
url = "jdbc:kingbase8://192.168.0.31:4321/kingbase"
user = "kingbase"
password = "123456"
query = "SELECT `ID` AS id,`PARENT_ID` AS parent_id,`DICT_LABEL` AS dict_label,`DICT_VALUE` AS dict_value,...REMARK` AS remark FROM public.dict;"
}
}
sink {
jdbc {
url = "jdbc:postgresql://192.168.0.119:4322/datatest"
driver = "org.postgresql.Driver"
user = "kingbase"
password = "123456"
generate_sink_sql = true
database = datatest
table = data_test.dim_busi_dict_001
schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
data_save_mode="APPEND_DATA"
}
}
经过9*9=81次调试,一把过了。高高兴兴找运维大哥说成了成了,运维大哥问了一句“int型的怎么解决的”?我#$%&&,我绕过去了。。。。晕了忘了个干净。
信心有了,可现实就是这么冰冷,int类型转换失败....AI说指定source的表结构类型,不管用....sql转换类型也没试成功.....不行,服软,花点钱买Kingbase的产品吧。最多也就这样了。
Panda佬的那句"用pg连接器是可以地",我又再次仔细理解了一下。是不是有什么没理解到?我用pg驱动读个Kingbase的MySQL兼容模式,再赌一把?
env {
parallelism = 2
job.mode = "BATCH"
}
source {
Jdbc {
driver = "org.postgresql.Driver"
url = "jdbc:postgresql://192.168.0.62:4321/kingbase"
user = "kingbase"
password = "123456"
query = "SELECT * FROM public.dict;"
}
}
sink {
jdbc {
url = "jdbc:postgresql://192.168.0.119:4322/datatest"
driver = "org.postgresql.Driver"
user = "kingbase"
password = "123456"
generate_sink_sql = true
database = datatest
table = data_test.dim_busi_dict_001
field_ide="LOWERCASE"
schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
data_save_mode="APPEND_DATA"
}
}
最后结局了肯定是过了,再tm不过这文章就没必要写这块了。后来拿Navicat直接连了一下Kingbase的MySQL兼容模式,也能连上。#¥%,原来是自己绕远了。
赶紧分享给群里的小伙伴,又和panda佬谈了体会,“那挺好啊”,原来世界真的很大,我们只在自己的井里。有些事只是自己没见过,但并不代表这个世界上没有。
2026.1.21 三线程序员
浙公网安备 33010602011771号