DMDRS 负责把数据从源端搬到目标端,但搬过去的数据对不对?DMDVS 就是解决这个问题的——它是达梦数据校验软件,专门负责验证数据一致性,相当于数据复制链路中的“质检员”。
DMDVS 支持同构、异构数据库间的数据校验、数据修复、数据备份和数据还原等功能,满足静态数据校验、动态数据校验、单向数据校验和分布式数据校验等多种应用场景。内置自主研发的高性能对比引擎,可实现秒级校验百万数据。
本文基于实际部署经验,从零开始带你走完 DMDVS 的完整实践流程,涵盖安装部署、参数优化、校验执行、数据修复和差异定位。
在数据迁移、数据灾备、实时数据集成等场景中,数据从源端同步到目标端后,如何确认两端数据完全一致?
传统的做法是人工写 SQL 对比,面对几百张表、上亿行数据时,这种方法既不现实也不可靠。DMDVS 的出现就是为了解决这个问题:
在实际项目中,DMDVS 已被广泛应用于金融、电力、政务等关键行业的数据一致性保障场景。
DMDVS 采用模块化的框架设计,主要包括 Manager 管理模块、CMP 校验模块和 Console 远程控制工具:
DMDVS 支持四种核心校验模式:
| 校验模式 | 适用场景 |
|---|---|
| 静态数据校验 | 源库与目标库处于静止状态(无写入),校验服务器可同时访问两端——数据迁移验证、容灾基线核查 |
| 动态数据校验 | DMDRS 增量同步过程中实时校验,不影响同步性能 |
| 单向数据校验 | 源端与目标端存在网闸隔离,只能单向通信——涉密网络与互联网区域数据比对 |
| 分布式数据校验 | PB 级海量数据、资源受限环境、跨地域多数据中心并行校验 |
本文聚焦最常用的静态数据校验场景:DMDVS 服务器可同时访问源端和目标端数据库,执行一次性全量校验。
| 项目 | 要求 |
|---|---|
| 内存 | 至少 4GB |
| 磁盘 | 至少 100GB |
| Manager 管理端口 | 5349(与 DMDRS 的 5345/5346 区分) |
| 代理端口 | 19347(与 DMDRS 代理的 19345/19346 区分) |
在源端和目标端分别创建 DMDVS 专用用户:
CREATE USER DMDVS_USER IDENTIFIED BY Dameng123;
GRANT DBA TO DMDVS_USER;
生产环境可按最小权限收窄:只需对校验表授予 SELECT 权限即可。
① 创建安装目录(root 用户)
mkdir -p /data/dmdvs5 chown -R dmdba:dinstall /data/dmdvs5 chmod -R 755 /data/dmdvs5
② 执行安装(dmdba 用户)
cd /opt
chmod +x dmdvs_*.bin
./dmdvs_*.bin -i
交互选项中关键配置:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 安装目录 | /data/dmdvs5 | 统一安装路径 |
| 安装组件 | 1 | 完整安装 |
| DVS 管理端口 | 5349 | 与 DMDRS 区分 |
| 站点号 | 10000 | 全局唯一 |
| 代理端口 | 19347 | 与 DMDRS 代理区分 |
配置文件位于 /data/dmdvs5/bin/dvs.xml,核心结构如下:
<?xml version="1.0" encoding="GB18030"?>
<dvs>
<!-- ============ Manager 管理模块 ============ -->
<base>
<mgr_port>5349</mgr_port> <!-- 管理端口,必配 -->
<siteid>10000</siteid> <!-- 站点号,必配,全局唯一 -->
<mem_size>2</mem_size> <!-- 最大内存,0=无限制,单位 GB -->
<log_limit_size>2</log_limit_size> <!-- 日志上限,单位 GB -->
<lang>ch-utf8</lang> <!-- 日志语言 -->
</base>
<!-- ============ CMP 校验模块 ============ -->
<cmp>
<cache>
<path>/data/dmdvs5/bin/cmp</path> <!-- 缓存目录 -->
</cache>
<group_min_count>50000</group_min_count> <!-- 分组查询触发阈值 -->
<max_md5_buf_size>16</max_md5_buf_size> <!-- MD5 缓存区大小 -->
<max_sessions>80</max_sessions> <!-- 最大数据库连接数 -->
<task_parallel_limit>5</task_parallel_limit> <!-- 并行任务数 -->
<report_dir>/data/dmdvs5/bin/report</report_dir>
<cache_det_ignore>0</cache_det_ignore> <!-- 详细报告入缓存库 -->
<need_cmp_empty>1</need_cmp_empty> <!-- 空表生成详细报告 -->
<round_num>6</round_num> <!-- 浮点数精度 -->
<cmp_char_code>GB18030</cmp_char_code> <!-- 字符集 -->
<print_interval>10</print_interval> <!-- 终端打印间隔 -->
<auto_run>1</auto_run> <!-- 自动启动 CMP 模块 -->
</cmp>
</dvs>
cd /data/dmdvs5/bin
cp service_template/TemplateService ./DvsService
vi DvsService # 修改 INSTALL_HOME、PROG_DIR、CONF_PATH 等参数
./DvsService start
./DvsService status
验证服务:
ps -ef | grep dvsvr | grep -v grep netstat -tlnp | grep 5349
cd /data/dmdvs5/bin
./drcsl dvs.xml
CSL> connect
常用控制台命令:
| 命令 | 功能 |
|---|---|
show mod |
查看模块列表,确认 CMP 模块运行中 |
show lic |
查看许可证信息 |
show version |
查看 DMDVS 版本信息 |
exit |
退出控制台 |
# 添加 DM8 源端
CSL> cmp add db dm8 db_src "192.168.21.135" DMDVS_USER Dameng123 5237
# 添加 DM8 目标端
CSL> cmp add db dm8 db_dst "192.168.21.139" DMDVS_USER Dameng123 5236
命令格式:CMP ADD DB <db_type> <db_info_name> "<server>" <user> <pwd> <port>
| 参数 | 说明 |
|---|---|
| db_type | 数据库类型:DM8、Oracle11g、MySQL 等 |
| db_info_name | 数据库信息名称(自定义) |
| server | IP 地址或服务名 |
| user/pwd | 登录用户名/密码 |
| port | 端口号 |
CSL> show db # 查看所有数据库
CSL> show db db_src # 查看指定数据库
CSL> cmp alter db db_src pwd=NewPassword123 # 修改密码
CSL> cmp remove db db_src # 删除数据库
⚠️ 删除前确认没有正在运行的校验任务依赖该数据库。
以下参数在 /data/dmdvs5/bin/dvs.xml 的 <cmp> 标签内配置:
| 参数 | 作用 | 默认值 | 调大场景 | 调小场景 |
|---|---|---|---|---|
| max_sessions | 最大数据库连接数 | 50 | 表多、并发校验 | 数据库连接数有限 |
| group_min_count | 分组查询触发阈值 | 100000 | 表数据量小 | 大表、数据量大 |
| max_md5_buf_size | MD5 缓存区大小 | 4MB | 内存充足、加快校验 | 内存紧张 |
| task_parallel_limit | 并行任务数 | 10 | 多任务并行 | 资源受限 |
| cache_det_ignore | 详细报告入缓存库 | 1 | 需要列校验/详细报告 | 不需要详细报告 |
| need_cmp_empty | 空表详细报告生成 | 0 | 需要完整差异报告 | 只需要总体报告 |
关键说明:
max_md5_buf_size 实际使用量为配置值的两倍(源端和目标端各一份)PARALLEL 掩码值应小于 max_sessionsCOL_CMP|1)时,cache_det_ignore 必须设为 0掩码是在 cmp job 命令后附加的参数,用于精细控制校验行为:
| 掩码 | 作用 | 取值范围 | 优化策略 |
|---|---|---|---|
| PARALLEL | 并发执行的校验表组数 | 1~50,默认 10 | 表多时调大(20~30) |
| GROUP | 单表分组查询线程数 | 0~20,默认 5 | 大表调大(8~10) |
| FAST | 快速校验(仅校验行数) | 0 或 1 | 快速检查用 FAST|1 |
| COL_CMP | 列校验(定位差异列) | 0 或 1 | 需要定位差异列时用 COL_CMP|1 |
| USERULE | 应用校验规则 | 规则名 | 需要列映射、行过滤时使用 |
| DEBUG | 打印调试信息 | 0 或 1 | 定位不一致数据时用 DEBUG|1 |
基础校验:
CSL> cmp job jobname=cmp_test db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1"
表多时调大 PARALLEL:
CSL> cmp job jobname=cmp_multi db_src db_dst "DMDRS.*==DMDVS_USER.*" PARALLEL|20 GROUP|5
大表阻塞小表时,大表单独执行:
CSL> cmp job jobname=cmp_big db_src db_dst "DMDRS.BIG_TABLE==DMDVS_USER.BIG_TABLE" GROUP|10
# 再校验小表(高并发)
CSL> cmp job jobname=cmp_small db_src db_dst "DMDRS.SMALL_*==DMDVS_USER.SMALL_*" PARALLEL|20
快速校验(仅行数) :
CSL> cmp job jobname=cmp_fast db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" FAST|1
列校验(定位差异列) :
CSL> cmp job jobname=cmp_col db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" COL_CMP|1
CSL> show detail cmp_col "DMDRS.EMPL1"
CSL> show cmp_task cmp_test # 查看任务整体进度
CSL> show cmp_table cmp_test # 查看所有表的校验进度
CSL> show report cmp_test # 查看校验报告
show cmp_task 输出解读:
| 字段 | 说明 |
|---|---|
| 表一致数 | 校验一致的表数量 |
| 表差异数 | 校验不一致的表数量 |
| 校验状态 | 校验成功 / 校验中 / 等待校验 |
| 校验任务进度(%) | 当前完成百分比 |
发现数据不一致后,DMDVS 可以自动修复目标端数据。
# 查看 job 对应的 task_id
CSL> show task cmp_col5
# 执行修复
CSL> cmp repair from cmp_col5 7
修复掩码:
| 掩码 | 说明 |
|---|---|
BACKUP|1 |
修复时进行数据备份 |
OMITLOB|1 |
忽略大对象修复 |
CSL> show repair # 查看所有修复任务
CSL> show repair_task 1 # 查看修复任务整体进度
CSL> show repair_table 1 # 查看指定表的修复进度
CSL> cmp job jobname=cmp_verify db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1"
CSL> show report cmp_verify
修复成功后,校验结果应为 “校验成功-数据一致”。
CSL> cmp stop repair 1
当校验报告显示数据不一致时,需要精确定位到具体是哪一行、哪一列不一致。
第一步:粗略定位
CSL> cmp add rule rule_range db_src "DMDRS.EMPL1" row_filter="ID BETWEEN 1 AND 100"
CSL> cmp job jobname=cmp_range db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" USERULE|rule_range
CSL> show report cmp_range
第二步:精确定位到具体行
CSL> cmp add rule rule_exact db_src "DMDRS.EMPL1" row_filter="ID = 15"
CSL> cmp job jobname=cmp_exact db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" USERULE|rule_exact
CSL> show detail cmp_exact "DMDRS.EMPL1"
在校验时添加 DEBUG|1 掩码,打印每一行数据的 MD5 值和各列具体值:
CSL> cmp job jobname=cmp_debug db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" DEBUG|1 USERULE|rule_exact
输出解读:
| 字段 | 含义 |
|---|---|
COME FROM:0 |
数据来自源数据库 |
COME FROM:1 |
数据来自目标数据库 |
COL NAME |
列名 |
VALUE |
该列的具体值 |
MD5 VALUE |
整行数据的 MD5 值 |
对比源端和目标端同一行的 MD5 值和各列值,即可精确定位不一致的列。
# 1. 创建行过滤规则,定位到具体行
CSL> cmp add rule rule_debug db_src "DMDRS.EMPL1" row_filter="ID = 15"
# 2. 使用 DEBUG|1 查看该行的详细数据
CSL> cmp job jobname=cmp_debug db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" DEBUG|1 USERULE|rule_debug
# 3. 查看详细差异报告
CSL> cmp job jobname=cmp_detail db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" COL_CMP|1 USERULE|rule_debug
CSL> show detail cmp_detail "DMDRS.EMPL1"
# 4. 清理测试规则
CSL> cmp remove rule rule_range
CSL> cmp remove rule rule_exact
CSL> cmp remove rule rule_debug
现象:执行 COL_CMP|1 列校验后,show detail 显示"不存在详细差异报告"。
原因:
cache_det_ignore 默认值为 1,详细报告不入缓存库need_cmp_empty 默认跳过详细数据校验解决方案:
cache_det_ignore=0 和 need_cmp_empty=1现象:使用 col_spec="ID,NAME" 或 col_omit="AGE" 规则校验时,show report 显示"表结构不一致"。
原因:col_spec 和 col_omit 会改变参与校验的列集合。DMDVS 比较的是"源端参与校验的列"与"目标端参与校验的列"是否一致。当列集合不一致时,判定为"表结构不一致"并跳过数据校验。
解决方案:使用 * 通配符规则范围,使规则同时作用于两端:
CSL> cmp add rule rule_spec_all * "DMDRS.EMPL1" col_spec="ID,NAME"
CSL> cmp job jobname=cmp_spec db_src db_dst "DMDRS.EMPL1==DMDVS_USER.EMPL1" USERULE|rule_spec_all
总结:row_filter 是唯一不影响表结构判断的规则类型。
| 操作 | 命令 |
|---|---|
| 进入控制台 | ./drcsl dvs.xml |
| 连接服务 | connect |
| 添加数据库 | cmp add db dm8 db_src "IP" USER PWD PORT |
| 查看数据库 | show db |
| 修改数据库 | cmp alter db db_src pwd=NewPwd |
| 删除数据库 | cmp remove db db_src |
| 添加校验规则 | cmp add rule rule_name db_src "SCH.TAB" col_spec="COL1,COL2" |
| 执行校验 | cmp job jobname=job_name db_src db_dst "SCH.TAB==DST.TAB" [掩码] |
| 查看任务进度 | show cmp_task job_name |
| 查看各表进度 | show cmp_table job_name |
| 查看校验报告 | show report job_name |
| 查看详细差异 | show detail job_name "SCH.TAB" |
| 执行数据修复 | cmp repair from job_name task_id |
| 查看修复任务 | show repair |
| 查看修复进度 | show repair_task repair_id |
| 停止修复 | cmp stop repair repair_id |
| 退出控制台 | exit |
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| DMDVS 服务运行 | ps -ef \| grep dvsvr |
进程存在 |
| 管理端口监听 | netstat -tlnp \| grep 5349 |
端口 LISTEN |
| CMP 模块状态 | show mod |
CMP 运行中 |
| 数据库添加成功 | show db |
源端和目标端均已添加 |
| 校验执行成功 | show report |
校验结果正常 |
| 列校验详细报告 | show detail |
有差异数据输出 |
| 数据修复成功 | show report cmp_verify |
校验成功-数据一致 |
DMDVS 的搭建和校验流程看似步骤不少,但只要理清了配置文件参数、校验掩码含义、数据源添加这几个核心要点,操作起来其实非常顺畅。
在实际生产环境中,建议先小范围验证(如单表校验),确认流程无误后再扩展到全量校验。数据修复操作务必谨慎——修复前建议开启 BACKUP|1 备份选项,一旦修复出现问题,可以通过数据还原快速回滚。
文章
阅读量
获赞
