news 2026/8/8 8:15:24

DMDIS 单机部署、数据清洗与周期增量同步实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DMDIS 单机部署、数据清洗与周期增量同步实践

本文先介绍 DMDIS 的产品定位、主要作用和典型使用场景,再基于已完成的 DMDIS V5.2.0.1 实验环境,说明安装准备、服务验证、数据源配置、数据清洗、增量同步、作业调度和结果核验。


1. DMDIS 概述

1.1 DMDIS定义

DMDIS 是达梦提供的专业实时数据集成软件,集数据迁移、数据同步、清洗转换和数据整合于一体。它通过可视化方式连接数据库、文件及其他数据源,将数据抽取、传输、处理和装载组织成可执行的转换与作业。

1.2 DMDIS 作用

数据迁移:将源系统中的存量数据批量迁移到目标系统。

数据同步:按全量、增量或周期方式保持源端与目标端数据一致。

数据清洗:处理空值、格式不统一、字段映射和编码转换等问题。

数据整合:汇总不同来源的数据,为数据仓库、数据中心和报表系统提供统一数据。

作业调度:按照时间或周期自动执行转换、脚本和统计任务,并记录运行状态。

1.3 常见使用场景

DMDIS 常用于数据库升级替代、异构数据同步、数据仓库或数据中心建设、周期性报表数据准备,以及需要集中编排和监控的数据处理任务。单机模式适合学习和小型项目,规模更大或可靠性要求更高时可根据实际产品版本规划集群部署。

1.4 本文实践内容

本次示例以 DM8 的 HOTEL.PERSON_INFO 为源表,将数据清洗后写入 HOTEL.旅客信息一览表,并生成总人数、男性人数和女性人数统计。转换链覆盖增量读取、姓名繁简转换、年龄计算、联系方式空值处理、性别标准化、增量装载和周期调度。


2. 本次实践架构与实现结果

DMDIS 用于连接不同数据源,并通过可视化转换和作业完成数据抽取、清洗、映射、装载与调度。本次采用单机部署,数据流为“DM8 源表 → 增量读取 → 清洗与列转换 → 增量装载 → 统计作业”。

项目

本次配置

验收标准

DMDIS

V5.2.0.1 单机模式,管理端口 8800

Web 页面可访问,服务进程正常

源端

192.168.80.21:5236,HOTEL.PERSON_INFO

源表可读取,增量字段可识别

目标端

DM8 目标库,HOTEL.旅客信息一览表

姓名、年龄、联系方式、性别清洗正确

调度

作业绑定 perMinute 周期调度

执行历史连续成功,验证后可停用

统计

HOTEL.旅客信息统计表

总人数 4、男性 2、女性 2


3. 实验环境与安装准备

3.1 账号、目录与安装包

安装前先确认 CPU 架构、安装介质和校验文件,再准备 dinstall 用户组、dmdis 用户及独立软件目录。安装、运行和后续维护尽量统一使用 dmdis,避免目录属主混乱。

lscpu | grep -E '^CPU\(s\)|^Architecture|^Model name'
getent group dinstall

# root 执行
useradd -g dinstall -m -d /home/dmdis -s /bin/bash dmdis
passwd dmdis
mkdir -p /home/dmdis/software /home/dmdis/tmp
chown -R dmdis:dinstall /home/dmdis
chmod 755 /home/dmdis /home/dmdis/software

# 将安装包及校验文件放入 /home/dmdis/software 后核验
cd /home/dmdis/software
sha256sum dmdis_rev226131_x86_linux_64_20260703.bin

图 1 CPU、安装包、用户组、dmdis 用户和目录准备记录

3.2 执行单机安装

切换到 dmdis 用户,以字符方式启动安装程序。本次选择单机模式,使用随安装包提供的运行环境,并将管理端口设置为 8800。安装结束后应记录实际生成的版本目录,后续启停脚本以该目录为准。

su - dmdis
cd /home/dmdis/software
chmod +x dmdis_rev226131_x86_linux_64_20260703.bin
./dmdis_rev226131_x86_linux_64_20260703.bin -i

# 本次实际版本目录
/home/dmdis/dmdis5/20260804094943527000

安装向导中的目录、端口和元数据库选项应以当前介质与现场规划为准;不要在旧版本目录上直接覆盖安装。

3.3 启动与端口验证

服务启动后,从进程、监听端口和 HTTP 响应三个角度验证。HTTP 302 跳转到登录页说明 Web 服务已正常响应,不属于错误。

ps -ef | grep '/home/dmdis/dmdis5/20260804094943527000' | grep -v grep
ss -lntp | grep ':8800 '
curl -I http://127.0.0.1:8800/

# 维护时使用实际安装目录下的脚本
/home/dmdis/dmdis5/20260804094943527000/standalone/standalone_service_stop.sh

图 2 DMDIS 服务进程及 8800 端口 HTTP 响应验证


4. 源端与目标端数据准备

4.1 准备基础测试表

