注册
DMDRS-ORACLE同步到达梦
技术分享/ 文章详情 /

DMDRS-ORACLE同步到达梦

lysrwhjy 2024/07/26 1664 3 0

源数据库为Oracle和目标数据库为DM

设置ORACLE环境变量

在.bash_profile配置文件末尾增加OCI驱动路径。
export LD_LIBRARY_PATH=<OCI驱动路径>:$LD_LIBRARY_PATH(根据自己的ORACLEE路径更改)

image.png

ORACLE开启逻辑附加日志及全列日志

查看数据库最小附加日志及全列日志是否开启。若数据库已经开启最小附加日志及全列日志,则跳过步骤
SQL> alter database add supplemental log data;
SQL> alter database add supplemental log data (ALL) columns;
SQL> select supplemental_log_data_min from v$database;
SUPPLEME

YES
SQL> select supplemental_log_data_all from v$database;
SUP

YES
SQL>
image.png

关闭源数据库回收站

SQL> alter system set recyclebin=off deferred;

System altered.

SQL>
image.png

配置DMDRS

配置目标DMDRS服务

[dmdba@node178 service_template]$ cp TemplateService /data/yuyu/drs/bin/DrsService
[dmdba@node178 service_template]$ cd …
[dmdba@node178 bin]$ vi DrsService
INSTALL_HOME=/data/yuyu/drs
#REPLACE program dir
PROG_DIR=/data/yuyu/drs/bin
#REPLACE program config path
CONF_PATH=/data/yuyu/drs/bin/exec.xml
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=_REPLACE_SELF_NEED_LIB_PATH
#REPLACE program name, drsvr/dssvr/dvsvr
EXEC_PROG_NAME=drsvr
#REPLACE service type, drs server/dss server/dvs server
SERVICE_TYPE_NAME=“drs server”
image.png

目的端配置文件

[dmdba@localhost bin2]$ cat exec.xml
<?xml version=“1.0” encoding=“GB18030”?>
<drs>
<base>
<mgr_port>5345</mgr_port>
<siteid>2</siteid>
</base>
<exec>
<name>exec_dm8</name>
<login>
<dbtype>dm8</dbtype>
<server>10.15.1.16</server>
<user>DMDRS</user>
<pwd>DMDRS123456</pwd>
<port>8009</port>
</login>
<group>
<item>
<id>35</id>
<exec_policy>0</exec_policy>
<desc>
<table>.</table>
</desc>
</item>
</group>
</exec>
</drs>
image.png

配置源DMDRS服务

配置源端服务脚本

[oracle@node178 bin]$ cp TemplateService /home/dmdba/yuyu/drs/bin/DrsService
[oracle@node178 bin]$ vi DrsService
#REPLACE INSTALL_HOME path
INSTALL_HOME=/home/dmdba/yuyu/drs
#REPLACE program dir
PROG_DIR=/home/dmdba/yuyu/drs/bin
#REPLACE program config path
CONF_PATH=/home/dmdba/yuyu/drs/bin/cpt.xml
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=_REPLACE_SELF_NEED_LIB_PATH

#REPLACE program name, drsvr/dssvr/dvsvr
EXEC_PROG_NAME=drsvr
#REPLACE service type, drs server/dss server/dvs server
SERVICE_TYPE_NAME=“drs server”
image.png
源DMDRS服务的配置文件目录,打开并修改cpt.xml配置文件,修改后配置文件如下所示。
[oracle@node178 bin]$ cat cpt.xml
<?xml version=“1.0” encoding=“GB18030”?>
<drs>
<base>
<mgr_port>5345</mgr_port>
<siteid>1</siteid>
</base>
<cpt>
<name>cpt_oracle</name>
<ddl_mask>OBJ:OP</ddl_mask>
<login>
<dbtype>Oracle</dbtype>
<server>orcl</server>
<user>DMDRS</user>
<pwd>DMDRS123456</pwd>
</login>
<send>
<ip>10.15.1.178</ip>
<port>5345</port>
<target_name>exec_oracle</target_name>
<map>
<item>TEST1*.==TEST1.</item>
</map>
</send>
</cpt>
</drs>
image.png

DMDRS用户授予权限


