注册
dmdrs 装载使用 rowid 方式
专栏/技术分享/ 文章详情 /

dmdrs 装载使用 rowid 方式

Gyyyyy 2026/10/23 69 0 0
摘要

dmdrs 装载使用 rowid 方式

目的:当源表没有主键和唯一索引时,建议开启该参数(ROWID_ASSIST)以提高程序性能。


1. Oracle 端开启归档和附加日志

1.1 开启归档模式

SQL> archive log list; Database log mode No Archive Mode Automatic archival Disabled Archive destination /oracle/app/oracle/product/19.0.0/db/dbs/arch Oldest online log sequence 1 Current log sequence 1 SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount; ORACLE instance started. Total System Global Area 3791649440 bytes Fixed Size 8903328 bytes Variable Size 805306368 bytes Database Buffers 2969567232 bytes Redo Buffers 7872512 bytes Database mounted. SQL> alter database archivelog; Database altered. SQL> alter system set log_archive_dest='+ARCH'; System altered. SQL> shutdown immediate; SQL> startup mount; ORACLE instance started. Total System Global Area 3791649440 bytes Fixed Size 8903328 bytes Variable Size 805306368 bytes Database Buffers 2969567232 bytes Redo Buffers 7872512 bytes Database mounted. SQL> alter database open; Database altered. SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination +ARCH --已开启 Oldest online log sequence 1 Next log sequence to archive 1 Current log sequence 1

1.2 开启附加日志

SQL> select supplemental_log_data_min from v$database; SUPPLEME -------- NO SQL> select supplemental_log_data_all from v$database; SUP --- NO SQL> alter database add supplemental log data; Database altered. SQL> alter database add supplemental log data (ALL) columns; Database altered. SQL> alter system set enable_goldengate_replication = TRUE; --12c版本以上开启 System altered.

2. 创建数据库同步用户 DMDRS

SQL> create user dmdrs identified by Dameng123; User created. SQL> grant dba to dmdrs; Grant succeeded. SQL> grant connect,resource to dmdrs; Grant succeeded. SQL> grant select any dictionary to dmdrs; Grant succeeded.

这些权限都需要

基础权限(启动时需要在目标数据库中创建辅助表和辅助存储过程)

GRANT RESOURCE TO DMDRS; GRANT CONNECT TO DMDRS; -- 在连接数据库时需要创建会话 GRANT SELECT ON V_$INSTANCE TO DMDRS; -- 启动时需要查询数据库的相关参数信息 GRANT SELECT ON V_$PARAMETER TO DMDRS; GRANT SELECT ON GV_$SESSION TO DMDRS; GRANT SELECT ON GV_$LOCK TO DMDRS; GRANT SELECT ON DBA_TAB_PARTITIONS TO DMDRS;

装载与同步相关权限(需要如下系统表、系统字典及动态视图的查询权限)

GRANT SELECT ON SYS.OBJ$ TO DMDRS; GRANT SELECT ON SYS.USER$ TO DMDRS; GRANT SELECT ON SYS.COL$ TO DMDRS; GRANT SELECT ON SYS.COLTYPE$ TO DMDRS; GRANT SELECT ON SYS.CCOL$ TO DMDRS; GRANT SELECT ON SYS.CDEF$ TO DMDRS; GRANT SELECT ON SYS.ATTRCOL$ TO DMDRS; GRANT SELECT ON DBA_IND_COLUMNS TO DMDRS; GRANT SELECT ON DBA_INDEXES TO DMDRS; GRANT SELECT ON SYS.IND$ TO DMDRS; GRANT SELECT ON SYS.SEQ$ TO DMDRS; GRANT SELECT ON DBA_TAB_SUBPARTITIONS TO DMDRS; GRANT SELECT ON DBA_CONSTRAINTS TO DMDRS; GRANT SELECT ON V_$DATABASE TO DMDRS; GRANT SELECT ON SYS.PARTOBJ$ TO DMDRS; -- 目标DMDRS主备需要数据库实例的查询权限 GRANT SELECT ON GV_$INSTANCE 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 ALTER ANY SEQUENCE TO DMDRS;

非同步用户模式下对象的 DDL 权限