先用结构简单的部门表验证源库、目标库的连通性和装载方向。源端写入 10、20、30 三条部门数据,目标端保持空表,便于观察首次装载结果。

图 3 源端 DMDIS_DEPT_DEMO 测试数据

图 4 源端数据与目标端空表结构检查

4.2 配置 DM8 数据源

在“数据源”中新增 DM8 连接,填写服务器地址、端口、用户名和密码。测试连接成功后,展开模式和表,确认 DMDIS 能读取列定义。源端连接命名为 DM_SRC_DRSSRC,目标端另建独立连接,避免转换中选错方向。

图 5 DM_SRC_DRSSRC 数据源及表字段读取结果


5. 工程与增量转换配置

5.1 创建工程

创建工程 DMDIS_DM_SYNC,用于集中保存数据源、函数、转换、作业和调度。工程描述写明同步方向,便于后续检查和交接。

图 6 DMDIS_DM_SYNC 工程及同步方向说明

5.2 增量读取源表

在转换中加入增量表组件,选择源端 PERSON_INFO。除业务字段外,保留 CDC_ID 和 CDC_OPT,用于标识增量顺序和变更类型。首次运行前应确认源表主键、增量影子表或变更捕获状态正常。

图 7 增量表组件的 CDC 字段和业务字段

字段

用途

处理方式

CDC_ID

增量记录顺序

只用于增量控制,不写入目标业务列

CDC_OPT

变更操作类型

由增量组件传递给装载端

ID

身份证号/业务标识

映射为“身份证号”

NAME

姓名

繁体转简体后写入“姓名”

AGE

原始年龄

作为函数兜底参数,输出计算后的“年龄”

PHONE

联系方式

空值统一处理

GENDER

性别

英文值转换为男/女

5.3 自定义身份证年龄函数

创建 inferAgeFromID 函数:身份证号满足 18 位规则时,从出生年份计算年龄;格式不满足时返回原 AGE。保存函数后先执行解析检查,再在列转换中调用。

function inferAgeFromID(id, fallbackAge) {
if (id == null) return fallbackAge;
var text = String(id);
if (text.length != 18) return fallbackAge;
var birthYear = parseInt(text.substring(6, 10));
if (isNaN(birthYear)) return fallbackAge;
return new Date().getFullYear() - birthYear;
}

图 8 inferAgeFromID 自定义函数解析成功

5.4 数据清洗规则

清洗组件处理三类数据:姓名繁体转简体;联系方式为空时统一保留为空或替换为约定值;性别从 female/male 转为女/男。字符串替换按顺序执行,因此必须先处理 female,再处理 male。

图 9 姓名、联系方式和性别清洗规则

风险提示:如果先将 male 替换为“男”,female 会被部分匹配为“fe男”。更稳妥的做法是先处理 female,或改用完整值匹配。

5.5 列转换与目标映射

列转换中将英文列名映射为中文列名。年龄列使用表达式 inferAgeFromID(身份证号, 年龄),输出类型设为 Integer。CDC_ID、CDC_OPT 继续传给增量装载组件,但不映射到目标业务字段。

图 10 列转换中的字段类型、中文名和年龄表达式


6. 作业与周期调度

6.1 组装作业链

作业“作业-旅客信息更新与统计”由三个步骤组成:先执行 PERSON_INFO 清洗转换;再设置 guestCountTotal、guestCountMale、guestCountFemale 三个变量;最后执行 SQL 脚本,刷新统计表。步骤之间使用成功连线,任一步失败时停止后续统计。

图 11 转换、变量设置和 SQL 脚本组成的作业链

TRUNCATE TABLE HOTEL."旅客信息统计表";

INSERT INTO HOTEL."旅客信息统计表"("统计项目", "统计值")
VALUES ('1、总人数', ${guestCountTotal});
INSERT INTO HOTEL."旅客信息统计表"("统计项目", "统计值")
VALUES ('2、男性人数', ${guestCountMale});
INSERT INTO HOTEL."旅客信息统计表"("统计项目", "统计值")
VALUES ('3、女性人数', ${guestCountFemale});

6.2 创建并绑定调度

创建 perMinute 周期调度,用于快速观察增量同步。随后在作业调度页将该调度绑定到“作业-旅客信息更新与统计”,保存并启用。

图 12 perMinute 周期调度配置

图 13 作业与 perMinute 调度绑定

风险提示:每分钟调度仅用于实验验证。确认功能后应禁用调度,避免持续产生无意义的执行记录和日志。


7. 运行监控与结果验证

7.1 手工启动和执行历史

先手工运行作业并观察当前状态,确认转换和统计步骤均成功,再启用周期调度。运行历史中应连续出现成功记录;失败时先打开该次日志,定位到具体步骤。

图 14 作业进入运行状态

图 15 每分钟作业执行历史连续成功

7.2 数据库侧核验