GRANT CONNECT TO DMDRS;
– ## 装载权限
– 需要非同步用户下待装载表/序列上的查询权限
GRANT SELECT ON <待装载表/序列的模式名>.<待装载表/序列的表名>TO DMDRS;
– 需要系统表、系统字典和动态视图的查询权限
GRANT SELECT ON SYS.OBJ$ TO DMDRS;
GRANT SELECT ON SYS.TAB$ TO DMDRS;
GRANT SELECT ON SYS.USER$ TO DMDRS;
GRANT SELECT ON SYS.NTAB$ TO DMDRS;
GRANT SELECT ON SYS.SEG$ TO DMDRS;
GRANT SELECT ON SYS.EXTERNAL_TAB$ TO DMDRS;
GRANT SELECT ON DBA_CONS_COLUMNS TO DMDRS;
GRANT SELECT ON DBA_CONSTRAINTS TO DMDRS;
GRANT SELECT ON SYS.COLTYPE$ TO DMDRS;
GRANT SELECT ON SYS.TYPE$ TO DMDRS;
GRANT SELECT ON SYS.ATTRIBUTE$ TO DMDRS;
GRANT SELECT ON SYS.COLLECTION$ TO DMDRS;
GRANT SELECT ON SYS.PARTOBJ$ TO DMDRS;
GRANT SELECT ON SYS.COM$ TO DMDRS;
GRANT SELECT ON V_DATABASETODMDRS;GRANTSELECTONSYS.CONDATABASE TO DMDRS; GRANT SELECT ON SYS.CON TO DMDRS;
GRANT SELECT ON SYS.IND$ TO DMDRS;
GRANT SELECT ON SYS.COL$ TO DMDRS;
GRANT SELECT ON SYS.CCOL$ TO DMDRS;
GRANT SELECT ON SYS.TS$ TO DMDRS;
GRANT SELECT ON SYS.DEFERRED_STG$ TO DMDRS;
GRANT SELECT ON SYS.SUBPARTCOL$ TO DMDRS;
GRANT SELECT ON SYS.SEQ$ TO DMDRS;
GRANT SELECT ON DBA_INDEXES TO DMDRS;
GRANT SELECT ON DBA_IND_COLUMNS TO DMDRS;
GRANT SELECT ON SYS.PARTCOL$ TO DMDRS;
GRANT SELECT ON SYS.DEFSUBPART$ TO DMDRS;
GRANT SELECT ON SYS.SOURCE$ TO DMDRS;
GRANT SELECT ON SYS.TYPED_VIEW$ TO DMDRS;
GRANT SELECT ON SYS.VIEW$ TO DMDRS;
GRANT SELECT ON SYS.SYN$ TO DMDRS;
GRANT SELECT ON “SYS”."ALL_SYNONYMS_TREE" TO DMDRS;
GRANT SELECT ON DBA_EXTENTS TO DMDRS;
GRANT SELECT ON SYS.SNAP$ TO DMDRS;
GRANT SELECT ON V
PARAMETERTODMDRS;GRANTSELECTONSYS.TRIGGERPARAMETER TO DMDRS; GRANT SELECT ON SYS.TRIGGER TO DMDRS;
GRANT SELECT ON SYS.V_THREAD TO DMDRS; GRANT SELECT ON V_DATABASE_INCARNATION TO DMDRS;
GRANT SELECT ON V_TRANSACTION to DMDRS; GRANT SELECT ON V_LOCKED_OBJECT to DMDRS;
GRANT SELECT ON DBA_PART_INDEXES to DMDRS;
– Oracle 12c及以上版本且带有容器的数据库需要容器视图的查询权限
GRANT SELECT ON V_CONTAINERS TO DMDRS; -- 需要锁表权限 GRANT LOCK ANY TABLE TO DMDRS; -- 装载使用FLASHBACK掩码,需要闪回权限 GRANT FLASHBACK ANY TABLE to DMDRS; -- ## 同步权限 -- 需要获取系统SCN权限 GRANT EXECUTE ON DBMS_FLASHBACK TO DMDRS; -- 需要系统表、系统字典和动态视图的查询权限 GRANT SELECT ON SYS.COL TO DMDRS;
GRANT SELECT ON SYS.LOB$ TO DMDRS;
GRANT SELECT ON SYS.TABPART$ TO DMDRS;
GRANT SELECT ON SYS.TABCOMPART$ TO DMDRS;
GRANT SELECT ON SYS.LOBFRAG$ TO DMDRS;
GRANT SELECT ON V_LOGFILE TO DMDRS; GRANT SELECT ON V_LOG TO DMDRS;
GRANT SELECT ON V_ARCHIVEDLOGTODMDRS;GRANTSELECTONSYS.CDEFARCHIVED_LOG TO DMDRS; GRANT SELECT ON SYS.CDEF TO DMDRS;
GRANT SELECT ON SYS.TABSUBPART$ TO DMDRS;
GRANT SELECT ON SYS.CCOL$ TO DMDRS;
GRANT SELECT ON SYS.TS$ TO DMDRS;
GRANT SELECT ON SYS.TYPE$ TO DMDRS;
GRANT SELECT ON SYS.ATTRIBUTE$ TO DMDRS;
GRANT SELECT ON SYS.COLLECTION$ TO DMDRS;
GRANT SELECT ON V_SESSION TO DMDRS; GRANT SELECT ON V_SESSTAT TO DMDRS;
GRANT SELECT ON V_STATNAME TO DMDRS; -- 源DMDRS主备需要数据库实例的查询权限 GRANT SELECT ON V_INSTANCE TO DMDRS;
GRANT SELECT ON GV_INSTANCE TO DMDRS; -- 若需要同步XMLTYPE类型的数据,需要将XDB模式下XDBTTSET、表名开头为XNM和XQN的表的查询权限赋予用户。若使用可插拔数据库,管理员用户需先切换到可插拔数据库再授权
GRANT SELECT ON XDB.XDBTTSET TO DMDRS; GRANT SELECT ON XDB.<以XNM开头的表名> TO DMDRS;
GRANT SELECT ON XDB.<以X$QN开头的表名> TO DMDRS;