GRANT CREATE ANY <对象类型> TO DMDRS; GRANT ALTER ANY <对象类型> TO DMDRS; GRANT DROP ANY <对象类型> TO DMDRS;

自定义类型对象的查询权限

GRANT SELECT ON SYS.TYPE$ TO DMDRS; GRANT SELECT ON SYS.ATTRIBUTE$ TO DMDRS; GRANT SELECT ON SYS.COLLECTION$ TO DMDRS;

表空间配额(同步用户创建时未指定表空间且未配额时)

ALTER USER DMDRS QUOTA UNLIMITED ON USERS;

3. 执行 DDL 脚本

SQL> @/oracle/dmdrs/release/scripts/ddl_sql_ora.sql

4. Oracle 端环境配置

groupadd dinstall useradd dmdrs -g dinstall passwd dmdrs su - dmdrs vi .bash_profile

编辑 .bash_profile:

export LD_LIBRARY_PATH=<OCI驱动路径>:$LD_LIBRARY_PATH export ORACLE_SID=oratest1 export ORACLE_BASE=/oracle/app/oracle export ORACLE_HOME=/oracle/app/oracle/product/19.0.0/db export ORA_GRID_HOME=/oracle/app/19.0.0/grid export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME/lib32 export SHLIB_PATH=$ORACLE_HOME/lib32:$SHLIB_PATH export LANG=en_US.UTF8 PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$ORA_GRID_HOME/bin:$PATH source .bash_profile

5. 配置服务

cd /oracle/dmdrs/bin/service_template cp TemplateService ../DrsService vi DrsService

DrsService 关键配置:

INSTALL_HOME=/oracle/dmdrs/ PROG_DIR=/oracle/dmdrs/release CONF_PATH=/oracle/dmdrs/release/cpt.xml NEED_LIB_PATH=/oracle/dmdrs/release EXEC_PROG_NAME=drsvr SERVICE_TYPE_NAME="drs server"

6. 配置源端 Oracle cpt 配置文件

cpt.xml:

<?xml version="1.0" encoding="GB18030"?> <drs> <base> <mgr_port>5345</mgr_port> <siteid>1</siteid> </base> <cpt> <name>cpt_ora19</name> <login> <dbtype>Oracle</dbtype> <server>xx.xx.xx.xx:1521/oratest1</server> <user>dmdrs</user> <pwd>Dameng123</pwd> </login> <calc_md5_col_num>0</calc_md5_col_num> <send> <ip>xx.xx.xx.xx</ip> <port>5345</port> <target_name>exec_dm8</target_name> <map> <item>DRS_TEST.*==DRS_TEST.*</item> </map> </send> </cpt> </drs>

7. 配置目标端 DM exec 配置文件

<?xml version="1.0" encoding="GB18030"?> <drs> <base> <mgr_port>5345</mgr_port> <siteid>2</siteid> <lang>en</lang> </base> <exec> <name>exec_dm8</name> <login> <dbtype>dm8</dbtype> <server>xx.xx.xx.xx</server> <user>DMDRS</user> <pwd>Dmdrs_123456</pwd> <port>5536</port> </login> <group> <item> <id>35</id> <exec_policy>0</exec_policy> <exec_mask>AFFECT_ROW|CHECK_COL|CHECK_KEY|UPDATE_DEPLICATE|CHECK_INDEX|COMMIT_NOWAIT|ROWID_ASSIST</exec_mask> <desc> <table>TEST_USR.*</table> <table>DRS_TEST.*</table> </desc> </item> </group> </exec> </drs>

关键点:exec_mask 中需包含 ROWID_ASSIST,即 9 中所述 rowid_assist 参数,于目标端 exec 配置。


8. 启动源端和目标端的 drs 服务

[dmdrs@orawjh1 release]$ ./DrsService start Starting DrsService: [ OK ]

9. rowid_assist 参数说明

目标端 exec 配置该参数(exec_mask 中加入 ROWID_ASSIST)。


10. Oracle 源端 drs 进行装载测试

