目标:通过 DMDRS(源端 CPT -> 目标端 EXEC)将源数据库(DSC)
TEST.TT
表的全量与增量数据分别同步和迁移到目标数据库(DM8)相同模式下的表TEST.TT
。
本文基于搭建记录整理、补充了步骤说明、配置说明、要点提示与常见故障排查,便于复制到生产或测试环境。
DMDRS
。ARCH_INI
, RLOG_APPEND_LOGIC
, DSC_TRX_VIEW_SYNC
)。cpt_dsc.xml
(源端),在 DM8 上部署并配置 exec.xml
(目标端)。drcsl
设置起始 LSN,添加需要同步的表并进行初次全量装载。数据同步场景中已部署两个数据库,包括源数据库DSC(192.168.126.101/102)和目标数据库DM8(192.168.56.101),现需通过搭建DMDRS,将源数据库TEST模式下表TT的全量数据和增量数据同步到目标数据库TEST模式下的表TT中。
源DMDRS:捕获源数据库的数据,将捕获到的数据发送到目标DMDRS。
目标DMDRS:将接收的数据同步到目标数据库。
环境中很多组件会占用端口(CSS、ASM、DB、MAL 等),部署 DMDRS 前必须保证 mgr_port
与 ld_library
等不会冲突。
服务/组件 | 端口号 | 节点分配 | 配置文件 | 用途说明 |
---|---|---|---|---|
CSS 组服务端口 | 9836 | 节点1(CSS0) | dmdcr_cfg.ini |
集群同步服务通信端口 |
9837 | 节点2(CSS1) | |||
ASM 组服务端口 | 5836 | 节点1(ASM0) | dmdcr_cfg.ini |
ASM 存储管理服务端口 |
5837 | 节点2(ASM1) | |||
ASM MAL 通信端口 | 4836 | 节点1(ASM0) | dmasvrmal.ini |
ASM 节点间消息通信端口 |
4837 | 节点2(ASM1) | |||
数据库实例端口 | 5236 | 节点1(DSC01) | dminit.ini |
数据库实例监听端口(默认) |
5236 | 节点2(DSC02) | |||
DB MAL 通信端口 | 6536 | 节点1(DSC01) | dminit.ini |
数据库节点间消息通信端口 |
6537 | 节点2(DSC02) |
DMDRS服务 | IP地址和端口 | 站点号 | 连接数据库 | 说明 |
---|---|---|---|---|
源DMDRS | 192.168.126.101:5345 | 1 | 源数据库 DSC<br>ASM服务的服务名:GRP_ASM<br>ASM服务的用户名/密码:default/[PASSWORD]<br>节点1:192.168.126.101:5236<br>节点2:192.168.126.102:5236 | 源DMDRS服务器需要安装DMDPI驱动与源数据库DSC连接。 |
目标DMDRS | 192.168.56.101:5345 | 2 | 目标数据库 DM8<br>用户名:SYSDBA<br>密码:[PASSWORD]<br>IP 端口:192.168.56.101:5236<br> | 目标DMDRS服务器需要安装DMDPI驱动与目标数据库连接。 |
💡 提示
ASM服务有默认用户密码。源数据库为DSC时,本地登录ASM时,可以使用default用户,默认密码为default;远程登录ASM时,使用asmsys用户,对应的密码为abcd。
源数据库、源DMDRS服务和目标DMDRS服务相关的目录规划如下表所示。需要保持源/目标服务有独立目录并保证运行用户对相关目录有读写执行权限。
目标类型 | 目录名 | 目录示例 |
---|---|---|
源数据库 | 数据库归档文件目录 | 0#+DMDATA/DSC01/arch<br>1#+DMDATA/DSC02/arch |
数据库DDL同步脚本目录 | /home/dmdba/dmdrs/scripts | |
源DMDRS | 执行程序目录 | /home/dmdba/dmdrs |
配置文件路径 | /home/dmdba/dmdrs/cpt.xml | |
服务脚本模板目录 | /home/dmdba/dmdrs/service_template | |
服务脚本目录 | /home/dmdba/dmdrs | |
console远程控制工具 | /home/dmdba/dmdrs/drcsl | |
目标DMDRS | 执行程序目录 | /dmdrs/release |
配置文件路径 | /dmdrs/release/exec.xml | |
服务脚本模板目录 | /dmdrs/release/service_template | |
服务脚本目录 | /dmdrs/release | |
console远程控制工具 | /dmdrs/release/drcsl |
在运行DMDRS服务前,数据库管理员需要对数据库做如下准备工作。
配置服务 | 准备工作 |
---|---|
源DMDRS | - 除数据迁移场景外,其他应用场景均需要开启源数据库的归档和逻辑日志。<br>- 除数据迁移场景外,其他应用场景均需要配置DDL同步。<br>- 创建源数据库同步用户DMDRS。<br>- 配置源数据库同步用户最小权限。 |
目标DMDRS | - 创建目标数据库同步用户DMDRS。<br>- 配置目标数据库同步用户最小权限。 |
请源数据库管理员和目标数据库管理员分别创建数据库同步用户DMDRS,并赋予同步所需权限。建议源数据库DMDRS用户不赋予DBA权限,赋予同步所需的最小权限即可;建议目标数据库DMDRS用户赋予DBA权限,如果不能赋予DBA权限,为确保同步的正确性,需赋予DMDRS用户同步所需的最小权限。
create user "DMDRS" identified by "[PASSWORD]";
-- ## 基础权限
-- 插入、删除、更新数据时,需要数据操作权限
GRANT PUBLIC TO DMDRS;
-- 需要系统表、系统字典和动态视图的查询权限
GRANT SOI,VTI TO DMDRS;
-- 需要创建会话权限
GRANT CREATE SESSION TO DMDRS;
-- ## 装载相关权限
-- 需要非同步用户下待装载表/序列上的查询权限
GRANT SELECT ON <待装载表/序列的模式名>.<待装载表/序列的表名> TO DMDRS;
-- ## 同步相关权限
-- DM8触发器同步时,如果数据库用户不是SYSDBA用户,需要对SYSDBA.DRS_$DDL_LOG具有查询权限
GRANT SELECT ON SYSDBA.DRS_$DDL_LOG TO DMDRS;
-- ## DSC同步相关权限
-- DSC时,需要新增以下权限:
GRANT CREATE TABLE TO DMDRS;
GRANT CREATE PACKAGE TO DMDRS;
-- ## 基础权限
-- 插入、删除、更新数据时,需要数据操作权限
GRANT PUBLIC TO DMDRS;
-- 启动时需要在目标数据库中创建辅助表和辅助存储过程
GRANT RESOURCE TO DMDRS;
-- 需要查询数据库的相关参数信息、系统表字典信息
GRANT SOI,VTI TO DMDRS;
-- 需要创建会话权限
GRANT CREATE SESSION TO DMDRS;
-- ## 装载与同步相关权限
-- 需要非同步用户模式下已存在的待同步表/序列的操作权限
GRANT INSERT ON <目标表的模式名>.<目标表名> TO DMDRS;
GRANT UPDATE ON <目标表的模式名>.<目标表名> TO DMDRS;
GRANT DELETE ON <目标表的模式名>.<目标表名> TO DMDRS;
GRANT SELECT ON <目标序列的模式名>.<目标序列名> TO DMDRS;
-- 需要非同步用户模式下未存在的表/序列的数据的操作权限。也可以在目标同步表创建后,同上行所述单独为每张表赋予操作权限
GRANT INSERT ANY TABLE TO DMDRS;
GRANT UPDATE ANY TABLE TO DMDRS;
GRANT DELETE ANY TABLE TO DMDRS;
GRANT SELECT ANY TABLE TO DMDRS;
GRANT SELECT ANY SEQUENCE TO DMDRS;
-- 需要非同步用户模式下创建表注释的权限
GRANT COMMENT ANY TABLE TO DMDRS;
-- 需要非同步用户模式下对象的DDL权限
GRANT CREATE ANY <对象类型> TO DMDRS;
GRANT ALTER ANY <对象类型> TO DMDRS;
GRANT DROP ANY <对象类型> TO DMDRS;
-- 需要非模式对象(表空间、用户、角色和公共同义词)的DDL权限
GRANT CREATE <对象类型> TO DMDRS;
GRANT ALTER <对象类型> TO DMDRS;-- 角色和公共同义词不需要此权限
GRANT DROP <对象类型> TO DMDRS;
-- 需要赋予同步用户辅助存储过程的执行权限以及非同步用户下模式所属用户的存储过程的创建权限
GRANT EXECUTE ON PROCEDURE "DRS_$DDL_SQL_PROC" TO DMDRS;
GRANT CREATE PROCEDURE TO <非同步用户下模式所属的用户>;
❗ 重要
具体权限需根据安全策略与是否允许跨模式对象创建来决定,文中示例仅供参考。
一般建议 DMDSC 集群中的节点,除了配置本地归档之外,再双向配置集群中所有其他节点的远程归档。查询 v$dm_arch_ini
、v$arch_status
等动态视图可以获取归档配置以及归档状态等相关信息。
在 dm.ini
中编辑:
#configuration file
ARCH_INI = 1
#redo log
RLOG_APPEND_LOGIC = 1
ARCH_INI
含义:
1
:有主键则只记录主键列;无主键则记录所有列。
2
:总是记录所有列。
3
:记录更新列与 ROWID,删除只记录 ROWID。
在与dm.ini
相同目录下,新建配置文件dmarch.ini
,并添加归档配置参数。配置示例如下:
DSC01 实例的 dmarch.ini
配置:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/DSC01/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC02
ARCH_INCOMING_PATH = +DMDATA/DSC02/arch
DSC02 实例的 dmarch.ini
配置:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/DSC02/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC01
ARCH_INCOMING_PATH = +DMDATA/DSC01/arch
⚠ 注意
在
dmarch.ini
中配置本地与远程归档路径(示例见原文),并确保远程归档的本地路径与真实路径完全一致,否则服务启动校验会失败。
通过静态配置或者动态配置开启源数据库的归档和逻辑日志后,检查ARCH_INI
和RLOG_APPEND_LOGIC
参数配置是否生效。
检查ARCH_INI
参数配置是否生效。
select para_name, para_value, sess_value, file_value from V$DM_INI where para_name = 'ARCH_INI';
查询结果如下:
行号 PARA_NAME PARA_VALUE SESS_VALUE FILE_VALUE
---------- --------- ---------- ---------- ----------
1 ARCH_INI 1 1 1
如果存在以上查询结果,表示ARCH_INI
参数配置已生效。
检查RLOG_APPEND_LOGIC
参数配置是否生效。
select para_name, para_value, sess_value, file_value from V$DM_INI where para_name = 'RLOG_APPEND_LOGIC';
查询结果如下:
行号 PARA_NAME PARA_VALUE SESS_VALUE FILE_VALUE
---------- ----------------- ---------- ---------- ----------
1 RLOG_APPEND_LOGIC 1 1 1
如果存在以上查询结果,表示RLOG_APPEND_LOGIC
参数配置已生效。
如果源数据库是 DSC,建议将 DSC_TRX_VIEW_SYNC
设置为 1
并在所有节点一致,避免节点启动失败。
#dm.ini
DSC_TRX_VIEW_SYNC = 1
重启DSC所有节点的服务,使配置生效。并检查DSC_TRX_VIEW_SYNC
参数配置是否生效。
select para_name, para_value, sess_value, file_value from V$DM_INI where para_name = 'DSC_TRX_VIEW_SYNC';
查询结果如下:
行号 PARA_NAME PARA_VALUE SESS_VALUE FILE_VALUE
---------- ----------------- ---------- ---------- ----------
1 DSC_TRX_VIEW_SYNC 1 1 1
如果存在以上查询结果,表示DSC_TRX_VIEW_SYNC
参数配置已生效。
为提升从ASM读日志的性能,建议将DSC数据库所有节点的配置文件“dmdcr.ini”中DMDCR_ASM_TRACE_LEVEL参数配置为3。
DMDCR_ASM_TRACE_LEVEL参数用来指定日志级别,日志级别越低(参数值越小),输出的日志越详细。当设置日志级别为较低级别时,兼容输出级别大的日志,如WARN级别也可输出ERROR级别的日志。
1:TRACE级别。默认值为1。
2:INFO级别
3:WARN级别
4:ERROR级别
5:FATAL级别
使用触发器方式配置DDL同步。
⚠ 注意
- 创建DDL触发器和辅助表时,请使用具有DBA权限的用户。
- 如果触发器或辅助表无效或缺失,会导致DDL同步失败,甚至会影响数据库。
在源数据库DSC的所有节点上执行“ddl_sql_dm8.sql”脚本创建触发器和辅助表,脚本默认位置在DMDRS执行程序目录下的scripts子目录中。
⚠ 注意
因共享存储的特性,一个节点执行后数据已有公用的辅助表和触发器,无需各个节点重复执行。
set define off;
start ddl_sql_dm8.sql #使用绝对路径定位,如/home/dmdba/dmdrs/scripts/ddl_sql_dm8.sql
设置源DMDRS服务的运行用户对服务所在目录及子目录的读、写和执行权限,并设置运行用户同数据库归档文件所在目录属同一用户组,此用户组应对归档文件所在目录及子目录有读权限。
设置目标DMDRS服务的运行用户对服务所在目录及子目录的读、写和执行权限。
这里新建用户dmdrs隶属于dmdba组,而dmdba组为数据库管理员用户dmdba所属。
useradd -g dmdba -m -d /home/dmdrs -s /bin/bash dmdrs passwd dmdrs
在源DMDRS服务器和目标DMDRS的服务器的环境变量中添加DMDPI驱动文件路径。
vi ~/.bash_profile
# 源DMDRS服务器环境变量中添加DMDPI驱动路径。
export LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin:$LD_LIBRARY_PATH #记得改为自己的路径
# 目标DMDRS服务器环境变量中添加DMDPI驱动路径
export LD_LIBRARY_PATH=/dm8/bin:$LD_LIBRARY_PATH #记得改为自己的路径
source ~/.bash_profile
echo $LD_LIBRARY_PATH
全局的情况下:即所有用户都能用这个配置
vim /etc/vimrc #root
在文件中添加:
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
模板在conf_sample,配置时复制到上级目录中。
cp exec.xml ../exec.xml
在目标DMDRS服务的配置文件目录,打开并修改exec.xml配置文件,修改后配置文件如下所示。
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5345</mgr_port><!--如:5345-->
<siteid>2</siteid><!--如:2-->
</base>
<exec>
<name>exec_dm8</name><!--如:exec_dm8-->
<login>
<dbtype>dm8</dbtype><!--如:dm8-->
<server>192.168.56.101</server><!--如:192.168.20.21-->
<user>DMDRS</user><!--如:DMDRS-->
<pwd>[PASSWORD]</pwd><!--如:DMDRS-->
<port>5236</port><!--如:5236-->
</login>
</exec>
</drs>
在源DMDRS服务的配置文件目录,打开并修改cpt_dsc.xml配置文件,修改后配置文件如下所示。
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5345</mgr_port><!--如:5345-->
<siteid>1</siteid><!--如:1-->
</base>
<cpt>
<name>cpt_dm8</name><!--如:cpt_dm8-->
<login>
<dbtype>dsc</dbtype><!--如:dm8-->
<server>192.168.126.101</server><!--如:192.168.20.24-->
<user>DMDRS</user><!--如:DMDRS-->
<pwd>[PASSWORD]</pwd><!--如:DMDRS-->
<port>5236</port><!--如:5236-->
</login>
<send>
<ip>192.168.56.101</ip><!--如:192.168.20.21-->
<port>5345</port><!--如:5345-->
<target_name>exec_dm8</target_name><!--如:exec_oracle-->
<map>
<item>TEST.TT==TEST.TT</item><!--如:*.*==*.*-->
</map>
</send>
<rac>
<nodes>2</nodes><!--如:2-->
<rac_type>ASM</rac_type><!--如:ASM-->
<login>
<server>127.0.0.1</server><!--如:127.0.0.1-->
<user>default</user><!--如:default-->
<pwd[PASSWORD]3</pwd><!--如:default-->
<port>5836</port><!--如:9349-->
</login>
<dir_replace>
<item>0#+DMDATA/DSC01/arch</item><!--如:0#+DMDATA/arch_dsc0-->
<item>1#+DMDATA/DSC02/arch</item><!--如:1#+DMDATA/arch_dsc1-->
</dir_replace>
</rac>
</cpt>
</drs>
cp TemplateService ../DrsService #服务名可以自定义
vi DrsService
INSTALL_HOME=/dmdrs/release #并非安装版 PROG_DIR=/dmdrs/release CONF_PATH=/dmdrs/release/exec.xml EXEC_PROG_NAME=drsvr SERVICE_TYPE_NAME="drs server"
./DrsService start
cp TemplateService ../DrsService
vi DrsService
INSTALL_HOME=/home/dmdba/dmdrs PROG_DIR=/home/dmdba/dmdrs CONF_PATH=/home/dmdba/dmdrs/cpt_dsc.xml EXEC_PROG_NAME=drsvr SERVICE_TYPE_NAME="drs server" #因为有空格,需要双引号括起来
./DrsService start
使用服务脚本启动服务后,需要使用远程控制台对服务中的模块执行启动命令。
cd /home/dmdba/dmdrs #切换至执行目录
./drcsl cpt_dsc.xml
💡 提示
此处提示mem_size参数配置过大,可以在xml配置文件中添加
<mem_size>
参数解决,因本次测试环境内存有限,故不作演示。
connect
alter cpt_dm8 set lsn
start
alter cpt_dm8 add table "sch.name='TEST' and tab.name='TT'"
在源数据库表TEST.TT中插入数据,如果插入的数据能正确地同步到目标数据库,则表示数据同步成功。
在源端分别建立普通表TN和分区表TP
-- 普通表 TN(主键 + 简单字段)
CREATE TABLE tn (
id BIGINT PRIMARY KEY,
name VARCHAR2(200),
value_int NUMBER(10),
created_at DATE
);
-- 分区表 TP(按 id RANGE 分区,10 个分区)
CREATE TABLE tp (
id BIGINT,
name VARCHAR2(200),
value_int NUMBER(10),
created_at DATE,
PRIMARY KEY (id)
)
PARTITION BY RANGE (id) (
PARTITION p1 VALUES LESS THAN (100001),
PARTITION p2 VALUES LESS THAN (200001),
PARTITION p3 VALUES LESS THAN (300001),
PARTITION p4 VALUES LESS THAN (400001),
PARTITION p5 VALUES LESS THAN (500001),
PARTITION p6 VALUES LESS THAN (600001),
PARTITION p7 VALUES LESS THAN (700001),
PARTITION p8 VALUES LESS THAN (800001),
PARTITION p9 VALUES LESS THAN (900001),
PARTITION p10 VALUES LESS THAN (1000001)
);
使用sqlark生成数据
客户端内可查看数据是否写入
修改源端使得有select权限
启动台。
./drcsl cpt.xml
连接源DMDRS服务。
connect
将源数据库TEST模式下表TN的全量数据迁移到目标数据库。
alter cpt_dm8 cp "sch.name='TEST' and tab.name='TN'"
根据csl控制台返回信息,我们可以知道迁移指令的默认掩码组合|CREATE|NOLOCK|INSERT|INDEX|TABLE|CHECK|GROUP。
CSL[INFO]: [INPUT CMD: alter cpt_dm8 cp "sch.name='TEST' and tab.name='TN'"]
MGR[INFO]: 获取到装载掩码组合 mask: |CREATE|NOLOCK|INSERT|INDEX|TABLE|CHECK|GROUP
MGR[INFO]: CPT模块装载命令执行成功 cpt name: cpt_dm8
命令执行成功
阅读源端部分log,可以发现装载因GROUP掩码分为了10组。
💡 提示
GROUP该掩码表示分组装载。支持SF_GET_TABLE_GROUP_INFO_BY_ROWS函数的DM8版本数据库可以指定分组的条件行数,紧跟数字表示每达到多少行分一组,最小分组行数为5000,默认分组行数为10w。此处我们表为100w行,故默认分10组。
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 装载开始
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 表开始分组装载 table: TEST.TN[1245], count: 10
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [1], rowid: [AAAAAAAAAAAAAAAAAB, AAAAAAAAAAAAAAAYf+]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 1, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB'
AND ROWID <= 'AAAAAAAAAAAAAAAYf+'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [2], rowid: [AAAAAAAAAAAAAAAYf/, AAAAAAAAAAAAAAAw6f]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 2, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAAAYf/'
AND ROWID <= 'AAAAAAAAAAAAAAAw6f'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [3], rowid: [AAAAAAAAAAAAAAAw6g, AAAAAAAAAAAAAABJaY]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 3, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAAAw6g'
AND ROWID <= 'AAAAAAAAAAAAAABJaY'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [4], rowid: [AAAAAAAAAAAAAABJaZ, AAAAAAAAAAAAAABh6U]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 4, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAABJaZ'
AND ROWID <= 'AAAAAAAAAAAAAABh6U'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [5], rowid: [AAAAAAAAAAAAAABh6V, AAAAAAAAAAAAAAB6aM]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 5, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAABh6V'
AND ROWID <= 'AAAAAAAAAAAAAAB6aM'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [6], rowid: [AAAAAAAAAAAAAAB6aN, AAAAAAAAAAAAAACS6I]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 6, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAAB6aN'
AND ROWID <= 'AAAAAAAAAAAAAACS6I'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [7], rowid: [AAAAAAAAAAAAAACS6J, AAAAAAAAAAAAAACrZ6]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 7, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAACS6J'
AND ROWID <= 'AAAAAAAAAAAAAACrZ6'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [8], rowid: [AAAAAAAAAAAAAACrZ7, AAAAAAAAAAAAAADD5+]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 8, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAACrZ7'
AND ROWID <= 'AAAAAAAAAAAAAADD5+'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [9], rowid: [AAAAAAAAAAAAAADD5/, AAAAAAAAAAAAAADcZ0]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 9, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAADD5/'
AND ROWID <= 'AAAAAAAAAAAAAADcZ0'
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TN[1245], group: [10], rowid: [AAAAAAAAAAAAAADcZ1, +++]
2025-08-28 15:42:46 cpt_dm8[LD][INFO]: table: TEST.TN[1245], groupid: 10, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TN" WHERE ROWID >= 'AAAAAAAAAAAAAADcZ1'
执行端部分log
2025-08-28 15:42:46 cpt_dm8[LD01][INFO]: 装载开始
2025-08-28 15:42:47 EXE[INFO]: SQL语句执行成功 sql: -- drs ddl, siteid list[1]
CREATE TABLE "TEST"."TN"("ID" BIGINT NOT NULL,"NAME" VARCHAR2(200) NULL,"VALUE_INT" NUMBER(10,0) NULL,"CREATED_AT" DATE NULL)
2025-08-28 15:42:59 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 1, row: 100350, expect row: 100350, speed: 7944 rps
2025-08-28 15:42:59 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 8, row: 100356, expect row: 100356, speed: 7982 rps
2025-08-28 15:43:00 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 3, row: 100345, expect row: 100345, speed: 7415 rps
2025-08-28 15:43:01 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 2, row: 100001, expect row: 100001, speed: 6920 rps
2025-08-28 15:43:01 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 6, row: 100348, expect row: 100348, speed: 6845 rps
2025-08-28 15:43:01 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 10, row: 97228, expect row: 97228, speed: 6645 rps
2025-08-28 15:43:02 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 4, row: 100348, expect row: 100348, speed: 6515 rps
2025-08-28 15:43:02 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 5, row: 100344, expect row: 100344, speed: 6519 rps
2025-08-28 15:43:02 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 7, row: 100338, expect row: 100338, speed: 6529 rps
2025-08-28 15:43:02 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TN[1245], group: 9, row: 100342, expect row: 100342, speed: 6550 rps
2025-08-28 15:43:03 EXE[INFO]: SQL语句执行成功 sql: -- drs ddl, siteid list[1]
ALTER TABLE "TEST"."TN" ADD CONSTRAINT "CONS134219018X" NOT CLUSTER PRIMARY KEY("ID")
2025-08-28 15:43:03 cpt_dm8[LD01][INFO]: 表完成装载 table: TEST.TN[1245], row: 1000000, expect row: 1000000, speed: 59456 rps
2025-08-28 15:43:03 cpt_dm8[LD01][INFO]: 本次装载结束
将源数据库TEST模式下表TP的全量数据迁移到目标数据库。
alter cpt_dm8 cp "sch.name='TEST' and tab.name='TP'"
源端部分log
观察log可以看出来,这里分组表的迁移会优先走的表分组。
⚠ 注意
分区表的装载在不使用GROUP掩码时,将自动按子分区来分组,每个子分区将作为一个组进行装载。
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 装载开始
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 表开始分组装载 table: TEST.TP[1246], count: 10
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [1], rowid: [AAAAAAAATfAAAAAAAB, AAAAAAAATf////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 1, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P1") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [2], rowid: [AAAAAAAATgAAAAAAAB, AAAAAAAATg////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 2, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P2") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [3], rowid: [AAAAAAAAThAAAAAAAB, AAAAAAAATh////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 3, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P3") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [4], rowid: [AAAAAAAATiAAAAAAAB, AAAAAAAATi////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 4, select sql: SE OWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P4") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [5], rowid: [AAAAAAAATjAAAAAAAB, AAAAAAAATj////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 5, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P5") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [6], rowid: [AAAAAAAATkAAAAAAAB, AAAAAAAATk////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 6, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P6") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [7], rowid: [AAAAAAAATlAAAAAAAB, AAAAAAAATl////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 7, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P7") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [8], rowid: [AAAAAAAATmAAAAAAAB, AAAAAAAATm////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 8, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P8") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [9], rowid: [AAAAAAAATnAAAAAAAB, AAAAAAAATn////////]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 9, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P9") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB' AND ROWID <= 'AAAAAAAAAA////////'
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: 正在装载表的分组 table: TEST.TP[1246], group: [10], rowid: [AAAAAAAAToAAAAAAAB, +++]
2025-08-28 15:46:39 cpt_dm8[LD][INFO]: table: TEST.TP[1246], groupid: 10, select sql: SELECT ROWID,"ID","NAME","VALUE_INT","CREATED_AT" FROM "TEST"."TP" PARTITION ("P10") WHERE ROWID >= 'AAAAAAAAAAAAAAAAAB'
执行端log
2025-08-28 15:46:39 cpt_dm8[LD01][INFO]: 装载开始
2025-08-28 15:46:39 EXE[INFO]: SQL语句执行成功 sql: -- drs ddl, siteid list[1]
CREATE TABLE "TEST"."TP"("ID" BIGINT NOT NULL,"NAME" VARCHAR2(200) NULL,"VALUE_INT" NUMBER(10,0) NULL,"CREATED_AT" DATE NULL) PARTITION BY RANGE("ID")(PARTITION "P1" VALUES LESS THAN(100001),PARTITION "P2" VALUES LESS THAN(200001),PARTITION "P3" VALUES LESS THAN(300001),PARTITION "P4" VALUES LESS THAN(400001),PARTITION "P5" VALUES LESS THAN(500001),PARTITION "P6" VALUES LESS THAN(600001),PARTITION "P7" VALUES LESS THAN(700001),PARTITION "P8" VALUES LESS THAN(800001),PARTITION "P9" VALUES LESS THAN(900001),PARTITION "P10" VALUES LESS THAN(1000001))
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1253], group: 7, row:
100000, expect row: 100000, speed: 7989 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1254], group: 8, row:
100000, expect row: 100000, speed: 7754 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1256], group: 10, row: 100000, expect row: 100000, speed: 7734 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1247], group: 1, row:
100000, expect row: 100000, speed: 7471 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1248], group: 2, row:
100000, expect row: 100000, speed: 7474 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1249], group: 3, row:
100000, expect row: 100000, speed: 7478 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1250], group: 4, row:
100000, expect row: 100000, speed: 7483 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1251], group: 5, row:
100000, expect row: 100000, speed: 7490 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1252], group: 6, row:
100000, expect row: 100000, speed: 7496 rps
2025-08-28 15:46:52 cpt_dm8[LD01][INFO]: 表分组完成装载 table: TEST.TP[1255], group: 9, row:
100000, expect row: 100000, speed: 7520 rps
2025-08-28 15:46:53 EXE[INFO]: SQL语句执行成功 sql: -- drs ddl, siteid list[1]
ALTER TABLE "TEST"."TP" ADD CONSTRAINT "CONS134219019X" NOT CLUSTER PRIMARY KEY("ID")
2025-08-28 15:46:53 cpt_dm8[LD01][INFO]: 表完成装载 table: TEST.TP[1246], row: 1000000, expect row: 1000000, speed: 69309 rps
2025-08-28 15:46:53 cpt_dm8[LD01][INFO]: 本次装载结束
服务无法启动 / 校验远程归档路径失败
检查 dmarch.ini
中远程归档路径是否与实际本地路径逐字一致。
检查权限与 ASM 挂载点是否可访问。
CPT 无法连接 EXEC(网络/端口问题)
mgr_port
(默认 5345)在防火墙/安全组中开放;确认两台主机互通。数据不同步或丢失
检查是否正确设置 alter cpt_dm8 set lsn
(错误的 LSN 会导致漏变更或重放)。
检查归档文件是否正常生成与上传。
检查 DMDRS 日志是否有解析错误或应用错误(关键字段类型不匹配、约束冲突等)。
DDL 无法同步
确认触发器与辅助表是否在所有需要的节点存在并有效。
检查 DRS_$DDL_LOG
表的权限是否允许 DMDRS 查询(如果 DMDRS 不是 SYSDBA)。
权限不足导致对象创建失败
create table
等权限问题,按需补授 CREATE TABLE
/ CREATE PROCEDURE
等权限。本文将原始搭建记录组织为一份可操作的部署/验证指南,涵盖了数据库参数配置、用户权限、归档日志、DMDRS 配置、启动顺序、验证方法与常见故障排查。通过参考文中步骤,可以快速建立从 DSC 到 DM8 的 DMDRS 数据同步/迁移链路。
文章
阅读量
获赞