注册
DMDSC 到 DM8 的 DMDRS 同步/迁移实战
培训园地/ 文章详情 /

DMDSC 到 DM8 的 DMDRS 同步/迁移实战

LyC_Dd 2025/09/02 178 0 0

DMDSC 到 DM8 的 DMDRS 同步/迁移实战

目标:通过 DMDRS(源端 CPT -> 目标端 EXEC)将源数据库(DSC)TEST.TT 表的全量与增量数据分别同步和迁移到目标数据库(DM8)相同模式下的表 TEST.TT

本文基于搭建记录整理、补充了步骤说明、配置说明、要点提示与常见故障排查,便于复制到生产或测试环境。


核心步骤

  1. 检查端口和目录规划,确认不会冲突。
  2. 在 DSC 与 DM8 上创建最小权限的同步用户 DMDRS
  3. 为 DSC 开启归档、逻辑日志与必要参数(如 ARCH_INI, RLOG_APPEND_LOGIC, DSC_TRX_VIEW_SYNC)。
  4. 在 DSC 上部署并配置 cpt_dsc.xml(源端),在 DM8 上部署并配置 exec.xml(目标端)。
  5. 启动目标 DMDRS 服务(EXEC),再启动源 DMDRS 服务(CPT)。
  6. 使用控制台 drcsl 设置起始 LSN,添加需要同步的表并进行初次全量装载。
  7. 验证数据同步并观察日志,进行必要的故障排查。

规划

业务规划

数据同步场景中已部署两个数据库,包括源数据库DSC(192.168.126.101/102)和目标数据库DM8(192.168.56.101),现需通过搭建DMDRS,将源数据库TEST模式下表TT的全量数据和增量数据同步到目标数据库TEST模式下的表TT中。

DSC_DM8图片.png

  • 源DMDRS:捕获源数据库的数据,将捕获到的数据发送到目标DMDRS。

  • 目标DMDRS:将接收的数据同步到目标数据库。

dmdsc端口号占用汇总表

环境中很多组件会占用端口(CSS、ASM、DB、MAL 等),部署 DMDRS 前必须保证 mgr_portld_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,并赋予同步所需权限。建议源数据库DMDRS用户不赋予DBA权限,赋予同步所需的最小权限即可;建议目标数据库DMDRS用户赋予DBA权限,如果不能赋予DBA权限,为确保同步的正确性,需赋予DMDRS用户同步所需的最小权限。

create user "DMDRS" identified by "[PASSWORD]";

DM8源数据库同步用户最小权限脚本示例

-- ## 基础权限 -- 插入、删除、更新数据时,需要数据操作权限 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;

DM8目标数据库同步用户最小权限脚本示例

-- ## 基础权限 -- 插入、删除、更新数据时,需要数据操作权限 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 归档配置方法

一般建议 DMDSC 集群中的节点,除了配置本地归档之外,再双向配置集群中所有其他节点的远程归档。查询 v$dm_arch_iniv$arch_status 等动态视图可以获取归档配置以及归档状态等相关信息。

dm.ini 中编辑:

#configuration file ARCH_INI = 1 #redo log RLOG_APPEND_LOGIC = 1

ARCH_INI 含义:

  • 1:有主键则只记录主键列;无主键则记录所有列。

  • 2:总是记录所有列。

  • 3:记录更新列与 ROWID,删除只记录 ROWID。

20250818161905imagepng

20250818162004imagepng

在与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_INIRLOG_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

20250818164832imagepng

如果存在以上查询结果,表示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

20250818164741imagepng

如果存在以上查询结果,表示RLOG_APPEND_LOGIC参数配置已生效。

开启源数据库的DSC_TRX_VIEW_SYNC参数(DSC特有参数)

如果源数据库是 DSC,建议将 DSC_TRX_VIEW_SYNC 设置为 1 并在所有节点一致,避免节点启动失败。

#dm.ini DSC_TRX_VIEW_SYNC = 1

20250818165309imagepng

重启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

20250818170740imagepng

如果存在以上查询结果,表示DSC_TRX_VIEW_SYNC参数配置已生效。

配置源数据库的DMDCR_ASM_TRACE_LEVEL参数(DSC可选)

