DMDRS搭建、以及DMDRS双向同步
文章目录
- DMDRS搭建、以及DMDRS双向同步
-
- 一、产品介绍
- 二、安装部署
-
- [2.1 用户以及目录](#2.1 用户以及目录)
- [2.2 DRS软件安装](#2.2 DRS软件安装)
- [2.3 登录DFM](#2.3 登录DFM)
- [2.4 准备测试环境](#2.4 准备测试环境)
- 三、测试案例
-
- [3.1 DMDRS工具PostgreSQL -> DM8单向数据同步](#3.1 DMDRS工具PostgreSQL -> DM8单向数据同步)
- [3.2 DMDRS工具DM8 -> DM8双向数据同步](#3.2 DMDRS工具DM8 -> DM8双向数据同步)
-
- 3.2.1数据库准备工作
- [3.2.2 装载](#3.2.2 装载)
- 3.2.3启动数据同步
大家想学习达梦数据库或者解决报错问题,可以去 达梦数据库社区( https://eco.dameng.com)
一、产品介绍
达梦数据复制软件(简称 DMDRS)是一种用于同构数据库、异构数据库以及各种数据管理系统之间的数据复制软件。
数据迁移 是指将源数据库的全量数据一次性迁移到目标数据库,适用于同构或异构数据库之间的数据迁移,一般用于源数据库在静态的情况下进行数据迁移的场景。
数据同步 是指通过全量数据装载和增量数据同步的组合来实现数据复制功能,实现源数据库在动态的场景下和目标数据库数据的一致性,适用于同构或异构数据库之间的数据实时同步。DRS会先进行全量同步,增量的数据暂时先存在缓存上,等全量跑完后在启动增量

主备同步 是指DMDRS 主节点服务承担同步功能,DMDRS 备节点服务处于等待就绪状态,持续同步主节点服务的环境。当 DMDRS 主节点服务所在的数据库节点故障后,DMDRS 备节点服务会自动成为主节点,避免同步中断。

根据实际的应用场景完成 DMDRS 的安装后,用户可以通过达梦数据融合管理平台(DMDFM)搭建 DMDRS 服务,也可以直接在服务器上搭建 DMDRS 服务。
无侵入性的增量数据捕获
DMDRS采用基于数据库日志的数据复制技术,通过实时解析数据库日志捕获增量操 作数据,无需在源数据库上创建相关对象,对源数据系统无侵入性。DMDRS采用高效的 日志扫描和读取算法,多线程并行实时捕获增量操作,并通过自主研发的数据库日志解析 引擎,实现高效的数据实时复制,无需依赖第三方的日志解析工具
装载与同步并行执行技术
装载与同步并行执行技术通过在目标端创建三种执行分组实现,分别是装载分组、等 待分组和执行分组。装载分组用于缓存装载数据并执行入库;等待分组用于缓存需要等待 提交的事务数据;执行分组用于缓存可立即执行的事务数据并执行入库。通过等待分组进 行事务数据状态切换,实现全量和增量数据的无缝衔接,提高数据复制的整体效率。
产品架构

Manager:统筹管理调度所有模块运行
CPT:源端抓取全量与增量数据
DSS:缓存转发、分发同步数据
EXEC:目标端执行数据入库同步
二、安装部署
| DMDRS 服务 | 内存要求 | 磁盘要求 |
|---|---|---|
| 源端 DMDRS | 8-16GB | 至少 100GB |
| 目标端 DMDRS | 8-16GB | 至少 100GB |
2.1 用户以及目录
为避免 DMDRS 在访问数据库文件时权限不足、环境变量错误等问题,建议源端与目的端在进行安装时选择对应的数据库的安装用户安装。例如:源端 Oracle 数据库安装用户为 oracle,则源 DMDRS 就使用 oracle 用户进行安装;目的端 DM 数据库安装用户为 dmdba,则目的 DMDRS 就使用 dmdba 用户进行安装。
bash
# DMDRS 默认安装目录在 home 目录下,用户可根据需要是否自定义安装目录
[root@localhost /]# mkdir -p /data/dmdrs5
[root@localhost /]# chown dmdba:dinstall -R /data/dmdrs5/
[root@localhost /]# chmod -R 755 /data/dmdrs5/
上传 DMDRS 安装包到 opt 目录,并修改权限,本文为以安装 dmdrs_v5.0.0.03*** 为例。
sql
cd /opt/drs
[root@localhost opt]# chown dmdba:dinstall dmdrs_rev176693_x86_rh6_64***.bin
[root@localhost opt]# chmod -R 755 dmdrs_rev176693_x86_rh6_64***.bin
2.2 DRS软件安装
安装软件
如果/tmp目录不能保证3GB的存储空间,用户可以扩展/tmp目录存
储空间或者通过设置环境变量DMDRS_INSTALL_TMPDIR指定安装
程序的临时目录。
当Linux(Unix)操作系统没有图形化界面时,用户可以使用命令行的方式安装
DMDRS。在终端进入安装程序所在文件夹,执行以下命令进行命令行安装。
bash
[dmdba@localhost drs]$ ./dmdrs_rev218265_x86_rh6_64_20260409.bin -i
Extract install files.........
数据库驱动路径配置:
DMDRS 会自动选择已安装好的 dm 数据库 bin 目录作为数据库动态库路径,用户也可自定义动态库路径,本文指定动态库路径为:/home/dmdba/dmdbms/bin
bash
[dmdba@localhost drs]$ ./dmdrs_rev218265_x86_rh6_64_20260409.bin -i
Extract install files.........
Please select the installer's language (C/c:Simplified Chinese, H/h:Hong Kong Tr aditional Chinese, E/e:English)[E/e]:c
-----------欢迎使用达梦数据复制软件安装工具-----------
输入[exit]可退出安装。
-----------安装目录-----------
指定安装目录[/home/dmdba/dmdrs5]:/data/dmdrs5
该路径不为空,是否继续安装?(Y/y or N/n)[N/n]:y
-----------安装组件-----------
请选择需要安装的组件
1.安装达梦数据融合管理平台
2.安装代理
请选择安装组件数字序号(使用空格间隔):1 2
选择的组件有:
1.安装达梦数据融合管理平台
2.安装代理
确认?[Y/y(确认选择) or N/n(重新选择)]:y
-----------许可证文件-----------
1.免费试用达梦数据复制软件(必须在试用期范围内使用,反复安装无效,使用时间为3个月)
2.使用许可证文件
指定许可证文件(1,2)[1]:1
免费试用许可证文件限制信息如下:
有效日期:1970-04-01
版本类型:试用版
许可证编号:dm66n367
授权顾客名称:DEVELOP USER
当前选择为免费试用,是否继续安装?[Y/y or N/n]:y
-----------配置-----------
数据库驱动路径配置 -数据库驱动路径[]:/home/dmdba/dmdbms/bin
注意:代理配置IP不允许设置成127.0.0.1!
代理配置-代理IP(192.168.157.140):
请手动输入代理ip!
代理配置-代理IP(192.168.157.140):192.168.157.140
代理配置-代理端口[19345]:
达梦数据融合管理平台配置-管理平台端口[8080]:
注意:密码必须至少8个字符,并且满足以下条件中的任意[两项]:数字、大写字母、小写字母、特殊字符(如!@#$%^&*等)。
达梦数据融合管理平台配置-管理平台密码:
达梦数据融合管理平台配置-管理平台确认密码:
密码与确认密码不一致,请重新输入。
注意:密码必须至少8个字符,并且满足以下条件中的任意[两项]:数字、大写字母、小写 字母、特殊字符(如!@#$%^&*等)。
达梦数据融合管理平台配置-管理平台密码:
达梦数据融合管理平台配置-管理平台确认密码:
密码与确认密码不一致,请重新输入。
注意:密码必须至少8个字符,并且满足以下条件中的任意[两项]:数字、大写字母、小写 字母、特殊字符(如!@#$%^&*等)。
达梦数据融合管理平台配置-管理平台密码:
达梦数据融合管理平台配置-管理平台确认密码:
是否使用外置库(0:不使用 1:使用 )[0]:1
外置库配置-数据库服务IP:127.0.0.1
外置库配置-数据库端口[15236]:5236
外置库配置-用户名[SYSDBA]:
外置库配置-密码[]:
-----------安装小结-----------
安装目录:[/data/dmdrs5]
数据库驱动路径:[/home/dmdba/dmdbms/bin]
代理IP:[192.168.157.140]
代理端口:[19345]
达梦数据融合管理平台IP:[127.0.0.1]
达梦数据融合管理平台端口:[8080]
外置库信息:
数据库IP:[127.0.0.1]
数据库端口:[5236]
用户名:[SYSDBA]
密码:[******]
所需磁盘空间/可用磁盘空间:[1,768 MB/9,306 MB]
确认安装?[Y/y or N/n]:y
-----------安装中-----------
server 正在安装 ... server 安装完成.
default 正在安装 ... default 安装完成.
agent 正在安装 ... agent 安装完成.
web 正在安装 ... web 安装完成.
doc 正在安装 ... doc 安装完成.
安装成功
-----------系统服务-----------
达梦数据融合管理平台服务设置
1.注册系统服务
2.不注册系统服务
启动方式(1,2)[2]:1
正在创建达梦数据融合管理平台服务....
达梦数据融合管理平台代理服务设置
1.注册系统服务
2.不注册系统服务
启动方式(1,2)[2]:1
正在创建达梦数据融合管理平台代理服务....
以下配置脚本需要以"root"用户的身份运行.
/data/dmdrs5/scripts/root/root_installer.sh
是否已执行shell脚本?(Y/y or N/n)[Y/y]:y
-----------安装总结-----------
达梦数据复制软件V5安装完成
地址:http://127.0.0.1:8080
用户名/密码:admin/******
更多安装信息,请查看安装日志文件:/data/dmdrs5/log/install.log
[dmdba@localhost drs]$ exit
注销
[root@localhost drs]# /data/dmdrs5/scripts/root/root_installer.sh
创建DfmWebService服务
Created symlink /etc/systemd/system/multi-user.target.wants/DfmWebService.service → /usr/lib/systemd/system/DfmWebService.service.
创建服务(DfmWebService)完成
创建DfmAgentService服务
Created symlink /etc/systemd/system/multi-user.target.wants/DfmAgentService.service → /usr/lib/systemd/system/DfmAgentService.service.
创建服务(DfmAgentService)完成
启动DfmWebService服务
启动DfmAgentService服务
[root@localhost drs]#
服务的启动停止
bash
# 内置数据库服务
# 查看状态
/home/dmdrs/dmdrs5/db/bin/DmServiceDFDB status
# 启动服务
/home/dmdrs/dmdrs5/db/bin/DmServiceDFDB start
# 停止服务
/home/dmdrs/dmdrs5/db/bin/DmServiceDFDB stop
# 达梦数据融合管理平台服务
# 查看状态
/home/dmdrs/dmdrs5/web/DfmWebService status
# 启动服务
/home/dmdrs/dmdrs/dmdrs5/web/DfmWebService start
# 停止服务
/home/dmdrs/dmdrs5/web/DfmWebService stop
# 达梦数据融合管理平台代理服务
# 查看状态
/home/dmdrs/dmdrs5/agent/DfmAgentService status
# 启动服务
/home/dmdrs/dmdrs5/agent/DfmAgentService start
# 停止服务
/home/dmdrs/dmdrs5/agent/DfmAgentService stop
2.3 登录DFM

2.4 准备测试环境
达梦数据库创建模式
sql
CREATE USER """DRS_TEST""" IDENTIFIED BY "Damen_123" DEFAULT TABLESPACE "MAIN";
GRANT "DBA" TO """DRS_TEST""";
GRANT "RESOURCE" TO """DRS_TEST""";
GRANT "PUBLIC" TO """DRS_TEST""";
GRANT "VTI" TO """DRS_TEST""";
GRANT "SOI" TO """DRS_TEST""";
GRANT CREATE SESSION TO """DRS_TEST""";
CREATE SCHEMA "DRS_TEST" AUTHORIZATION "SYSDBA";
CALL SP_SET_SCHEMA_DESC('DRS_TEST', 'DRS数据同步测试使用');
SQL> set schema DRS_TEST;
操作已执行
已用时间: 1.989(毫秒). 执行号:0.
SQL>
Oracle数据库创建用户
sql
#创建用户
-- 创建管理员用户 DBA_ADMIN
CREATE USER DBA_ADMIN IDENTIFIED BY "Admin@123";
-- 授予DBA管理员权限、数据泵权限
GRANT DBA, EXP_FULL_DATABASE, IMP_FULL_DATABASE TO DBA_ADMIN;
-- 创建用户(密码:Oracle_123)
CREATE USER USER01 IDENTIFIED BY Oracle_123;
-- 授予基本权限(必须)
GRANT CONNECT, RESOURCE TO USER01;
# 切换模式
ALTER SESSION SET CURRENT_SCHEMA = TEST_EXBASE;
select OWNER,table_name from all_tables where OWNER like 'TEST_EXBAS%';
select * from STUDENT fetch first 3 rows only;
PG数据库创建用户
sql
postgres=# create user dba_admin with password 'Admin@123';
CREATE ROLE
postgres=# \dn
List of schemas
Name | Owner
--------+-------------------
public | pg_database_owner
(1 row)
postgres=# create database dm_drs_test owner dba_admin;
CREATE DATABASE
postgres=# \c dm_drs_test
You are now connected to database "dm_drs_test" as user "fbase".
dm_drs_test=# \d
Did not find any relations.
dm_drs_test=#
postgres=# alter user dba_admin with superuser ;
ALTER ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
dba_admin | Superuser | {}
fbase | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
-- 数据库开启归档
postgres=# show archive_command ;
archive_command
------------------------------
cp %p /data/fbase/archive/%f
(1 row)
-- PostgreSQL 12/13版本使用"ddl_sql_pg12.sql"脚本创建触发器和辅助表。
三、测试案例
3.1 DMDRS工具PostgreSQL -> DM8单向数据同步
业务此场景规划

创建数据源

远程安装DFM代理、DRS同步工具
部署代理

sql
# 启动代理
sh startup-agent.sh
部署drs

配置同步链路

启动实例
drs启动报错
bash
2026-05-19 14:17:43 MGR[ERROR]: DRS-3037 未找到动态库文件 path: libdrcpg.so, code: 2 msg:libodbc.so.1: cannot open shared object file: No such file or directory
2026-05-19 14:17:43 MGR[ERROR]: DRS-3010 模块启动失败 Please press Enter to exit
乱码的时候使用命令来查看就不会出现乱码了
bash
[fbase@node1 log]$ cat drs_202605.log | iconv -f GBK -t UTF-8
2026-05-19 14:15:53 MGR[WARN]: 未能检测到dmdrs.key文件,即将体验免费版
2026-05-19 14:15:53 MGR[INFO]: DRS start up, current version: V5.2.5.4-Build(2026.04.08-218265_trunc_sp2)_64 (X86)(The beta)(Enterprise Edition)
2026-05-19 14:15:53 MGR[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 5G
2026-05-19 14:15:53 MGR[WARN]: 无key状态下DRS性能受限制 parse_thr: 1
2026-05-19 14:15:53 MGR[ERROR]: DRS-3037 未找到动态库文件 path: libdrcpg.so, code: 2 msg:libodbc.so.1: cannot open shared object file: No such file or directory
2026-05-19 14:15:53 MGR[ERROR]: DRS-3010 模块启动失败 Please press Enter to exit
2026-05-19 14:17:43 MGR[WARN]: 未能检测到dmdrs.key文件,即将体验免费版
2026-05-19 14:17:43 MGR[INFO]: DRS start up, current version: V5.2.5.4-Build(2026.04.08-218265_trunc_sp2)_64 (X86)(The beta)(Enterprise Edition)
2026-05-19 14:17:43 MGR[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 5G
2026-05-19 14:17:43 MGR[WARN]: 无key状态下DRS性能受限制 parse_thr: 1
2026-05-19 14:17:43 MGR[ERROR]: DRS-3037 未找到动态库文件 path: libdrcpg.so, code: 2 msg:libodbc.so.1: cannot open shared object file: No such file or directory
2026-05-19 14:17:43 MGR[ERROR]: DRS-3010 模块启动失败 Please press Enter to exit
可以看到这个动态库它有个东西没有找到
bash
[fbase@node1 instance1]$ pwd
/home/fbase/agent/INST_DRS/instance1
[fbase@node1 instance1]$ ldd libdrcpg.so
linux-vdso.so.1 (0x00007ffd25b8b000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007fb31a2d7000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007fb31a154000)
librt.so.1 => /usr/lib64/librt.so.1 (0x00007fb31a149000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007fb31a128000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fb31a123000)
libdrpub.so => ./libdrpub.so (0x00007fb31884d000)
libdrnet.so => ./libdrnet.so (0x00007fb318632000)
libdrcache.so => ./libdrcache.so (0x00007fb3183cc000)
libdrxml.so => ./libdrxml.so (0x00007fb3181bb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb31a94f000)
libodbc.so.1 => not found
[fbase@node1 instance1]$
[root@node1 install]# find / -name "libodbc.so"
/usr/lib64/libodbc.so
[root@node1 install]# ln -s /usr/lib64/libodbc.so /usr/lib64/libodbc.so.1
[fbase@node1 instance1]$ ldd libdrcpg.so
linux-vdso.so.1 (0x00007ffe1d6f4000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007f9c5d2e7000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007f9c5d164000)
librt.so.1 => /usr/lib64/librt.so.1 (0x00007f9c5d159000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f9c5d138000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f9c5d133000)
libdrpub.so => ./libdrpub.so (0x00007f9c5b85d000)
libdrnet.so => ./libdrnet.so (0x00007f9c5b642000)
libdrcache.so => ./libdrcache.so (0x00007f9c5b3dc000)
libdrxml.so => ./libdrxml.so (0x00007f9c5b1cb000)
libodbc.so.1 => /lib64/libodbc.so.1 (0x00007f9c5b15a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9c5d95f000)
libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00007f9c5b14f000)
启动成功
bash
[fbase@node1 instance1]$ sh DrsServiceinstance1 status
DrsServiceinstance1 is stopped
[fbase@node1 instance1]$ sh DrsServiceinstance1 start
Starting DrsServiceinstance1: [ OK ]
[fbase@node1 instance1]$ sh DrsServiceinstance1 status
DrsServiceinstance1 (pid 91378) is running...
[fbase@node1 instance1]$
CPT模块启动失败
bash
2026-05-19 14:29:09 MGR[INFO]: SITEID: 1 NAME: instance1 MEMCHECK: 0 PORT: 5345 GROUP: 0 VERSION: 1 PATH: /home/fbase/agent/INST_DRS/instance1/drs.xml
2026-05-19 14:30:15 link1[ERROR]: DRS-5 数据库访问失败 Connection failed, conn_str: SERVER=192.168.157.141;DRIVER=PostgreSQL ANSI(x64);UID=dba_admin;PWD=******;DATABASE=dm_drs_test;PORT=8432;, msg:[unixODBC][Driver Manager]Can't open lib 'PostgreSQL ANSI(x64)' : file not found
2026-05-19 14:30:15 link1[ERROR]: DRS-5072 数据库连接异常 server[192.168.157.141:8432]
2026-05-19 14:30:15 MGR[ERROR]: DRS-5130 CPT模块未初始化
2026-05-19 14:31:00 MGR[ERROR]: DRS-5186 LD未初始化
2026-05-19 14:31:00 MGR[ERROR]: DRS-5186 LD未初始化
2026-05-19 14:31:00 link1[ERROR]: DRS-5 数据库访问失败 Connection failed, conn_str: SERVER=192.168.157.141;DRIVER=PostgreSQL ANSI(x64);UID=dba_admin;PWD=******;DATABASE=dm_drs_test;PORT=8432;, msg:[unixODBC][Driver Manager]Can't open lib 'PostgreSQL ANSI(x64)' : file not found
是因为在数据库中需要unixODBC组件
bash
yum install -y unixODBC unixODBC-devel
yum install -y postgresql-libs postgresql-devel
# 下载odbc
[fbase@node1 odbc]$ wget https://ftp.postgresql.org/pub/odbc/versions.old/src/psqlodbc-15.00.0000.tar.gz
--2026-05-19 14:54:00-- https://ftp.postgresql.org/pub/odbc/versions.old/src/psqlodbc-15.00.0000.tar.gz
Resolving ftp.postgresql.org (ftp.postgresql.org)... 146.75.47.52, 2a04:4e42:7b::820
Connecting to ftp.postgresql.org (ftp.postgresql.org)|146.75.47.52|:443... connected.
HTTP request sent, awaiting response... 200 OK
# 编译安装
./configure --with-libpq=/usr/local/fbase/15.4/bin/pg_config --prefix=/home/fbase/odbc/install
# 使用root编译
make && make install
# 添加环境变量,在.bash_profile配置文件末尾增加ODBC驱动路径。
export LD_LIBRARY_PATH=<ODBC驱动路径>:$LD_LIBRARY_PATH
# 查看odbc存放位置
[fbase@node1 log]$ odbc_config --version
2.3.7
[fbase@node1 log]$ odbc_config --odbcini
/etc/odbc.ini
[fbase@node1 log]$odbc_config --odbcinstini
# 添加驱动
[root@node1 lib]# cat /etc/odbcinst.ini | head -n 10
# Example driver definitions
# Driver from the postgresql-odbc package
# Setup from the unixODBC package
[PostgreSQL ANSI(x64)]
Description = ODBC for PostgreSQL
Driver = /home/fbase/odbc/install/lib/psqlodbcw.so
Setup = /home/fbase/odbc/install/lib/psqlodbcw.so
# 编辑unixODBC目录下的odbc.ini文件,在里面添加类似如下内容
[PGSQL-125]
Description=DataSource for PG-125
Driver=PostgreSQL
Database=postgres
Servername=127.0.0.1
Port=8432
UserName=dba_admin
Password=Admin@123
# 连接成功
[root@node1 ~]# isql -v PGSQL-125
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
再次启动
bash
2026-05-19 16:16:28 link1[INFO]: db version: Fbase 15.4, base 1.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.0, 64-bit
2026-05-19 16:16:28 link1[INFO]: PostgreSQL version is : 15.4 (150400)
2026-05-19 16:16:28 link1[INFO]: db: dm_drs_test, archived log path : /data/fbase/archive
2026-05-19 16:16:28 link1[INFO]: db: dm_drs_test, online log path : /data/fbase/fdata/pg_wal
2026-05-19 16:16:28 MGR[INFO]: 成功获取模块的起始SCN cpt name: link1, LSN: 55285792
2026-05-19 16:16:28 MGR[INFO]: 模块正在启动 module: link1
2026-05-19 16:16:28 link1[INFO]: siteid: 1, start lsn: 55285792
2026-05-19 16:16:28 link1[INFO]: 表字典加载完毕 dict num: 0, dict pool size: 0(MB)
2026-05-19 16:16:28 link1[INFO]: 表约束加载完毕
2026-05-19 16:16:28 link1[INFO]: 正在初始化系统表信息
2026-05-19 16:16:28 link1[INFO]: 正在初始化系统表列信息
2026-05-19 16:16:28 link1[INFO]: 正在初始化主键信息...
2026-05-19 16:16:28 link1[LD][INFO]: 保存字典信息完成
2026-05-19 16:16:28 link1[INFO]: 正在初始化系统表信息
2026-05-19 16:16:28 link1[INFO]: 正在初始化系统表列信息
2026-05-19 16:16:28 link1[INFO]: 正在初始化主键信息...
2026-05-19 16:16:28 link1[LD][INFO]: 开启表的全日志 database: dm_drs_test
2026-05-19 16:16:28 link1[LD][INFO]: 开启表的全日志 database: dm_drs_test, total replica identity enabled tables: 0
2026-05-19 16:16:28 link1[LD][INFO]: 保存字典信息完成
2026-05-19 16:16:28 link1[INFO]: DDL捕获方式 mode: 未开启DDL, unicode: TRUE, length in char: 0
2026-05-19 16:16:28 link1[INFO]: [link1] searching archive log in dir: /data/fbase/archive
2026-05-19 16:16:28 link1[INFO]: archive log file: 000000010000000000000001(0x001000000, 0x001FFFFFF)
2026-05-19 16:16:28 link1[INFO]: archive log file: 000000010000000000000002(0x002000000, 0x002FFFFFF)
2026-05-19 16:16:28 link1[CLEAR][INFO]: 线程启动 THR: CLEAR
2026-05-19 16:16:28 link1[INFO]: online log file: 000000010000000000000001(0x001000000, 0x001FFFFFF)
2026-05-19 16:16:28 link1[INFO]: online log file: 000000010000000000000002(0x002000000, 0x002FFFFFF)
2026-05-19 16:16:28 link1[INFO]: online log file: 000000010000000000000003(0x003000000, 0x003FFFFFF)
2026-05-19 16:16:28 link1[INFO]: [link1] Starting file located in: 000000010000000000000003(0x003000000, 0x0034B9820, 0x003FFFFFF)
2026-05-19 16:16:28 link1[INFO]: 日志文件切换 [dm_drs_test] Switch to the online log file: 000000010000000000000003(0x003000000, 0x003FFFFFF)
2026-05-19 16:16:28 MGR[INFO]: CPT准备就绪 type: pg cpt
2026-05-19 16:16:28 MGR[INFO]: 模块已经处于运行状态 module: link1
2026-05-19 16:16:31 link1[INFO]: 表字典加载完毕 dict num: 2, dict pool size: 0(MB)
2026-05-19 16:16:31 link1[INFO]: 表字典加载完毕 dict num: 2, dict pool size: 0(MB)
数据装载成功

3.2 DMDRS工具DM8 -> DM8双向数据同步
业务场景规划

3.2.1数据库准备工作
为了保证源DMDRS服务运行中数据的一致性,源DMDRS服务需要读源数据库的归档和逻辑日志(开启在日志中记录逻辑操作的功能,用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘,重构出 DDL 和 DML 等操作,并通过获取的信息进行更深入的分析。),因此源数据库需要开启归档和逻辑日志功能。
源数据库未开启归档和逻辑日志或者参数配置不正确,将无法进行同步。
配置归档、开启逻辑日志
方式一:静态配置
设置DM8数据库配置文件"dm.ini"中ARCH_INI参数值为1,根据实际需求配置RLOG_APPEND_LOGIC的参数值,参数配置说明如下所示。
- 1:如果有主键列,记录UPDATE和DELETE操作时只包含主键列信息,若没有主键列则包含所有列信息。
- 2:不论是否有主键列,记录UPDATE和DELETE操作时都包含所有列的信息。
- 3:记录UPDATE时包含更新列的信息以及ROWID,记录DLETE时只有ROWID。在与"dm.ini"相同目录下,新建配置文 件"
dmarch.ini",并添加归档配置参数。配置示例如下:
bash
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
ARCH_FLUSH_BUF_SIZE = 2
ARCH_HANG_FLAG = 1
重启数据库服务,使配置生效。
方式二:动态配置
开启数据库归档。
-
DM8单机
sqlSQL> alter database mount; executed successfully used time: 00:00:01.144. Execute id is 0. SQL> alter database archivelog; executed successfully used time: 10.277(ms). Execute id is 0. SQL> alter database add archivelog 'DEST=/dm8/data/arch,TYPE=LOCAL,FILE_SIZE=512,SPACE_LIMIT=10240'; executed successfully used time: 7.437(ms). Execute id is 0. SQL> alter database open; executed successfully used time: 00:00:01.262. Execute id is 0. -
DSC(以两节点为例)
EP01节点
sql
SQL> alter database mount;
executed successfully
used time: 00:00:01.144. Execute id is 0.
SQL> alter database archivelog;
executed successfully
used time: 10.277(ms). Execute id is 0.
SQL> alter database add archivelog 'DEST= +DMDATA/arch_dsc0,TYPE=LOCAL,FILE_SIZE=512,SPACE_LIMIT=10240';
executed successfully
used time: 7.437(ms). Execute id is 0.
SQL> alter database add archivelog 'INCOMING_PATH=+DMDATA/arch_dsc1,DEST=DSC1,TYPE=REMOTE,FILE_SIZE=512,SPACE_LIMIT=10240';
executed successfully
used time: 7.437(ms). Execute id is 0.
SQL> alter database open;
executed successfully
used time: 00:00:01.262. Execute id is 0.
EP02节点
sql
SQL> alter database mount;
executed successfully
used time: 00:00:01.144. Execute id is 0.
SQL> alter database archivelog;
executed successfully
used time: 10.277(ms). Execute id is 0.
SQL> alter database add archivelog 'DEST= +DMDATA/arch_dsc1,TYPE=LOCAL,FILE_SIZE=512,SPACE_LIMIT=10240';
executed successfully
used time: 7.437(ms). Execute id is 0.
SQL> alter database add archivelog 'INCOMING_PATH=+DMDATA/arch_dsc0,DEST=DSC0,TYPE=REMOTE,FILE_SIZE=512,SPACE_LIMIT=10240';
executed successfully
used time: 7.437(ms). Execute id is 0.
SQL> alter database open;
executed successfully
used time: 00:00:01.262. Execute id is 0.
开启逻辑日志功能
sql
SQL> call sp_set_para_value(1,'RLOG_APPEND_LOGIC',1);
检查参数是否设置成功
sql
select para_name, para_value, sess_value, file_value from V$DM_INI where para_name = 'RLOG_APPEND_LOGIC';
select para_name, para_value, sess_value, file_value from V$DM_INI where para_name = 'ARCH_INI';
创建触发器配置DDL同步
DMDRS服务支持DDL同步功能。
-
源数据库为DM8单机和DSC时,支持触发器方式和系统表方式配置DDL同步。级联同步和
环形同步建议使用系统表方式配置DDL同步。 -
源数据库为DPC时,仅支持系统表方式配置DDL同步。
-
表级同步不支持系统表方式同步DDL。
方式一:触发器方式(推荐)
-
在源数据库执行"ddl_sql_dm8.sql"脚本创建触发器和辅助表,脚本默认位置在DMDRS执行程序目录下的scripts子目录中。
sqlSQL> set define off;-- 关闭 & 符号的变量解析功能,防弹窗 SQL> start ddl_sql_dm8.sql -
检查创建的触发器和辅助表是否有效。
-
检查创建的触发器。
sqlSQL> select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DRS_$%' and status = 'Y';查询结果如下:
sql行号 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.如果存在以上查询结果,表示DMDRS触发器创建有效。
-
检查创建的辅助表。
sqlSQL> select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DRS_$%' and status = 'VALID';查询结果如下:
sql行号 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.如果存在以上查询结果,表示DMDRS辅助表创建成功。
-
方式二:系统表方式
-
设置源数据库配置文件"dm.ini"中RLOG_APPEND_SYSTAB_LOGIC参数。
-
静态配置
-
设置源数据库配置文件"dm.ini"中RLOG_APPEND_SYSTAB_LOGIC参数值为1。
shell#redo log RLOG_APPEND_SYSTAB_LOGIC = 1 -
重启数据库服务,使配置生效。
-
-
动态配置
调用系统过程SP_SET_PARA_VALUE将源数据库配置文件"dm.ini"中RLOG_APPEND_SYSTAB_LOGIC参数值设置为1。此系统过程的定义请参考《DM8_SQL语言使用手册》。
sqlSQL> call sp_set_para_value(1,'RLOG_APPEND_SYSTAB_LOGIC',1);
-
-
检查RLOG_APPEND_SYSTAB_LOGIC参数配置是否生效。
sqlSQL> select para_name, para_value, sess_value, file_value from V$DM_INI where para_name = 'RLOG_APPEND_SYSTAB_LOGIC';查询结果如下:
sql行号 PARA_NAME PARA_VALUE SESS_VALUE FILE_VALUE ---------- ------------------------ ---------- ---------- ---------- 1 RLOG_APPEND_SYSTAB_LOGIC 1 1 1 已用时间: 3.708(毫秒). 执行号:506.如果存在以上查询结果,表示RLOG_APPEND_SYSTAB_LOGIC参数配置已生效。
添加DPI驱动的路径
DM DPI 驱动程序是 DM 数据库的 C/C++ 类驱动程序,是访问 DM 数据库的最直接的途径。DPI 接口驱动程序为 libdmdpi.so,存放目录位于 $DM_HOME/bin
bash
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin"
3.2.2 装载

3.2.3启动数据同步
在源DMDRS服务中执行数据迁移命令
-
启动控制台。
shell$ ../../drcsl cpt.xml -
连接源DMDRS服务。
shellCSL> connect -
将源数据库RESOURCES模式下表EMPLOYEE的全量数据迁移到目标数据库。
shellCSL> alter cpt_dm8 cp "sch.name='RESOURCES' and tab.name='EMPLOYEE'"
目的端
bash
[dmdba@localhost instance4]$ ./drcsl drs.xml
CSL[INFO]: CONSOLE TOOL DRS5: V5.2.5.4-Build(2026.04.08-218265_trunc_sp2)_64
CSL[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 1G
CSL[WARN]: 无key状态下DRS性能受限制 work_thr: 2
CSL> connect
CSL[INFO]: [INPUT CMD: connect]
CSL> show mode
CSL[INFO]: [INPUT CMD: show mode]
+-----------------------------------------------------------------------+
| 【模块列表】 |
+-----------------------------------------------------------------------+
| 模块名 | 类型 | 状态 | 启动时间 | 节点状态 | 链路状态 |
+-----------+------+--------+---------------------+----------+----------+
| instance4 | EXEC | 运行中 | 2026-05-20 14:16:13 | - | - |
+-----------+------+--------+---------------------+----------+----------+
命令执行成功
CSL> EXEC
CSL[INFO]: [INPUT CMD: EXEC]
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 【EXEC统计信息】 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 公共内存池使用情况 | 0/511 MB | 工作线程信息 | 活动数(0/2) | 执行等待(0) | 提交等待(0) | 执行(0) | 提交(0) | 连接数据库(0) | 异常线程号(-) | 检查点线程状态 | 空闲 |
+---------------------+---------------------+--------------+------------------+------------------+----------------+----------+----------+----------------+---------------+----------------+----------+
| 站点ID | 接收状态 | 接收日志时间 | 活动事务(个) | 等待执行事务(个) | 正在执行事务(个) | 接收字节数(MB) | 入库消息字节数(MB) | 影响行数(行) | 处理操作状态 | 私有内存池使用情况 |
+----------+----------+---------------------+--------------+------------------+------------------+----------------+---------------------+----------------+---------------+---------------------------+
| 3 | 空闲 | 2026-05-20 14:19:49 | 0 | 0 | 0 | 0 (0.00 MB/s) | 0 (0.00 MB/s) | 1000 (0 行/秒) | 空闲 | 0/63 MB |
| 3-1 | 空闲 | 暂未接收 | 0 | 0 | 0 | 0 (0.00 MB/s) | 0 (0.00 MB/s) | 0 (0 行/秒) | 空闲 | 0/0 MB |
+----------+----------+---------------------+--------------+------------------+------------------+----------------+---------------------+----------------+---------------+---------------------------+
+-------------------------------------------------------------------------------------------------------------------------+
| 【CPT统计信息】 |
+-------------------------------------------------------------------------------------------------------------------------+
| 【基础信息】 |
+-------------------------------------------------------------------------------------------------------------------------+
| IP地址 | 管理端口号 | 站点号 | 源库ID | 源库名 | CPT模块名称 | CPT模块状态 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
| 192.168.157.142 | 5345 | 3 | 0 | | link1 | CPT已经启动完成 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
| 【读取信息】 |
+-------------------------------------------------------------------------------------------------------------------------+
| 读取状态 | 读取流量(MB) | 当前读取LSN | 读取队列长度 | 当前文件 | 读取队列百分比(%) | 当前时间 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
| 空闲 | 2.03(0.00 MB/s) | 62370 | 0 | DAMENG01.log | 0 | 2026-05-20 14:19:49 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
| 【解析信息】 |
+-------------------------------------------------------------------------------------------------------------------------+
| 解析状态 | 解析流量(MB) | 当前解析LSN | 解析队列长度 | 过滤操作数 | 解析队列百分比(%) | 当前时间 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
| 空闲 | 0.33(0.00 MB/s) | 62355 | 0/0 | 0 | 0 | 2026-05-20 14:19:49 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
| 【发送信息】 |
+-------------------------------------------------------------------------------------------------------------------------+
| 发送状态 | 发送流量(MB) | 当前发送LSN | 发送队列长度 | 发送次数 | 发送队列百分比(%) | 当前时间 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
| 空闲 | 0.73(0.00 MB/s) | 62355 | 0/0 | 23 | 0 | 2026-05-20 14:19:49 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+---------------------+
命令执行成功
CSL>
CSL> show instance4 lag
CSL[INFO]: [INPUT CMD: show instance4 lag]
+-----------------------------------------------------------------------------------------------------------------------------------------+
| 【同步表延迟信息】 |
+-----------------------------------------------------------------------------------------------------------------------------------------+
| 站点 | 站点ID | 分组ID | 同步对象 | 当前插入数 | 当前更新数 | 当前删除数 | 最新同步LSN | 最新执行时间 | 表同步延迟(秒) |
+-------+--------+--------+-------------------+------------+------------+------------+-------------+---------------------+----------------+
| link1 | 3 | 32767 | DRS_TEST.SYS_DEPT | 1000 | 0 | 0 | 62355 | 2026-05-20 14:19:50 | <1 |
+-------+--------+--------+-------------------+------------+------------+------------+-------------+---------------------+----------------+
命令执行成功
源端
bash
[dmdba@node2 instance3]$ ./drcsl drs.xml
CSL[INFO]: CONSOLE TOOL DRS5: V5.2.5.4-Build(2026.04.08-218265_trunc_sp2)_64
CSL[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_ size: 4G
CSL[WARN]: 无key状态下DRS性能受限制 parse_thr: 1
CSL> connect
CSL[INFO]: [INPUT CMD: connect]
CSL> start
CSL[INFO]: [INPUT CMD: start]
MGR[INFO]: 模块已经处于运行状态 module: link1
命令执行成功
CSL> show mode
CSL[INFO]: [INPUT CMD: show mode]
+--------------------------------------------------------------------+
| 【模块列表】 |
+--------------------------------------------------------------------+
| 模块名 | 类型 | 状态 | 启动时间 | 节点状态 | 链路状态 |
+--------+------+--------+---------------------+----------+----------+
| link1 | CPT | 运行中 | 2026-05-20 13:41:11 | - | - |
+--------+------+--------+---------------------+----------+----------+
CSL> cpt
CSL[INFO]: [INPUT CMD: cpt]
+---------------------------------------------------------------------------------------------------------------------+
| 【CPT统计信息】 |
+---------------------------------------------------------------------------------------------------------------------+
| 【基础信息】 |
+---------------------------------------------------------------------------------------------------------------------+
| IP地址 | 管理端口号 | 站点号 | 源库ID | 源库名 | CPT模块名称 | CPT模块状态 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
| 192.168.157.142 | 5345 | 3 | 0 | | link1 | CPT已经启动完成 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
| 【读取信息】 |
+---------------------------------------------------------------------------------------------------------------------+
| 读取状态 | 读取流量(MB) | 当前读取LSN | 读取队列长度 | 当前文件 | 读取队列百分比(%) | 当前时间 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
| 空闲 | 0.24(0.00 MB/s) | 53788 | 0 | DAMENG01.log | 0 | - |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
| 【解析信息】 |
+---------------------------------------------------------------------------------------------------------------------+
| 解析状态 | 解析流量(MB) | 当前解析LSN | 解析队列长度 | 过滤操作数 | 解析队列百分比(%) | 当前时间 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
| 空闲 | 0.00(0.00 MB/s) | 0 | 0/0 | 0 | 0 | - |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
| 【发送信息】 |
+---------------------------------------------------------------------------------------------------------------------+
| 发送状态 | 发送流量(MB) | 当前发送LSN | 发送队列长度 | 发送次数 | 发送队列百分比(%) | 当前时间 |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
| 空闲 | 0.01(0.00 MB/s) | 0 | 0/0 | 88 | 0 | - |
+-----------------+-----------------+-------------+--------------+--------------+-------------------+-----------------+
+---------------------------------------------------------------------------------------------------------------------+
| 【EXEC站点统计信息】 |
+---------------------------------------------------------------------------------------------------------------------+
| | | 接收状态 | 空闲 | 活动事务(个) | 0 | 私有内存池使用情况 | 0/63 MB |
| | |--------------------+---------------+------------------+-------------+--------------------+------------------+
| | | 接收字节数(MB) | 0 (0.00 MB/s) | 活动大对象(个) | 0 | 检查点占用磁盘 | 0.00/51200.00 MB |
| | |--------------------+---------------+------------------+-------------+--------------------+------------------+
| 站| | 接收日志数 | 89 | 等待执行事务(个) | 0 | 检查点LSN | 0 |
| | |--------------------+---------------+------------------+-------------+--------------------+------------------+
| 点| 3 | 起始接收日志LSN | 0 | 正在执行事务(个) | 0 | 检查点LSN日志时间 | 暂未执行 |
| | |--------------------+---------------+------------------+-------------+--------------------+------------------+
| | | 最新接收日志LSN | 0 | 已执行事务(个) | 0 | 回滚事务(个) | 0 |
| | |--------------------+---------------+------------------+-------------+--------------------+------------------+
| | | 最新接收日志时间 | 暂未接收 | 影响行数(行) | 0 (0 行/秒) | 处理操作状态 | 空闲 |
| | |--------------------+---------------+------------------+-------------+--------------------+------------------+
| | | 入库消息字节数(MB) | 0 (0.00 MB/s) | | | | |
+---+---+--------------------+---------------+------------------+-------------+--------------------+------------------+
命令执行成功
命令执行成功
CSL> show link1 table
CSL[INFO]: [INPUT CMD: show link1 table]
+-----------------------------------------------------------------------------------------------------------+
| 【表操作统计信息】 |
+-----------------------------------------------------------------------------------------------------------+
| 模式名 | 表名 | 插入操作数 | 删除操作数 | 更新操作数 | 大对象操作数 | 最近LSN | 最近操作时间 |
+----------+----------+------------+------------+------------+--------------+---------+---------------------+
| DRS_TEST | SYS_USER | 1000 | 0 | 0 | 0 | 58035 | 2026-05-20 14:10:12 |
| DRS_TEST | SYS_DEPT | 1000 | 0 | 0 | 0 | 55915 | 2026-05-20 14:08:03 |
+----------+----------+------------+------------+------------+--------------+---------+---------------------+
命令执行成功
双向同步
bash
[dmdba@node2 instance3]$ ./drcsl drs.xml
CSL[INFO]: CONSOLE TOOL DRS5: V5.2.5.4-Build(2026.04.08-218265_trunc_sp2)_64
CSL[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 4G
CSL[WARN]: 无key状态下DRS性能受限制 parse_thr: 1
CSL[WARN]: 无key状态下DRS性能受限制 work_thr: 2
CSL> connect
CSL[INFO]: [INPUT CMD: connect]
CSL> show
CSL[INFO]: [INPUT CMD: show]
+-----------------------------------------------------------------------+
| 【模块列表】 |
+-----------------------------------------------------------------------+
| 模块名 | 类型 | 状态 | 启动时间 | 节点状态 | 链路状态 |
+-----------+------+--------+---------------------+----------+----------+
| link1 | CPT | 运行中 | 2026-05-20 14:28:23 | - | - |
| instance3 | EXEC | 运行中 | 2026-05-20 14:28:23 | - | - |
+-----------+------+--------+---------------------+----------+----------+
命令执行成功
注意:
- 双向同步的时候只需要在一端把字典和表信息加载成功就可以了,不需要两端都加载。
- 常用的命令
sql
A节点
alter cpt_dm8_A set lsn
启动cpt
start cpt_dm8_A
B节点
alter cpt_dm8_B set lsn
启动cpt
start cpt_dm8_B
A、B节点都要添加字典
SHOW cpt_dm8_A LOAD DICT ALL
show cpt_dm8_A load table all
alter cpt_dm8_A add table "sch.name='DRS_TEST' and tab.name='TEST_TABLE'"
SHOW cpt_dm8_B LOAD DICT ALL
show cpt_dm8_B load table all
alter cpt_dm8_B add table "sch.name='DRS_TEST' and tab.name='TEST_TABLE'"
A、B节点任意节点添加字典
SHOW cpt_dm8_A LOAD DICT ALL
show cpt_dm8_A load table all
alter cpt_dm8_A add table "sch.name='DRS_TEST' and tab.name='TEST_TABLE'"
SHOW cpt_dm8_B LOAD DICT ALL
show cpt_dm8_B load table all
alter cpt_dm8_B add table "sch.name='DRS_TEST' and tab.name='TEST_TABLE'"
-- 如果表没有执行成功就重新装载
CP link2 "sch.name='PUBLIC'"