最终验收不能只看 DMDIS 页面“成功”,还要回到数据库比对源表、目标表和统计表。源端 4 条记录经过转换后,目标姓名为简体,年龄由身份证年份重新计算,空联系方式保持一致,性别为男/女;统计表结果为 4、2、2。

SELECT ID, NAME, AGE, NVL(PHONE, '<NULL>') AS PHONE, GENDER
FROM HOTEL.PERSON_INFO ORDER BY ID;

SELECT "身份证号", "姓名", "年龄", NVL("联系方式", '<NULL>') AS "联系方式", "性别"
FROM HOTEL."旅客信息一览表" ORDER BY "身份证号";

SELECT "统计项目", "统计值"
FROM HOTEL."旅客信息统计表" ORDER BY "统计项目";

图 16 源表、清洗目标表和统计表最终一致性验证


8. 典型问题处理

8.1 性别出现“fe男”

图 17 错误替换顺序导致 female 被转换为 fe男

环节

处理记录

现象

女性数据写入目标表后变为“fe男”,女性统计为 0。

原因

先执行 male→男,female 中包含 male,发生部分字符串替换。

验证

直接查询目标表和统计表,确认异常集中在 female 数据。

解决

将 female→女 放在 male→男 之前,或使用完整值匹配;保存后重新触发真实增量。

风险

仅在源表把 female 更新为相同的 female 不会产生新的 CDC 差异,修正规则后可能看不到重跑效果。

复盘

字符串规则应检查包含关系、大小写和空值;修改规则后必须设计可识别的增量测试。

8.2 年龄表达式提示未定义变量

环节

处理记录

现象

列转换保存或运行时提示“未定义的变量:年龄”。

原因

表达式引用了当前步骤中不存在的中文名,或 AGE 在前一步被删除。

验证

从上游组件重新加载列信息,检查 AGE/年龄是否仍在输入列中。

解决

保留 AGE 作为中间列,并在列转换中使用 inferAgeFromID(身份证号, 年龄),输出类型设为 Integer。

风险

直接删除原 AGE 会失去身份证号异常时的兜底值。

复盘

自定义函数的参数名、输入列名和目标列名要分层检查,不混用源字段与中文别名。


9. 参考资料

  1. 达梦在线服务平台:《达梦数据集成软件(DMDIS)》
    网址:达梦数据集成软件 | 达梦数据库
  2. 达梦技术社区:《搭建 DMDIS,并完成数据迁移》
    网址:搭建DMDIS,并完成数据迁移 | 达梦技术社区

THE END

达梦社区地址:https://eco.dameng.com

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 8:11:49

Claude 4.8和GPT 5.6哪个好?统一Prompt实测对比

先说结论 Claude 4.8在编程、中文、深度分析三个场景中领先&#xff0c;GPT 5.6在响应速度和格式规范上保持优势。综合差距0.2分&#xff0c;比上一代缩小了约50%。没有绝对的"更好"&#xff0c;只有"更适合"。 最近我在猪猪AI&#xff08;titiai.cn&…

作者头像 李华
网站建设 2026/8/8 8:09:56

知典小读 PRD 公开:一个 AI 名著解读小程序的产品设计思路

从需求到功能清单&#xff0c;我是怎么设计这款小程序的。做产品最怕的不是写代码&#xff0c;而是需求模糊。"我想做个读书小程序"——这句话背后可能有一百种理解。是微信读书那种正版阅读&#xff1f;是得到那种音频解读&#xff1f;还是小红书那种读书笔记社区&a…

作者头像 李华
网站建设 2026/8/8 8:09:51

CentOS7.9 离线部署 K8s v1.24 高可用集群【完整整合手册】

文章目录 CentOS7.9 离线部署 K8s v1.24 高可用集群【完整整合手册】 前置说明 二、离线包完整性校验(所有节点执行) 2.1 目录与文件大小校验 2.2 预生成本地离线YUM源(所有节点) 三、系统统一初始化(所有节点全量执行) 3.1 主机名与hosts解析 3.2 安全与交换分区关闭 3.…

作者头像 李华
网站建设 2026/8/8 8:05:28

Serilog结构化日志在.NET应用中的核心原理与生产实践指南

1. 为什么我们需要Serilog&#xff1a;从日志的“混沌”到“秩序” 如果你写过几年.NET程序&#xff0c;尤其是Web应用&#xff0c;肯定经历过日志的“混沌时期”。打开一个传统的日志文件&#xff0c;里面充斥着各种 Debug 、 Info 、 Error &#xff0c;信息像一团乱麻…

作者头像 李华
网站建设 2026/8/8 8:03:29

STM32红外遥控NEC协议解码实战:从硬件原理到稳定状态机实现

1. 项目缘起&#xff1a;为什么红外遥控接收模块是嵌入式开发的“必修课”&#xff1f; 如果你玩过STM32&#xff0c;或者任何一款单片机&#xff0c;大概率都接触过红外遥控。它可能是你第一个“无线”通信项目&#xff0c;也可能是你从点灯、按键之后&#xff0c;迈向更复杂外…

作者头像 李华