源端执行脚本ddl_sql_ora.sql

SQL> create USER DMDRS identified by DMDRS123456;
User created.
SQL> @/home/dmdba/yuyu/oradrs/bin/scripts/ddl_sql_ora.sql
Table created.
Trigger created.
System altered.
image.png

运行DMDRS服务

启动目标端服务

[dmdba@localhost bin2]$ ./drsvr exec.xml
MGR[INFO]: DRS start up, current version: V5.0.4-Build(2024.02.05-151491_trunc)_D64 (The beta)(Enterprise Edition)
MGR[WARN]: License 即将过期 expire on 2024-05-05
MGR[INFO]: DEBUG版本
MGR[INFO]: 模块被加载 module: exec_oracle
MGR[INFO]: 正在初始化缓存模块 path: ./exec_oracle/CACHE_exec_oracle, cache size: 512 MB
MGR[INFO]: SITEID: 2 NAME: localhost.localdomain MEMCHECK: 0 PORT: 5345 GROUP: 0 VERSION: 1 PATH: exec.xml
MGR[INFO]: 模块正在启动 module: exec_oracle
MGR[INFO]: 模块已经处于运行状态 module: exec_oracle
image.png

启动源端服务

[oracle@node178 bin]$ ./drsvr cpt.xml
MGR[INFO]: DRS start up, current version: V5.0.4-Build(2024.02.05-151491_trunc)_64 (The beta)(Enterprise Edition)
MGR[WARN]: License 即将过期 expire on 2024-05-05
MGR[INFO]: 模块被加载 module: cpt_oracle
MGR[INFO]: 正在初始化缓存模块 path: ./cpt_oracle/CACHE_cpt_oracle, buffers size: 256(MB)
MGR[INFO]: SITEID: 1 NAME: node178 MEMCHECK: 0 PORT: 5345 GROUP: 0 VERSION: 1 PATH: cpt.xml
CMD>cpt_oracle[INFO]: CPT: dbtype: ORACLE11g, server: orcl, user: DMDRS, port: 51521
MGR[INFO]: 获取到装载掩码组合 mask: |CREATE|NOLOCK
MGR[INFO]: CPT模块装载命令执行成功 cpt name: cpt_oracle
image.png
注释:注意配置文件中得名字 <name>cpt_oracle</name>
注意源端与目标端要匹配。

源端装载数据