为提升从ASM读日志的性能,建议将DSC数据库所有节点的配置文件“dmdcr.ini”中DMDCR_ASM_TRACE_LEVEL参数配置为3。

20250818165617imagepng

DMDCR_ASM_TRACE_LEVEL参数用来指定日志级别,日志级别越低(参数值越小),输出的日志越详细。当设置日志级别为较低级别时,兼容输出级别大的日志,如WARN级别也可输出ERROR级别的日志。

  • 1:TRACE级别。默认值为1。

  • 2:INFO级别

  • 3:WARN级别

  • 4:ERROR级别

  • 5:FATAL级别

配置DDL同步

使用触发器方式配置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

20250818172112imagepng

设置DMDRS运行用户

  • 设置源DMDRS服务的运行用户对服务所在目录及子目录的读、写和执行权限,并设置运行用户同数据库归档文件所在目录属同一用户组,此用户组应对归档文件所在目录及子目录有读权限。

  • 设置目标DMDRS服务的运行用户对服务所在目录及子目录的读、写和执行权限。

这里新建用户dmdrs隶属于dmdba组,而dmdba组为数据库管理员用户dmdba所属。

useradd -g dmdba -m -d /home/dmdrs -s /bin/bash dmdrs passwd dmdrs

20250819102722imagepng

设置环境变量添加驱动文件路径(root下执行)

在源DMDRS服务器和目标DMDRS的服务器的环境变量中添加DMDPI驱动文件路径。

  1. 打开.bash_profile配置文件。
vi ~/.bash_profile
  1. 在.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 #记得改为自己的路径
  1. 保存并退出vi编辑器,使环境变量生效。
source ~/.bash_profile
  1. 查看环境变量是否设置成功。
echo $LD_LIBRARY_PATH

解决linux下vim中文乱码 (修改vimrc的内容)

全局的情况下:即所有用户都能用这个配置

vim /etc/vimrc #root

在文件中添加:

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8

配置目标DMDRS服务

模板在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服务

在源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>

启动

启动目标端DMDRS服务

  1. 将服务脚本模板TemplateService拷贝到服务脚本目录并修改服务脚本的名称为DrsService。
cp TemplateService ../DrsService #服务名可以自定义
  1. 打开并修改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"
  1. 启动目标端DMDRS服务。
./DrsService start

启动源端DMDRS服务

  1. 将服务脚本模板TemplateService拷贝到服务脚本目录并修改服务脚本的名称为DrsService。
cp TemplateService ../DrsService
  1. 打开并修改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" #因为有空格,需要双引号括起来
  1. 启动源端DMDRS服务。
./DrsService start

同步

启动源DMDRS端服务中的CPT模块

使用服务脚本启动服务后,需要使用远程控制台对服务中的模块执行启动命令。

cd /home/dmdba/dmdrs #切换至执行目录
  1. 启动控制台。
./drcsl cpt_dsc.xml

20250825161738imagepng

💡 提示

此处提示mem_size参数配置过大,可以在xml配置文件中添加&lt;mem_size>参数解决,因本次测试环境内存有限,故不作演示。

  1. 连接源DMDRS服务。
connect

20250825161928imagepng

  1. 设置数据库当前最新的日志LSN作为日志解析的起始位置。
alter cpt_dm8 set lsn

20250825161944imagepng

  1. 启动源DMDRS服务中的CPT模块。
start

20250825161955imagepng

  1. 将源数据库中TEST模式下的表TT添加同步,并在同步之前把源端表的全量数据装载到目标数据库。
alter cpt_dm8 add table "sch.name='TEST' and tab.name='TT'" 

20250825162006imagepng

同步验证

在源数据库表TEST.TT中插入数据,如果插入的数据能正确地同步到目标数据库,则表示数据同步成功。

20250825152811imagepng


迁移

数据以及权限准备

在源端分别建立普通表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生成数据

20250828151859imagepng

客户端内可查看数据是否写入

20250828152533imagepng

修改源端使得有select权限

20250828153534imagepng

在源DMDRS服务中执行数据迁移命令

启动台。

./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 数据同步/迁移链路。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服