目的:当源表没有主键和唯一索引时,建议开启该参数(
ROWID_ASSIST)以提高程序性能。
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
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.
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;
SQL> @/oracle/dmdrs/release/scripts/ddl_sql_ora.sql
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
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"
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>
<?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 配置。
[dmdrs@orawjh1 release]$ ./DrsService start Starting DrsService: [ OK ]
目标端 exec 配置该参数(exec_mask 中加入 ROWID_ASSIST)。
[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
命令执行成功
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参数生效,源表无主键/唯一索引时装载性能得到提升。
文章
阅读量
获赞
