当前位置: 首页 > news >正文

kettle9.0 多库多表同步数据

一、需求:有30个库,每个库有53张表,需要将表中数据完整的同步到另一个库中,做备份用

1、主作业:读取数据库表信息,循环每个库。

image

image

 

2、次作业:读取库中的所有表,循环每个表。

image

 

image

 

image

 

image

 

// 作业级读取变量:用 parent_job.getVariable()(Kettle 9.0 作业级兼容写法)
var syncType = parent_job.getVariable("SYNC_TYPE", "increment");

// 运行后看日志中是否能看到"当前SYNC_TYPE=xxx",确认变量读取正确
if (syncType == "increment") {
// 增量:返回true → 走成功分支
true;
} else {
// 全量:返回false → 走失败分支
false;
}

image

 

3、单表作业:读取表中信息,根据数据的特点用来区分是全量同步还是增量同步。

image

 

 

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {

Object[] rowData = getRow();
if (rowData == null) {
setOutputDone();
return false;
}

// 读取转换级变量(适配Kettle 9.0)
String tableName = getTrans().getVariable("TABLE_NAME", "");
String fieldList = getTrans().getVariable("FIELD_LIST", "");
String pkField = "id";

// 空值校验:表名/字段列表为空时跳过
if (tableName.trim().isEmpty() || fieldList.trim().isEmpty()) {
logError("表名或字段列表为空,跳过当前行处理");
putRow(data.outputRowMeta, rowData);
return true;
}

// 拆分字段列表
String[] sourceFields = fieldList.trim().isEmpty() ? new String[0] : fieldList.split(",");

StringBuilder fields = new StringBuilder();
StringBuilder values = new StringBuilder();
StringBuilder updates = new StringBuilder();

// 遍历字段拼接SQL(仅处理源/目标表一致的字段)
for (int i = 0; i < sourceFields.length; i++) {
String fieldName = sourceFields[i].trim();
if (fieldName.isEmpty()) continue;

// 获取字段值和元数据
int idx = getInputRowMeta().indexOfValue(fieldName);
Object val = (idx >= 0) ? rowData[idx] : null;
ValueMetaInterface meta = (idx >= 0) ? getInputRowMeta().getValueMeta(idx) : null;

// 拼接字段名
fields.append("`").append(fieldName).append("`");

// 拼接字段值(兼容不同数据类型)
if (val == null) {
values.append("NULL");
} else if (meta != null && (meta.isNumeric() || meta.isInteger() || meta.isBigNumber())) {
values.append(val.toString());
} else if (meta != null && meta.isBoolean()) {
boolean b = "1".equals(val.toString()) || "true".equalsIgnoreCase(val.toString());
values.append(b ? "1" : "0");
} else {
String rawStr = val.toString();
String cleanStr = rawStr.replaceAll("[^\\u0000-\\uFFFF]", ""); // 移除 Emoji 等
String escapedStr = cleanStr.replace("\\", "\\\\").replace("'", "''");
values.append("'").append(escapedStr).append("'");
}

// 拼接更新子句(排除主键字段)
if (!fieldName.equalsIgnoreCase(pkField)) {
updates.append("`").append(fieldName).append("` = VALUES(`").append(fieldName).append("`)");
}

// 最后一个字段不加逗号,避免SQL语法错误
if (i < sourceFields.length - 1) {
fields.append(",");
values.append(",");
if (!fieldName.equalsIgnoreCase(pkField)) {
updates.append(",");
}
}
}

// 生成最终的INSERT/UPDATE SQL
String sql = "INSERT INTO `" + tableName + "` (" + fields.toString() + ") VALUES (" + values.toString() + ") ON DUPLICATE KEY UPDATE " + updates.toString();

// 输出SQL到下一个步骤
Object[] outputRow = createOutputRow(rowData, data.outputRowMeta.size());
get(Fields.Out, "dynamic_sql").setValue(outputRow, sql);
putRow(data.outputRowMeta, outputRow);

return true;
}

 全量同步的时候,需要查询所有的数据,在表输出的时候需要勾选裁剪表,这个代表插入数据之前先清空数据。

image

 

http://www.jsqmd.com/news/69202/

相关文章:

  • 从意义行为原生到技术实现:现实情境编译器作为AI元人文的范式革命
  • 2025年口碑好的双胞胎婴儿车国货
  • 2025雅思培训机构高分逆袭指南:精准推荐+避坑选课全攻略
  • vue-dawn-flow 低代码流程插件
  • 百日挑战——单词篇(第二十天) - 指南
  • Webpack与Vite的常用设置及主要差异分析
  • 洛谷U639786 树的颜色询问 题解 树上启发式合并(dsu on tree)
  • 2025年热门的牛羊肉贴体膜/贴体膜厂家最新实力排行
  • 2025 年雅思培训口碑机构 TOP5 推荐
  • 灵光网页版AI助手,特斯拉集成Grok语音导航,阿里Qwen3-TTS横空出世
  • 软件工程学习日志2025.12.9
  • 2025年口碑好的网架工程/徐州煤棚网架厂家选购指南与推荐
  • 2025雅思培训机构怎么选?这篇攻略帮你避坑+精准提分!
  • 2025年热门的格栅机耙齿用户口碑最好的厂家榜
  • 英语自学工具进化论:告别哑巴英语,走向真实对话时代
  • 2025年比较好的融雪伴热带/高温伴热带厂家实力及用户口碑排行榜
  • 学英语,最好的软件其实是“组合拳”哪些英语软件最有效?
  • 【亲测】AI学术搜索哪家强?试了4款国产顶流,结果完全出乎意料!
  • 详细介绍:[Column] Perplexity 如何构建 AI 版 Google | 模型无关架构 | Vespa AI检索
  • 2025年英语自学软件精选:免费高效,轻松开启学习之旅
  • 2025年全国太阳能路灯厂家五大最新推荐:涵盖太阳能路灯、景观灯、庭院灯、高杆路灯、LED路灯厂家选择指南
  • 2025实测|5款英语学习软件封神!从零基础到流利说全靠它
  • 2025中国薪酬管理系统测评与选型指南:数字化转型下的企业决策
  • Oracle中行转列、列转行
  • 告别英语焦虑!这些英语自学神器让你快速逆袭
  • 2025年比较好的注塑机边粉碎机/粉碎机厂家推荐及选择参考
  • 解锁成人英语学习新方法,这些APP超神啦!
  • Java虚拟机(JVM)面试题(51道含答案) - 实践
  • 102302116_田自豪_作业4
  • Day58(28)-F:\vs_ai_work\vue-tlias-management