[oracle@node178 bin]$ ./drcsl cpt.xml
CSL[INFO]: CONSOLE TOOL DRS5: V5.0.4-Build(2024.02.05-151491_trunc)_64
CSL[WARN]: License 即将过期 expire on 2024-05-05
CSL> connect
CSL[INFO]: [INPUT CMD: connect]
CSL> cp cpt_oracle “sch.name=‘TEST1’” CREATE|OBJ
CSL[INFO]: [INPUT CMD: cp cpt_oracle “sch.name=‘TEST1’” CREATE|OBJ]
MGR[INFO]: 获取到装载掩码组合 mask: |CREATE|NOLOCK
MGR[INFO]: CPT模块装载命令执行成功 cpt name: cpt_oracle
命令执行成功
CSL> cp cpt_oracle “sch.name=‘TEST1’” CREATE|OBJ
CSL[INFO]: [INPUT CMD: cp cpt_oracle “sch.name=‘TEST1’” CREATE|OBJ]
MGR[INFO]: 获取到装载掩码组合 mask: |CREATE|NOLOCK
MGR[INFO]: CPT模块装载命令执行成功 cpt name: cpt_oracle
命令执行成功
CSL> start
CSL[INFO]: [INPUT CMD: start]
MGR[INFO]: 模块正在启动 module: cpt_oracle
MGR[INFO]: 得到起始SCN start scn: 20210184
MGR[INFO]: 模块已经处于运行状态 module: cpt_oracle
命令执行成功
CSL> alter cpt_oracle add table “sch.name=‘TEST1’”
CSL[INFO]: [INPUT CMD: alter cpt_oracle add table “sch.name=‘TEST1’”]
MGR[INFO]: 获取到装载掩码组合 mask: |CREATE|INSERT|INDEX|TABLE|CHECK|GROUP
命令执行成功
CSL>
image.png

启动源端CPT模块

CSL> start
CSL[INFO]: [INPUT CMD: start]
MGR[INFO]: 模块正在启动 module: cpt_oracle
MGR[INFO]: 得到起始SCN start scn: 20210184
MGR[INFO]: 模块已经处于运行状态 module: cpt_oracle
命令执行成功
image.png
image.png

验证同步:源端创建表、视图、存储过程、函数、触发器

CREATE TABLE test1111 (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
age NUMBER,
email VARCHAR2(100)
);
INSERT INTO test1111 (id, name, age, email) VALUES (1, ‘Alice’, 30, ‘alice@example.com’);
NSERT INTO test1111 (id, name, age, email) VALUES (2, ‘Bob’, 25, ‘bob@example.com’);
INSERT INTO test1111 (id, name, age, email) VALUES (3, ‘Charlie’, 35, ‘charlie@example.com’);
commit;
SQL> select * from test1111;
目标端日志
image.png
达梦端查询
image.png
SQL> create view TEST1.v_emp1 as select * from v$version;
View created.
SQL>
image.png
目的端查询
image.png

常见问题:

TEST1目标端需要得权限:(同步前需要给同步用户创建数据对象权限,如果权限不给足,在装载过程中会报错权限问题)
grant “PUBLIC”,“SOI” to “TEST1”;
grant CREATE VIEW,CREATE PROCEDURE,CREATE SEQUENCE,CREATE TRIGGER,CREATE INDEX,CREATE CONTEXT INDEX,CREATE REPLICATE,CREATE PACKAGE,CREATE SYNONYM,CREATE PUBLIC SYNONYM,CREATE SESSION to “TEST1”;
grant EXECUTE on “TEST1”."DRS_DDL_SQL_PROC" to "TEST1"; grant create MATERIALIZED VIEW TO TEST1; 否则报错如下: EXE[ERROR]: DRS-9010 直接执行SQL语句失败 sql: -- drs ddl, siteid list[1] call "TEST1".DRS_DDL_SQL_PROC(?), DB-5518 没有创建函数权限
EXE[ERROR]: DRS-6171 DDL语句执行失败 siteid: 1-1, lsn: 4, trxid: 2, err: DB-5518 没有创建函数权限, sql: – drs ddl, siteid list[1]
call “TEST1”.DRS_$DDL_SQL_PROC(?)
create or replace function fun_hello1 return varchar2 is
begin
return ‘浣犲ソ!’;
end;
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服