在数据库系统的日常运维中,数据同步与一致性校验是两项高频需求——无论是构建容灾备份系统、实现读写分离,还是在系统升级迁移过程中保持业务不中断,都离不开高效可靠的数据复制与校验工具。达梦数据复制软件(DMDRS)与达梦数据校验软件(DMDVS)正是为解决上述问题而推出的企业级产品组合。
1、掌握DRS和DVS的原理
2、部署安装DRS
3、实现DM8-DM8的一对一单向DRS同步
达梦数据实时同步软件(DMDRS)是达梦数据库官方推出的数据复制工具,支持同构及异构数据库之间的数据实时同步。它采用基于日志的结构化数据复制技术,不依赖源数据库的触发器或规则,对源数据库系统几乎无影响,能以极少的系统开销实现秒级甚至亚秒级的数据实时同步。
与传统的DTS迁移工具不同,DTS通常要求在迁移过程中停机以防止数据不一致,而DMDRS通过全量装载与增量同步的组合,能够在不需要长时间停机的情况下完成数据迁移。
DMDRS的核心工作原理可以概括为:源库产生日志,DMDRS解析日志,目标端执行日志。
源数据库的每一次数据变更都会产生对应的重做日志(Redo Log),每条日志记录都有唯一的LSN(Log Sequence Number)。源端DMDRS从指定的起始LSN开始,持续捕获并解析增量日志,将解析出的INSERT、UPDATE、DELETE以及DDL操作转换为内部消息格式,通过网络发送至目标端;目标端DMDRS接收消息后,在目标数据库中执行相应操作,从而实现数据同步。
DMDRS采用模块化设计,各模块职责明确、协同工作,统一由MGR管理:
| 模块 | 全称 | 核心职责 |
|---|---|---|
| MGR | Manager管理模块 | 解析配置参数,加载和维护其他模块,提供客户端监听与控制命令执行。当启动捕获器功能时调度CPT和NET模块;启动执行器功能时调度NET和EXEC模块 |
| CPT | 捕获模块 | 对源数据库增量日志进行捕获与解析,结合数据字典提取数据变化(INSERT/DELETE/UPDATE/DDL),转换为内部消息格式投递给NET模块 |
| LOAD | 装载模块 | 在增量同步之前,完成同步表的字典装载和全量数据的初始装载,使源库和目标库初始数据保持一致 |
| NET | 传输模块 | 承担节点之间数据的收发任务,分为接收子模块(RECV)与发送子模块(SEND)。多对一、一对多等拓扑的数据传输均通过NET实现 |
| EXEC | 执行模块 | 接收CPT捕获的增量数据,在目标数据库中执行入库操作。采用符合SQL92标准的SQL语句,通过ODBC接口和目标端数据库交互 |
DMDRS支持多种同步拓扑结构,可满足不同业务场景的需求:
一对一:一个源端同步到一个目标端
一对多:一个源端同步到多个目标端
多对一:多个源端同步到一个目标端
双向同步:两端互相同步
级联同步:A→B→C 链式同步
环形同步:多节点环形同步
本次安装部署使用的两台服务器配置如下:
| DMDRS 服务器 | IP地址 | 处理器 | 内存 | 硬盘 |
|---|---|---|---|---|
| 源端 DMDRS | 192.168.229.184 | 4 * 2 核 | 4GB | 50GB |
| 目标端 DMDRS | 192.168.229.183 | 4 * 2 核 | 4GB | 50GB |
在两台服务器上各部署了一个达梦数据库实例,具体参数如下:
| 实例名 | 角色 | IP | 数据库端口 | 管理端口 | 站点号 | 数据目录 | 归档目录 |
|---|---|---|---|---|---|---|---|
| DMSERVER | 源端 | 192.168.229.184 | 5236 | 5446 | 1 | /dbdata/dmdata/DAMENG | /dbarch/dmarch |
| DMSERVER | 目标端 | 192.168.229.183 | 5236 | 5446 | 2 | /dbdata/dmdata/DAMENG | /dbarch/dmarch |
(1)开启归档日志
DMDRS的CPT模块需要从归档日志中捕获数据变更,因此必须先开启归档:
# 在安装DM8单机库时我已配好归档路径,所以以下仅供未配好路径的人参考
alter database mount;
alter database ARCHIVELOG;
alter database ADD ARCHIVELOG 'type=local, dest=/dbarch/dmarch, file_size=128, space_limit=10240';
alter database open;
配置完成后,可以通过查询v$arch_status视图确认归档状态:
SQL> select * from v$arch_status;
行号 ARCH_TYPE ARCH_DEST ARCH_STATUS ARCH_SRC
---------- --------- -------------- ----------- --------
1 LOCAL /dbarch/dmarch VALID DMSERVER
已用时间: 14.684(毫秒). 执行号:71001.
(2)开启逻辑日志
逻辑日志是DMDRS捕获增量数据的基础。通过以下命令将RLOG_APPEND_LOGIC参数设置为1(表示UPDATE和DELETE操作记录主键信息):
call sp_set_para_value(1,'RLOG_APPEND_LOGIC',1);
参数值1、2、3的含义不同——1只记录主键,2记录所有列,3记录更新列和ROWID。对于大多数场景,设置为1已经足够,但如果同步的表没有主键,则需要设置为2。
(3)创建DMDRS测试用户
在源端创建DMDRS用户,并赋予权限:
CREATE USER DMDRS IDENTIFIED by "Dmdrs123";
grant "RESOURCE","PUBLIC","VTI","SOI","SVI" to "DMDRS";
grant CREATE SESSION to "DMDRS";
(4)创建测试表并插入数据
为了验证同步效果,在源端创建了一张简单的测试表:
SQL> CREATE TABLE DMDRS.T1 (
ID INT,
NAME VARCHAR(50),
CREATE_TIME DATE
);
SQL> INSERT INTO DMDRS.T1 VALUES (1, '测试数据1', SYSDATE);
INSERT INTO DMDRS.T1 VALUES (2, '测试数据2', SYSDATE);
INSERT INTO DMDRS.T1 VALUES (3, '测试数据3', SYSDATE);
SQL> commit;
#验证数据是否存在
SQL> select * from DMDRS.T1;
行号 ID NAME CREATE_TIME
---------- ----------- ------------- -------------------
1 1 测试数据1 2026-09-01 13:13:20
2 2 测试数据2 2026-09-01 13:13:20
3 3 测试数据3 2026-09-01 13:13:21
已用时间: 10.294(毫秒). 执行号:82406.
(1)开启归档日志
与源端相同的操作:
alter database mount;
alter database ARCHIVELOG;
alter database ADD ARCHIVELOG 'type=local, dest=/dbarch/dmarch, file_size=128, space_limit=10240';
alter database open;
(2)创建DMDRS测试用户
目标端同样需要创建DMDRS用户,用于执行模块(EXEC)连接数据库并写入数据:
CREATE USER DMDRS IDENTIFIED by "Dmdrs123";
grant "RESOURCE","PUBLIC","VTI","SOI","SVI" to "DMDRS";
grant CREATE SESSION to "DMDRS";
源端和目的端的DRS安装操作相同,如果想要方便,简化流程,可以在一台服务器安装好DMDRS后,克隆一台新的服务器,改一下IP地址即可。
已将安装包通过xftp传入到/opt/dm目录下,在root下授予安装包执行权限,将属主和属组给dmdba
chmod +x /opt/dm/dmdrs_rev218265_x86_rh6_64_20260409.bin
chown -R dmdba:dinstall /opt/dm
su - dmdba
cd /opt/dm
./dmdrs_rev218265_x86_rh6_64_20260409.bin -i
[dmdba@localhost /opt/dm]$ ./dmdrs_rev218265_x86_rh6_64_20260409.bin -i
Please select the installer's language (C/c:Simplified Chinese, H/h: Hong Kong Traditional Chinese, E/e: Eng
lish)[E/e]:c
-----------欢迎使用达梦数据复制软件安装工具-----------
输入[exit]可退出安装。
-----------安装目录-----------
指定安装目录[/home/dmdba/dm/dmdrs5]:
-----------安装组件-----------
请选择需要安装的组件
1.安装达梦数据融合管理平台
2.安装代理
请选择安装组件数字序号(使用空格间隔):1 2
选择的组件有:
1.安装达梦数据融合管理平台
2.安装代理
确认?[Y/y(确认选择) or N/n(重新选择)]:y
-----------许可证文件-----------
1.免费试用达梦数据复制软件(必须在试用期范围内使用,反复安装无效,使用时间为3个月)
2.使用许可证文件
指定许可证文件(1,2)[1]:1
免费试用许可证文件限制信息如下:
有效日期:1974-04-01
版本类型:试用版
许可证编号:dm66n367
授权顾客名称:DEVELOP USER
当前选择为免费试用,是否继续安装?[Y/y or N/n]:y
-----------配置-----------
数据库驱动路径配置 -数据库驱动路径[]:/home/dmdba/dm/dmdbms/bin
注意:代理配置IP不允许设置成127.0.0.1!
代理配置-代理IP(192.168.229.184):192.168.229.184
代理配置-代理端口[19345]:
达梦数据融合管理平台配置-管理平台端口[8080]:
注意:密码必须至少8个字符,并且满足以下条件中的任意两项:数字、大写字母、小写字母、特殊字符(如!@#$%^&*等)。
达梦数据融合管理平台配置-管理平台密码:
达梦数据融合管理平台配置-管理平台确认密码:
是否使用外置库(0:不使用 1:使用 )[0]:1
外置库配置-数据库服务IP:192.168.229.184
外置库配置-数据库端口[15236]:5236
外置库配置-用户名[SYSDBA]:
外置库配置-密码[]:
-----------安装小结-----------
安装目录:[/home/dmdba/dm/dmdrs5]
数据库驱动路径:[/dmdba/dmdbms/bin]
代理IP:[192.168.229.184]
代理端口:[19345]
达梦数据融合管理平台IP:[127.0.0.1]
达梦数据融合管理平台端口:[8080]
外置库信息:
数据库IP:[192.168.229.184]
数据库端口:[5236]
用户名:[SYSDBA]
密码:[******]
所需磁盘空间/可用磁盘空间:[1,768 MB/26,359 MB]
确认安装?[Y/y or N/n]:y
-----------安装中-----------
server start ... server finished.
default start ... default finished.
agent start ... agent finished.
web start ... web finished.
doc start ... doc finished.
安装成功
-----------系统服务-----------
达梦数据融合管理平台服务设置
1.注册系统服务
2.不注册系统服务
启动方式(1,2)[2]:1
正在创建达梦数据融合管理平台服务....
达梦数据融合管理平台代理服务设置
1.注册系统服务
2.不注册系统服务
启动方式(1,2)[2]:1
正在创建达梦数据融合管理平台代理服务....
以下配置脚本需要以"root"用户的身份运行.
/home/dmdba/dm/dmdrs5/scripts/root/root_installer.sh
是否已执行shell脚本?(Y/y or N/n)[Y/y]:y
-----------安装总结-----------
达梦数据复制软件V5安装完成
地址:http://127.0.0.1:8080
用户名/密码:admin/******
更多安装信息,请查看安装日志文件:/home/dmdba/dm/dmdrs5/log/install.log
安装完成后,系统提示使用root用户执行注册脚本:
/home/dmdba/dm/dmdrs5/scripts/root/root_installer.sh
如果需要同步DDL操作(如CREATE TABLE、ALTER TABLE等),需要在源端执行DDL辅助脚本:
set define off;
start /dmdba/dmdrs5/bin/scripts/ddl_sql_dm8.sql
执行后,查询创建的触发器和表:
-- 查看DDL触发器
select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DRS_$%' and status = 'Y';
-- 查看DDL相关表
select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DRS_$%' and status = 'VALID';
DMDRS的部分功能依赖Java环境,首先配置JDK环境变量:
cat >> /etc/profile <<EOF
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
EOF
source /etc/profile
如果不确定自己有没有配置过,可以用以下语句验证:
[root@localhost etc]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
如果已有java相关版本,可以不用执行
DMDPI是达梦数据库的编程接口,DMDRS需要通过它连接数据库:
cat >> ~/.bash_profile <<EOF
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/dmdba/dm/dmdbms/bin"
export DM_HOME="/home/dmdba/dm/dmdbms"
export PATH="$PATH:$DM_HOME/bin"
EOF
source ~/.bash_profile
通过复制模板文件创建了目标端的启动脚本:
cd /home/dmdba/dm/dmdrs5/bin
cp service_template/TemplateService ./DrsService_Slave
vim DrsService_Slave
修改后的关键配置如下:
INSTALL_HOME=/home/dmdba/dm/dmdrs5
PROG_DIR=/home/dmdba/dm/dmdrs5/bin
CONF_PATH=/home/dmdba/dm/dmdrs5/bin/exec.xml
NEED_LIB_PATH=/home/dmdba/dm/dmdbms/bin
EXEC_PROG_NAME=drsvr
SERVICE_TYPE_NAME="drs server"
目标端运行的是执行模块(EXEC),创建exec.xml配置文件如下:
cd /home/dmdba/dm/dmdrs5/bin
cp conf_sample/exec.xml .
vim exec.xml
配置文件内容:
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5446</mgr_port> <!-- 管理端口,与源端保持一致 -->
<siteid>2</siteid> <!-- 站点号,全局唯一 -->
</base>
<exec>
<name>exec_dm8</name> <!-- 执行模块名称 -->
<login>
<dbtype>dm8</dbtype> <!-- 数据库类型 -->
<server>192.168.229.183</server> <!-- 目标端IP -->
<user>SYSDBA</user> <!-- 连接用户 -->
<pwd>SYSDBA</pwd> <!-- 用户密码 -->
<port>5236</port> <!-- 数据库端口 -->
</login>
</exec>
</drs>
易错点:上面的连接用户和密码为外置库的用户和密码。
与目标端相同的配置操作。
cd /home/dmdba/dm/dmdrs5/bin
cp service_template/TemplateService ./DrsService_Master
vim DrsService_Master
修改后的关键配置:
INSTALL_HOME=/home/dmdba/dm/dmdrs5
PROG_DIR=/home/dmdba/dm/dmdrs5/bin
CONF_PATH=/home/dmdba/dm/dmdrs5/bin/cpt.xml
NEED_LIB_PATH=/home/dmdba/dm/dmdbms/bin
EXEC_PROG_NAME=drsvr
SERVICE_TYPE_NAME="drs server"
源端运行的是捕获模块(CPT),创建cpt.xml配置文件如下:
cd /home/dmdba/dm/dmdrs5/bin
cp conf_sample/cpt.xml ./
vim cpt.xml
配置文件内容:
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5446</mgr_port> <!-- 管理端口 -->
<siteid>1</siteid> <!-- 站点号,全局唯一 -->
</base>
<cpt>
<name>cpt_dm8</name> <!-- 捕获模块名称 -->
<login>
<dbtype>dm8</dbtype> <!-- 数据库类型 -->
<server>192.168.229.184</server> <!-- 源端IP -->
<user>SYSDBA</user> <!-- 连接用户 -->
<pwd>SYSDBA</pwd> <!-- 用户密码 -->
<port>5236</port> <!-- 数据库端口 -->
</login>
<send>
<ip>192.168.229.184</ip> <!-- 目标端IP -->
<port>5446</port> <!-- 目标端管理端口 -->
<target_name>exec_dm8</target_name> <!-- 目标端执行模块名称 -->
<map>
<item>DMDRS.*==DMDRS.*</item> <!-- 映射规则:源端DMDRS模式同步到目标端DMDRS模式 -->
</map>
</send>
</cpt>
</drs>
映射规则
DMDRS.*==DMDRS.*的含义是将源端DMDRS模式下的所有表同步到目标端同名的DMDRS模式下。如果源端和目标端的模式名不同,可以写成源模式.*==目标模式.*的形式。
在正式以后台服务方式运行之前,先用前台方式启动,以便观察启动日志,确认配置无误。
目标端前台启动:
[dmdba@localhost bin]$ ./drsvr exec.xml
源端前台启动:
[dmdba@localhost ~/dmdrs5/bin]$./drsvr cpt.xml MGR[WARN]: 未能检测到dmdrs.key文件,即将体验免费版 MGR[INFO]: DRS start up, current version: V5.2.5.4-Build(2026.04.08-218265_trunc_sp2)_64 (X86)(The beta)(Enterprise Edition) MGR[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 1G MGR[WARN]: 无key状态下DRS性能受限制 parse_thr: 1 MGR[INFO]: 模块被加载 module: cpt_dm8 MGR[INFO]: 正在初始化缓存模块 path: ./cpt_dm8/CACHE_cpt_dm8, buffers size: 256 MB MGR[INFO]: SITEID: 1 NAME: localhost.localdomain MEMCHECK: 0 PORT: 5446 GROUP: 0 VERSION: 1 PATH: cpt.xml
前台验证通过后,改用服务脚本以后台方式启动:
目标端:
[dmdba@localhost bin]$ ./DrsService_Slave start Starting DrsService_Slave: [ OK ]
源端:
[dmdba@localhost bin]$ ./DrsService_Master start Starting DrsService_Master: [ OK ]
服务启动后,通过DRS控制台(drcsl)执行同步操作。
进入源端的控制台:
[dmdba@localhost bin]$ ./drcsl CSL>
需要先连接DRS的管理端口,LSN(Log Sequence Number)是日志序列号,CPT模块从指定的LSN开始解析日志:
CSL> connect 127.0.0.1:5446
CSL[INFO]: [INPUT CMD: connect 127.0.0.1:5446]
CSL> alter cpt_dm8 set lsn
CSL[INFO]: [INPUT CMD: alter cpt_dm8 set lsn]
MGR[INFO]: 成功获取模块的起始SCN cpt name: cpt_dm8, LSN: 2273121
命令执行成功
如果不手动设置LSN,CPT模块会从当前最新的LSN开始捕获。手动设置LSN可以控制同步的起始点,在需要重新同步或跳过某些变更时非常有用。
CSL> alter cpt_dm8 add table "sch.name='DMDRS'"
CSL[INFO]: [INPUT CMD: alter cpt_dm8 add table "sch.name='DMDRS'"]
MGR[INFO]: 获取到装载掩码组合 mask: |CREATE|INSERT|INDEX|TABLE|CHECK|GROUP
命令执行成功
这个命令的含义是:将DMDRS模式下的所有表添加到同步列表中。此时CPT模块会自动执行全量装载,将源端数据装载到目标端。
CSL> start
CSL[INFO]: [INPUT CMD: start]
MGR[INFO]: 模块正在启动 module: cpt_dm8
MGR[INFO]: CPT准备就绪 type: dm8 cpt
MGR[INFO]: 模块已经处于运行状态 module: cpt_dm8
命令执行成功
[root@localhost ~]# ps -ef|grep drsvr
dmdba 3535 1 3 12:26 pts/0 00:00:00 /home/dmdba/dm/dmdrs5/bindrsvr /home/dmdba/dm/dmdrs5/bin/exec.xml -noconsole
root 3573 3454 0 12:26 pts/1 00:00:00 grep --color=auto drsvr
确认DRS服务进程正在运行。
登录目标端数据库,查询t1表:
SQL> select * from dmdrs.t1; 行号 ID NAME CREATE_TIME ---------- ----------- ------------- ------------------- 1 1 测试数据1 2026-09-01 13:13:20 2 2 测试数据2 2026-09-01 13:13:20 3 3 测试数据3 2026-09-01 13:13:21 已用时间: 12.011(毫秒). 执行号:82101.
数据同步成功!
达梦数据校验软件(DMDVS)是一款企业级数据一致性管理平台,提供跨数据库、跨平台的数据比对与修复能力。在数据迁移、灾备、实时数据集成等场景中,数据从源端同步到目标端后,需要确认两端数据完全一致。
传统的做法是人工写SQL对比,面对几百张表、上亿行数据时既不现实也不可靠。DMDVS正是为解决这一问题而推出。
DMDVS具备以下核心能力:
自动化校验:无需人工逐表对比,一条命令完成全量校验
高性能:智能分组+并行查询+MD5比对,百万数据秒级完成
精准定位:不仅能告知数据不一致,还能定位到具体是哪一行、哪一列不一致
自动修复:发现差异后,可一键将目标端数据修复为与源端一致
DMDVS已被广泛应用于金融、电力、政务等关键行业的数据一致性保障场景。
DMDVS采用模块化框架设计:
| 模块 | 核心职责 |
|---|---|
| Manager管理模块 | 负责客户端监听、加载和维护CMP与CMP_DSTB模块,执行控制台命令 |
| CMP模块 | 提供数据校验、报告生成、修复、备份、还原及进度监控 |
| CMP_DSTB模块 | 分布式数据校验中心,处理任务分配、结果统计及报告生成 |
| Console远程控制工具 | 允许用户通过网络远程启动、停止校验任务,监控进度并查看报告 |
DMDVS支持四种核心校验模式,以适应不同场景:
| 校验模式 | 适用场景 |
|---|---|
| 静态数据校验 | 数据迁移验证、容灾基线核查——源库与目标库处于静止状态(无写入),校验服务器可同时访问两端 |
| 动态数据校验 | DMDRS增量同步过程中实时校验,不影响同步性能。需要开启数据库闪回功能(ENABLE_FLASHBACK=1) |
| 单向数据校验 | 涉密网络与互联网区域数据比对——存在网闸隔离,只能单向通信 |
| 分布式数据校验 | PB级海量数据、资源受限环境、跨地域多数据中心并行校验 |
文章
阅读量
获赞
