达梦数据复制软件(简称DMDRS)是一款用于同构、异构数据库数据迁移复制的软件,采用模块化设计,可以通过配置不同的模块来进行不同的数据复制服务,满足各种不同的数据要求。
基于业务要求,可以满足数据迁移、同步、分发和数据转换等功能,并且还支持一对一、双向、一对多、多对一、级联同步、环形同步以及主备等多种同步拓扑结构。
服务管理模块,启动DMDRS服务后,Manager模块开始运行,主要以用于提供客户端监听、其他功能模块加载、维护以及执行控制台命令等功能。
用于实现源端数据库的全量数据获取、增量数据捕获、解析以及投递等功能。
DSS模块接收CPT模块的数据,并且根据Topic主题将数据分流持久化存储,提供给下一级数据服务使用。
主要用于接收CPT模块发送的全量、增量数据,并且在目标端进行应用,实现源端目标端的数据一致性。
CVT模块通过DRS语言实现自定义编程式编写数据转换规则和逻辑,实现数据清洗转换的功能。CVT模块从CPT模块或者EXEC模块中获取数据,并按照预先定义的转换规则及逻辑,以单个操作作为最小单元进行数据清洗转换。DRS语言提供了流程转换定义、转换逻辑语法定义和丰富的内置转换函数等,具体请参见《DMDRS DRS语言使用手册》。
SCHED模块主要提供定时自动执行功能调度任务,实现定时执行CVT脚本、定时删除多CPT归档、定时服务守护、定时数据装载、定时数据同步、定时静态数据校验和定时动态数据校验等调度功能。具体请参见《定时调度工具使用手册》。
Console远程控制工具是基于TCP/IP的DMDRS远程控制工具。
数据迁移是指将源端数据在静态环境下一次性迁移到目标数据库的操作过程,DMDRS支持同构数据库、异构数据库之间的数据迁移,并且支持故障后断点续传功能。
数据同步通常指的是通过全量数据装载和增量数据同步组合来实现的同步复制功能,数据同步可以在源数据库是动态的场景下,实现让目标库的数据一致性。DMDRS支持同构以及异构数据库的数据实时同步。
全量装载指的是将源数据库的全量数据装载到目标数据库,使得目标数据库和源数据库的全量数据保持一致。
增量同步指的是在全量装载的前提下,通过对数据的增量数据进行实时同步,保证源数据库和目标数据库数据一直的操作。
数据分发指的是将源端数据库的全量数据以及增量数据先保存到流存储后在分发到各个目标端,通常适用于将一个数据库复制到多个数据库的场景。
数据转换指的是对源数据库的全量数据和增量数据进行自定义转换,从而达到适应目标库的场景。数据转换可以应用于数据迁移、数据同步以及数据分发等场景。
DMDRS支持主流软硬件平台,比如龙芯、飞腾、鲲鹏、海光、兆芯、申威、宏芯、X86和ARM等处理器以及麒麟、UOS、凝思、Red Hat、Ubuntu、Solaris、AIX和Windows等操作系统。
DMDRS源端支持DM7、DM8、Oracle10及以上、DB2、MySQL以及MS SQL Server。
目标端支持DM7、DM8、Oracle10及以上、MySQL、kafka、PostgreSQL以及MS SQL Server。
数据类型支持主流数据类型,详细情况可以查看DMDRS产品介绍使用限制。
本次部署基于dm8-dm8进行一对一数据增量同步。
服务器名称 | IP | CPU | 内存 | 硬盘 |
---|---|---|---|---|
master | 192.168.20.137 | 2 | 5 | 50 |
slave | 192.168.20.138 | 2 | 5 | 50 |
实例名 | IP | 端口 | 数据目录 | 归档目录 |
---|---|---|---|---|
DMM | 192.168.20.137 | 5236 | /dmdba/dmdbms/data/DMSERVER | /dmdba/dmdbms/data/DMSERVER/arch |
DMS | 192.168.20.138 | 5236 | /dmdba/dmdbms/data/DMSERVER | /dmdba/dmdbms/data/DMSERVER/arch |
实例名 | IP | 端口 | 管理端口mgr_port | 站点号siteid |
---|---|---|---|---|
DMM | 192.168.20.137 | 5236 | 5446 | 1 |
DMS | 192.168.20.138 | 5236 | 5446 | 2 |
dminit path=/dmdba/dmdbms/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 LOG_SIZE=256 DB_NAME=DMSERVER INSTANCE_NAME=DMM PORT_NUM=5236 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
dminit path=/dmdba/dmdbms/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 LOG_SIZE=256 DB_NAME=DMSERVER INSTANCE_NAME=DMS PORT_NUM=5236 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
./dm_service_installer.sh -t dmserver -dm_ini /dmdba/dmdbms/data/DMSERVER/dm.ini -p DMM
./dm_service_installer.sh -t dmserver -dm_ini /dmdba/dmdbms/data/DMSERVER/dm.ini -p DMS
(1) 开启归档
alter database mount;
alter database ARCHIVELOG;
alter database ADD ARCHIVELOG 'type=local, dest=/dmdba/dmdbms/data/DMSERVER/arch, file_size=128, space_limit=10240';
alter database open;
-- SP_SET_ARCH_STATUS('DM3',1); -- 特殊模式时可用
select * from v$arch_status; -- 查看集群归档状态,备库的无意义
(2) 配置逻辑日志
call sp_set_para_value(1,'RLOG_APPEND_LOGIC',1);-- 配置逻辑日志
-- call sp_set_para_value(1,'DSC_TRX_VIEW_SYNC',1);
-- 配置数据一致性参数(DSC环境)
(3) 创建用户
CREATE USER DMDRS IDENTIFIED by "Dmdrs123";
grant "RESOURCE","PUBLIC","VTI","SOI","SVI" to "DMDRS";
grant CREATE SESSION to "DMDRS";
(4) 创建测试表
CREATE table t1 (id int);
insert into t1 values (1);
commit ;
(1) 开启归档
alter database mount;
alter database ARCHIVELOG;
alter database ADD ARCHIVELOG 'type=local, dest=/dmdba/dmdbms/data/DMSERVER/arch, file_size=128, space_limit=10240';
alter database open;
-- SP_SET_ARCH_STATUS('DM3',1); -- 特殊模式时可用
select * from v$arch_status; -- 查看集群归档状态,备库的无意义
(2) 创建用户
CREATE USER DMDRS IDENTIFIED by "Dmdrs123";
grant "RESOURCE","PUBLIC","VTI","SOI","SVI" to "DMDRS";
grant CREATE SESSION to "DMDRS";
chmod +x /dmdba/dmdrs_rev191718_x86_rh6_64_20250619.bin
su - dmdba
./dmdrs_rev191718_x86_rh6_64_20250619.bin -i
[root@master root]# su - dmdba
Last login: Mon Jul 7 15:31:44 CST 2025 on pts/0
[dmdba@master ~]$ ./dmdrs_rev191718_x86_rh6_64_20250619.bin -i
Extract install files.........
Please select the installer’s language (E/e:English C/c:Chinese)[E/e]:c
-----------欢迎使用DMDRS 安装工具-----------
输入[exit]可退出安装。
-----------安装目录-----------
指定安装目录[/dmdba/dmdrs5]:
-----------安装组件-----------
请选择需要安装的组件
1.安装达梦数据融合管理平台
2.安装代理
请选择安装组件数字序号(使用空格间隔):1
选择的组件有:
1.安装达梦数据融合管理平台
确认?[Y/y(确认选择) or N/n(重新选择)]:n
请选择需要安装的组件
1.安装达梦数据融合管理平台
2.安装代理
请选择安装组件数字序号(使用空格间隔):1 2
选择的组件有:
1.安装达梦数据融合管理平台
2.安装代理
确认?[Y/y(确认选择) or N/n(重新选择)]:y
-----------许可证文件-----------
1.免费试用达梦数据复制软件(必须在试用期范围内使用,反复安装无效,使用时间为3个月)
2.使用许可证文件
指定许可证文件(1,2)[1]:1
expireDate----2025-09-17
免费试用许可证文件限制信息如下:
有效日期:2025-09-17
版本类型:试用版
许可证编号:dm66n367
授权顾客名称:DEVELOP USER
当前选择为免费试用,是否继续安装?[Y/y or N/n]:y
-----------配置-----------
依赖环境配置 -数据库动态库路径[/dmdba/dmdbms/bin]:
注意:代理配置IP不允许设置成127.0.0.1!
代理配置-代理IP(192.168.20.137):192.168.20.137
代理配置-代理端口[19345]:
达梦数据融合管理平台配置-管理平台端口[8080]:
注意:密码必须至少8个字符,并且满足以下条件中的任意两项:数字、大写字母、小写字母、特殊字符(如!@#$%^&*等)。
达梦数据融合管理平台配置-管理平台密码:
达梦数据融合管理平台配置-管理平台确认密码:
是否使用外置库(0:不使用 1:使用 )[0]:1
外置库配置-数据库服务IP:192.168.20.137
外置库配置-数据库端口[15236]:5236
外置库配置-用户名[SYSDBA]:sysdba
外置库配置-密码[Dmdfm@888]:
-----------安装小结-----------
安装目录:[/dmdba/dmdrs5]
依赖环境配置-NEED_LIB_PATH:[/dmdba/dmdbms/bin]
代理IP:[192.168.20.137]
代理端口:[19345]
达梦数据融合管理平台IP:[127.0.0.1]
达梦数据融合管理平台端口:[8080]
外置库信息:
数据库IP:[192.168.20.137]
数据库端口:[5236]
用户名:[sysdba]
密码:[******]
所需磁盘空间/可用磁盘空间:[1,985 MB/51,965 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"用户的身份运行.
/dmdba/dmdrs5/scripts/root/root_installer.sh
是否已执行shell脚本?(Y/y or N/n)[Y/y]:y
-----------安装总结-----------
达梦数据复制软件V5安装完成
地址:http://127.0.0.1:8080
用户名/密码:admin/******
更多安装信息,请查看安装日志文件:/dmdba/dmdrs5/log/install.log
[dmdba@master ~]$
2.2.2 准备辅助表信息(DDL同步)
SQL> set define off;
SQL> start /dmdba/dmdrs5/bin/scripts/ddl_sql_dm8.sql
SQL> select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DRS_$%' and status = 'Y';
行号 OWNER TRIGGER_NAME
---------- ----------- ----------------
1 SYSDBA DRS_$DDL_TRIGGER_AFTER
2 SYSDBA DRS_$DDL_TRIGGER_BEFORE
3 SYSDBA DRS_$DDL_TRIGGER_GRANT
4 SYSDBA DRS_$DDL_TRIGGER_REVOKE
已用时间: 12.147(毫秒). 执行号:16.
SQL> select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DRS_$%' and status = 'VALID';
行号 OWNER TABLE_NAME
---------- ----------- ----------------
1 SYSDBA DRS_$DDL_COL
2 SYSDBA DRS_$DDL_SQL
3 SYSDBA DRS_$DDL_CONS
4 SYSDBA DRS_$DDL_IDX
5 SYSDBA DRS_$DDL_RENAME
6 SYSDBA DRS_$DDL_SEQ
7 SYSDBA DRS_$DDL_PART
8 SYSDBA DRS_$DDL_COMMENT
9 SYSDBA DRS_$DDL_LOG
9 rows got
已用时间: 197.302(毫秒). 执行号:7.
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
cat >>~/.bash_profile <<EOF
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dmdba/dmdbms/bin"
export DM_HOME="/dmdba/dmdbms"
export PATH="$PATH:$DM_HOME/bin"
EOF
cp service_template/TemplateService ./DrsService_Slave
vi DrsService_Slave
more DrsService_Slave
#set execute environment
#REPLACE INSTALL_HOME path
INSTALL_HOME=/dmdba/dmdrs5
#REPLACE program dir
PROG_DIR=/dmdba/dmdrs5/bin
#REPLACE program config path
#If drs server is BP node and wants to startup without drs.xml,please specify the running port in CONF_PATH,for example,CONF_PATH="-port 5345"
CONF_PATH=/dmdba/dmdrs5/bin/exec.xml
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=/dmdba/dmdbms/bin
#REPLACE program name, drsvr/dssvr/dvsvr
EXEC_PROG_NAME=drsvr
#REPLACE service type, drs server/dss server/dvs server
SERVICE_TYPE_NAME="drs server"
cd /dmdba/dmdrs5/bin
cp conf_sample/exec.xml .
cat >>exec.xml <<EOF
<?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.20.138</server>
<user>DMDRS</user>
<pwd>Dmdrs123</pwd>
<port>5236</port>
</login>
</exec>
</drs>
EOF
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
cat >>~/.bash_profile <<EOF
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dmdba/dmdbms/bin"
export DM_HOME="/dmdba/dmdbms"
export PATH="$PATH:$DM_HOME/bin"
EOF
cp service_template/TemplateService ./DrsService_Master
vim ./DrsService_Master
more ./DrsService_Master
#set execute environment
#REPLACE INSTALL_HOME path
INSTALL_HOME=/dmdba/dmdrs5
#REPLACE program dir
PROG_DIR=/dmdba/dmdrs5/bin
#REPLACE program config path
#If drs server is BP node and wants to startup without drs.xml,please specify the running port in CONF_PATH,for example,CONF_PATH="-port 5345"
CONF_PATH=/dmdba/dmdrs5/bin/cpt.xml
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=/dmdba/dmdbms/bin
#REPLACE program name, drsvr/dssvr/dvsvr
EXEC_PROG_NAME=drsvr
#REPLACE service type, drs server/dss server/dvs server
SERVICE_TYPE_NAME="drs server"
cp conf_sample/cpt.xml ./
vim cpt.xml
more cpt.xml
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5446</mgr_port><!--如:5345-->
<siteid>1</siteid><!--如:1-->
</base>
<cpt>
<name>cpt_dm8</name><!--如:cpt_dm8-->
<login>
<dbtype>dm8</dbtype><!--如:dm8-->
<server>192.168.20.137</server><!--如:192.168.20.24-->
<user>DMDRS</user><!--如:DMDRS-->
<pwd>Dmdrs123</pwd><!--如:DMDRS-->
<port>5236</port><!--如:5236-->
</login>
<send>
<ip>192.168.20.138</ip><!--如:192.168.20.21-->
<port>5446</port><!--如:5345-->
<target_name>exec_dm8</target_name><!--如:exec_dm8-->
<map>
<item>DMDRS.*==DMDRS.*</item><!--如:*.*==*.*-->
</map>
</send>
</cpt>
</drs>
[dmdba@slave bin]$ ./drsvr exec.xml
MGR[WARN]: 未能检测到key文件,将使用默认生成的临时key
MGR[INFO]: DRS start up, current version: V5.2.3.3-Build(2025.06.17-191718_trunc_sp1)_64_2506 (X86)(The beta)(Enterprise Edition)
MGR[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 3G
MGR[INFO]: 模块被加载 module: exec_dm8
MGR[INFO]: 正在初始化缓存模块 path: ./exec_dm8/CACHE_exec_dm8, cache size: 512 MB
MGR[INFO]: SITEID: 2 NAME: slave MEMCHECK: 0 PORT: 5446 GROUP: 0 VERSION: 1 PATH: exec.xml
MGR[INFO]: 模块正在启动 module: exec_dm8
MGR[INFO]: 模块已经处于运行状态 module: exec_dm8
EXE[INFO]: 执行端设置字符集 char_code: UTF8
CMD>EXE[INFO]: 建序列同步过程 proc: DRS_$SEQ_SYNC_PROC
EXE[INFO]: EXEC: DBTYPE:DM8 SERVER=192.168.20.138;USER=DMDRS;PORT=5236;
[dmdba@master bin]$ ./drsvr cpt.xml
MGR[WARN]: 未能检测到key文件,将使用默认生成的临时key
MGR[INFO]: DRS start up, current version: V5.2.3.3-Build(2025.06.17-191718_trunc_sp1)_64_2506 (X86)(The beta)(Enterprise Edition)
MGR[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 3G
MGR[INFO]: 模块被加载 module: cpt_dm8
MGR[INFO]: 正在初始化缓存模块 path: ./cpt_dm8/CACHE_cpt_dm8, buffers size: 256 MB
MGR[INFO]: SITEID: 1 NAME: master MEMCHECK: 0 PORT: 5446 GROUP: 0 VERSION: 1 PATH: cpt.xml
CMD>
[dmdba@slave bin]$ ./DrsService_Slave start
Starting DrsService_Slave: [ OK ]
[dmdba@master bin]$ ./DrsService_Master start
Starting DrsService_Master: [ OK ]
[dmdba@master bin]$
./drcsl
CSL> alter cpt_dm8 set lsn
CSL[INFO]: [INPUT CMD: alter cpt_dm8 set lsn]
MGR[INFO]: 成功获取模块的起始SCN cpt name: cpt_dm8, LSN: 2273121
命令执行成功
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
命令执行成功
CSL> start
CSL[INFO]: [INPUT CMD: start]
MGR[INFO]: 模块正在启动 module: cpt_dm8
MGR[INFO]: CPT准备就绪 type: dm8 cpt
MGR[INFO]: 模块已经处于运行状态 module: cpt_dm8
命令执行成功
ps -ef|grep dmdba
./drcsl
CSL> show cpt_dm8 load table all
CSL[INFO]: [INPUT CMD: show cpt_dm8 load table all]
+------------------------------------------------------------------------------------+
| 【全部装载表】 |
+------------------------------------------------------------------------------------+
| 序号 | 模式名 | 表名 | 已装载行数 | 状态 | 开始时间 | 耗时 | 分组数 |
+------+--------+------+------------+----------+---------------------+------+--------+
| 1 | DMDRS | T1 | 1 | COMPLETE | 2025-07-07 18:06:22 | 0 s | 1 |
+------+--------+------+------------+----------+---------------------+------+--------+
命令执行成功
CSL> show cpt_dm8 load status
CSL[INFO]: [INPUT CMD: show cpt_dm8 load status]
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 【装载状态】 |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 序号 | 需装载对象 | 装载字典 | 已装载对象 | 未装载对象 | 正装载对象 | 装载错误对象 | 开始时间 | 结束时间 | 装载条件 | 装载掩码 | 对象类型 |
+------+------------+----------+------------+------------+------------+--------------+---------------------+---------------------+--------------------+------------------------------+----------+
| 1 | 1 | 1 | 1 | 0 | 0 | 0 | 2025-07-07 18:06:22 | 2025-07-07 18:06:23 | sch.name = 'DMDRS' | TRUNCATE|INSERT|NOLOCK|TABLE | TABLE |
+------+------------+----------+------------+------------+------------+--------------+---------------------+---------------------+--------------------+------------------------------+----------+
命令执行成功
CSL> show cpt_dm8 load table error
CSL[INFO]: [INPUT CMD: show cpt_dm8 load table error]
无装载错误表信息!
命令执行成功
disql dmdrs/Dmdrs123
select * from t1;
CSL> connect 127.0.0.1:5446
CSL> alter cpt_dm8 set lsn
alter cpt_dm8 add table "sch.name = 'DMDRS'" truncate|insert|nolock|table
–查看装载状态
CSL> show cpt_dm8 load status
–查看装载的表的状态
CSL> show cpt_dm8 load table all
–查看正在装载的表
CSL> show cpt_dm8 load table running
–查看装载报错的表
CSL> show cpt_dm8 load table error
–装载失败的表继续装
CSL> alter cpt_dm8 add table "sch.name='DMDRS'" continue
文章
阅读量
获赞