[dmdrs@orawjh1 release]$ ./DrsService restart Stopping DrsService: [ OK ] Starting DrsService: [ OK ] [dmdrs@orawjh1 release]$ ./drcsl cpt.xml CSL[INFO]: CONSOLE TOOL DRS5: V5.2.5.4-Build(2026.06.02-221722_trunc_sp18)_64 CSL[WARN]: mem_size参数配置过大,超过系统剩余内存大小 mem_size: 16G, total_free_size: 6G CSL[WARN]: 无key状态下DRS性能受限制 parse_thr: 1 CSL> alter cpt_ora19 add table "sch.name='DRS_TEST'" drop CSL[INFO]: [INPUT CMD: alter cpt_ora19 add table "sch.name='DRS_TEST'" drop] MGR[INFO]: 获取到装载掩码组合 mask: |DROP|TABLE MGR[WARN]: 检测到TRUNCATE/DROP/CLEAR掩码,会对执行端目标表进行相应操作,再进行装载!请确认是否继续?(Y/N) y MGR[WARN]: 检测到无装载数据掩码,执行该命令后续再装载相应数据可能导致装载重复数据!请确认是否继续?(Y/N) y 命令执行成功 CSL> alter cpt_ora19 add table "sch.name='DRS_TEST'" create|rowid CSL[INFO]: [INPUT CMD: alter cpt_ora19 add table "sch.name='DRS_TEST'" create|rowid] MGR[INFO]: 获取到装载掩码组合 mask: |CREATE|ROWID|TABLE MGR[WARN]: 检测到无装载数据掩码,执行该命令后续再装载相应数据可能导致装载重复数据!请确认是否继续?(Y/N) y 命令执行成功

11. 目标端 exec 查看 ddl log 是否有隐式 rowid

cd /dmdata/dmdrs5/bin/log tail -100f ddl_202609.log

装载表的 DDL 显示有 #ROWID,说明参数生效:

2026-09-23 19:23:05 DDL: LSN:32 TRXID:7 SQL:-- drs ddl, siteid list[1] CREATE TABLE "DRS_TEST"."T2_DRS"("CODE" VARCHAR2(20) NULL,"TITLE" VARCHAR2(100) NULL,"STATUS" NUMBER(1,0) NULL,"UPDATE_TIME" DATETIME(0) NULL,"EXTRA" VARCHAR2(500) NULL,"#ROWID" VARCHAR2(32) NULL NOT VISIBLE) 2026-09-23 19:23:05 DDL: LSN:39 TRXID:10 SQL:-- drs ddl, siteid list[1] CREATE TABLE "DRS_TEST"."T3_DRS"("SERIAL_NO" NUMBER(12,0) NULL,"VAL" VARCHAR2(100) NULL,"FLAG" NUMBER(2,0) NULL,"C_TIME" DATETIME(0) NULL,"#ROWID" VARCHAR2(32) NULL NOT VISIBLE) 2026-09-23 19:23:05 DDL: LSN:44 TRXID:9 SQL:-- drs ddl, siteid list[1] CREATE TABLE "DRS_TEST"."T1_DRS"("ID" NUMBER(10,0) NULL,"NAME" VARCHAR2(50) NULL,"AMOUNT" NUMBER(12,2) NULL,"QTY" NUMBER NULL,"CREATE_TIME" DATETIME(0) NULL,"REMARK" VARCHAR2(200) NULL,"#ROWID" VARCHAR2(32) NULL NOT VISIBLE) 2026-09-23 19:23:06 DDL: LSN:51 TRXID:13 SQL:-- drs ddl, siteid list[1] ALTER TABLE "DRS_TEST"."T3_DRS" ADD CONSTRAINT "UNIQ_73636_RID" UNIQUE("#ROWID") 2026-09-23 19:23:06 DDL: LSN:54 TRXID:14 SQL:-- drs ddl, siteid list[1] ALTER TABLE "DRS_TEST"."T1_DRS" ADD CONSTRAINT "UNIQ_73634_RID" UNIQUE("#ROWID") 2026-09-23 19:23:06 DDL: LSN:57 TRXID:17 SQL:-- drs ddl, siteid list[1] ALTER TABLE "DRS_TEST"."T2_DRS" ADD CONSTRAINT "UNIQ_73635_RID" UNIQUE("#ROWID")

验证结论:建表时自动附加 "#ROWID" VARCHAR2(32) NULL NOT VISIBLE 隐式列,并为其自动创建唯一约束 UNIQ_*_RID,ROWID_ASSIST 参数生效,源表无主键/唯一索引时装载性能得到提升。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服