本文档主要介绍基于达梦数据复制软件(DMDRS)实现 Oracle 19c 数据库到 DM8 数据库的数据同步部署过程。
通过部署 DMDRS,实现 Oracle 数据库作为源端,DM8 数据库作为目标端,将 Oracle 数据库中的业务数据实时同步至 DM8 数据库,实现异构数据库之间的数据迁移及实时同步。
本文档适用于以下场景:
| 项目 | 配置 |
|---|---|
| 操作系统 | CentOS Linux 7 x86_64 |
| CPU | x86_64 |
| 内存 | 4GB |
| 磁盘 | 40GB |
| 源数据库 | Oracle Database 19c(LINUX.X64_193000_db_home.zip) |
| 目标数据库 | DM8 V8(dm8_20260710_x86_CentOS7_64.zip) |
| 数据复制软件 | DMDRS V5(dmdrs_rev229171_x86_rh6_64_20260804.bin) |
| 同步方向 | Oracle → DM8 |
| 同步模式 | 单向实时同步 |
两个节点的虚拟机配置都如 2.1 所示。
| 节点 | IP 地址 | 主机角色 | 部署软件 |
|---|---|---|---|
| 节点1 | 192.168.218.148 | Oracle 源端 | Oracle 19c、DMDRS 源端 |
| 节点2 | 192.168.218.149 | DM 目标端 | DM8、DMDRS 目标端 |
| 目录类型 | 目录 |
|---|---|
| Oracle 安装目录 | /home/oracle/Oracle/19.3.0/DbHome |
| DMDRS 安装目录 | /opt/DmDrs |
| DMDRS 执行目录 | /opt/DmDrs/bin |
| 源端配置文件 | /opt/DmDrs/bin/Src.xml |
| 服务脚本 | /opt/DmDrs/bin/DrsService |
| 控制工具 | /opt/DmDrs/bin/drcsl |
| 目录类型 | 目录 |
|---|---|
| DM8 安装目录 | /dmdata/data |
| DMDRS 安装目录 | /opt/DmDrs |
| DMDRS 执行目录 | /opt/DmDrs/bin |
| 目标端配置文件 | /opt/DmDrs/bin/Dest.xml |
| 服务脚本 | /opt/DmDrs/bin/DrsService |
| 控制工具 | /opt/DmDrs/bin/drcsl |
两个节点之间需要保证以下端口可通信:
| 服务 | 端口 | 节点 |
|---|---|---|
| DMDRS 管理端口 | 5345 | 两端 |
| DM8 数据库端口 | 5234 | 节点2 |
| Oracle 监听端口 | 1521 | 节点1 |
| DMDRS Web 端口 | 8080 | 两端 |
测试:
# 节点1
ping 192.168.218.149
# 节点2
ping 192.168.218.148
所有节点执行:
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
所有节点执行:
vi /etc/sysconfig/selinux
修改为:
SELINUX=disabled
验证:
getenforce
安装完成后,验证:
sqlplus / as sysdba
参照《01-dm8安装部署手册 - 黄雨晨》的步骤。
安装完成后,验证:
./disql SYSDBA/Dmdba123@localhost:5234
两节点均安装:dmdrs_rev229171_x86_rh6_64_20260804.bin
1)两节点都上传:
dmdrs_rev229171_x86_rh6_64_20260804.bin
2)权限:
Oracle 端:
chown oracle:oinstall dmdrs_rev229171_x86_rh6_64_20260804.bin chmod 755 dmdrs_rev229171_x86_rh6_64_20260804.bin
DM8 端:
chown dmdba:dinstall dmdrs_rev229171_x86_rh6_64_20260804.bin chmod 755 dmdrs_rev229171_x86_rh6_64_20260804.bin
3)创建安装目录:
Oracle 端:
mkdir -p /opt/DmDrs chown oracle:oinstall /opt/DmDrs/ chmod 755 /opt/DmDrs/
DM8 端:
mkdir -p /opt/DmDrs chown dmdba:dinstall /opt/DmDrs/ chmod 755 /opt/DmDrs/
1)执行:
./dmdrs_rev229171_x86_rh6_64_20260804.bin -i
Oracle 端和 DM8 端分别执行。
2)运行脚本:
/opt/DmDrs/scripts/root/root_installer.sh
3)查看服务进程:
Oracle 端:
ps -ef|grep oracle
# 登录 Oracle
sqlplus / as sysdba
SQL> select * from v$nls_parameters where PARAMETER in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
NLS_CHARACTERSET 表示字符集;NLS_NCHAR_CHARACTERSET 表示国家字符集;建议达梦库的字符集和 Oracle 数据库保持一致。
-- 关库
SQL> shutdown immediate;
-- 启动到 mount 状态
SQL> startup mount;
-- 开启归档
SQL> alter database archivelog;
-- 快速恢复区设置
SQL> alter system set db_recovery_file_dest='';
-- 归档路径设置
SQL> alter system set log_archive_dest='/home/oracle/Oracle/Arch';
-- 开库
SQL> alter database open;
-- 验证归档是否打开
SQL> archive log list;
-- 最小附加日志和全列日志设置
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
-- 验证参数是否开启
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_ALL FROM V$DATABASE;
当数据库数据包含中文字符时,需将 DMHS 运作所在窗口的 NLS_LANG 设置为对应的字符集,建议使用 AMERICAN_AMERICA.ZHS16GBK。
添加到 /home/oracle/.bash_profile 文件结尾:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
环境变量生效与验证:
. /home/oracle/.bash_profile
echo $NLS_LANG
sqlplus / as sysdba
建议给 DBA 权限,最小权限在打开执行模块的时候,会提示报错权限不足。
CREATE USER DMDRS IDENTIFIED BY qwer1234S;
GRANT DBA TO DMDRS;
GRANT CONNECT TO DMDRS;
装载相关权限(需要非同步用户下待装载表/序列的查询权限):
GRANT SELECT ANY TABLE TO DMDRS;
GRANT SELECT ANY SEQUENCE 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_$DATABASE 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 SYS.SUM$ TO DMDRS;
GRANT SELECT ON V_$PARAMETER 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 GV_$TRANSACTION TO DMDRS;
GRANT SELECT ON GV_$LOCKED_OBJECT TO DMDRS;
GRANT SELECT ON DBA_PART_INDEXES TO DMDRS;
GRANT SELECT ON SYS.LOBCOMPPART$ TO DMDRS;
GRANT SELECT ON SYS.PARTLOB$ TO DMDRS;
GRANT SELECT ON SYS.ECOL$ TO DMDRS;
GRANT SELECT ON SYS.ATTRCOL$ TO DMDRS;
GRANT SELECT ON SYS.ICOL$ TO DMDRS;
Oracle 12c 及以上版本且带有容器的数据库需要容器视图的查询权限:
GRANT SELECT ON V_$CONTAINERS TO DMDRS;
Oracle DG 且源 DMDRS 部署在 DG 环境的备数据库:
GRANT SELECT ON V_$MANAGED_STANDBY TO DMDRS;
GRANT SELECT ON V_$DATAGUARD_CONFIG 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_$ARCHIVED_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;
Oracle DG 且源 DMDRS 部署在 DG 环境的备数据库:
GRANT SELECT ON V_$STANDBY_LOG TO DMDRS;
源 DMDRS 主备需要数据库实例的查询权限:
GRANT SELECT ON V_$INSTANCE TO DMDRS;
GRANT SELECT ON GV_$INSTANCE TO DMDRS;
其他必要权限:
grant all on drs_$ddl_sql to DMDRS;
grant select any table to DMDRS;
grant select any dictionary to DMDRS;
grant create session to DMDRS;
grant lock any table to DMDRS;
grant execute on dbms_flashback to DMDRS;
grant flashback any table to DMDRS;
vi /home/oracle/Oracle/19.3.0/DbHome/network/admin/tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.218.148)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
验证配置:
tnsping orcl
sqlplus / as sysdba
SQL> SELECT value FROM v$parameter WHERE name='service_names';
cat /home/oracle/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
export TMP=/tmp
export LANG=en_US
export TMPDIR=$TMP
export ORACLE_UNQNAME=orcl
export ORACLE_SID=orcl
export ORACLE_BASE=/home/oracle/Oracle
export ORACLE_HOME=$ORACLE_BASE/19.3.0/DbHome
export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"
export PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/bin:$ORACLE_HOME/bin
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/oracle/Oracle/19.3.0/DbHome/lib:/usr/local/lib
SQL> alter system set enable_goldengate_replication = TRUE;
vi /opt/DmDrs/bin/Src.xml
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5345</mgr_port> <!-- DMDRS管理端口,源和目标要保持一致 -->
<siteid>1</siteid> <!-- 站点ID,源和目标需不同(源1,目标2) -->
<lang>ch-utf8</lang> <!-- 语言,保持默认 -->
</base>
<cpt>
<name>cpt_oracle</name> <!-- CPT模块名称,自定义,但要和后续控制台命令一致 -->
<login>
<dbtype>Oracle</dbtype> <!-- 源数据库类型 -->
<server>orcl</server> <!-- 这里填你 tnsnames.ora 里配置的服务名 -->
<user>DMDRS</user> <!-- 前面创建的同步用户 -->
<pwd>qwer1234S</pwd> <!-- 同步用户密码 -->
</login>
<send>
<ip>192.168.218.149</ip> <!-- 目标端DM的IP地址,改成你的DM节点IP -->
<port>5345</port> <!-- 目标端DMDRS的管理端口,要和Dest.xml的mgr_port一致 -->
<target_name>exec_dm8</target_name> <!-- 目标端EXEC模块名称,要和Dest.xml中exec的name一致 -->
<map>
<item>SUN.*==SUN.*</item> <!-- 同步映射规则:源模式.表==目标模式.表 -->
</map>
</send>
</cpt>
</drs>
cp service_template/TemplateService DrsService vi DrsService
修改参数如下:
#REPLACE INSTALL_HOME path
INSTALL_HOME=/opt/DmDrs
#REPLACE program dir
PROG_DIR=/opt/DmDrs/bin
#REPLACE program config path
CONF_PATH=/opt/DmDrs/bin/Src.xml
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=/home/oracle/Oracle/19.3.0/DbHome/lib
#REPLACE program name, drsvr/dssvr/dvsvr
EXEC_PROG_NAME=drsvr
#REPLACE service type, drs server/dss server/dvs server
SERVICE_TYPE_NAME="drs server"
SQL> CREATE USER DMDRS IDENTIFIED BY qwer1234S;
SQL> GRANT DBA TO DMDRS;
vi /opt/DmDrs/bin/Dest.xml
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5345</mgr_port> <!-- 和源端Src.xml的mgr_port一致,都是5345 -->
<siteid>2</siteid> <!-- 站点ID,目标端必须和源端不同,源用1,目标用2 -->
<lang>ch-utf8</lang> <!-- 保持默认 -->
</base>
<exec>
<name>exec_dm8</name> <!-- EXEC模块名称,必须和Src.xml中send的target_name完全一致 -->
<login>
<dbtype>DM8</dbtype> <!-- 目标数据库类型,达梦填DM8 -->
<server>192.168.218.149</server> <!-- 改成你DM节点的实际IP -->
<user>DMDRS</user> <!-- 前面在DM库创建的同步用户 -->
<pwd>qwer1234S</pwd> <!-- 同步用户密码 -->
<port>5234</port> <!-- DM数据库监听端口,如果不是默认5234,改这里 -->
</login>
</exec>
</drs>
cp service_template/TemplateService DrsService
修改参数如下:
#REPLACE INSTALL_HOME path
INSTALL_HOME=/opt/DmDrs
#REPLACE program dir
PROG_DIR=/opt/DmDrs/bin
#REPLACE program config path
CONF_PATH=/opt/DmDrs/bin/Dest.xml
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=/opt/Dm8/bin
#REPLACE program name, drsvr/dssvr/dvsvr
EXEC_PROG_NAME=drsvr
#REPLACE service type, drs server/dss server/dvs server
SERVICE_TYPE_NAME="drs server"
cd /home/dmdba/dmdbms/bin/
./DrsService start
./DrsService start
./drcsl Dest.xml
# 连接目标 DMDRS 服务
CSL> connect
# 启动执行模块
CSL> start
./drcsl Src.xml
# 连接源 DMDRS 服务
CSL> connect
# 源端执行全量装载
CSL> ALTER cpt_oracle CP "sch.name='SUN'"
重新开个终端:
sqlplus / as sysdba
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
接着回到第一个终端:
CSL> ALTER cpt_oracle SET LSN scn=2216359 CSL> start cpt_oracle
1)在 Oracle 源库创建测试表并插入初始数据:
# 先关闭 cpt
CSL> stop cpt_oracle
sqlplus / as sysdba
-- 如果 SUN 模式不存在,需先创建(用有权限的用户,如 sys)
CREATE USER SUN IDENTIFIED BY sun123;
GRANT CONNECT, RESOURCE TO SUN;
-- 授予配额
ALTER USER SUN QUOTA UNLIMITED ON USERS;
-- 然后用 SUN 用户登录创建表
CREATE TABLE SUN.LZL (A INT);
INSERT INTO SUN.LZL VALUES (1);
INSERT INTO SUN.LZL VALUES (2);
INSERT INTO SUN.LZL VALUES (3);
COMMIT;
此时 Oracle 中 SUN.LZL 有 3 条记录,这就是我们的"历史数据"。
2)DM 端查询:
确保 DM 中存在 SUN 模式(如果不存在,需先创建):
CREATE USER SUN IDENTIFIED BY Sun12345;
然后用 SUN 用户登录查询:
SELECT * FROM SUN.LZL;
3)开启 Oracle 端的 cpt 服务:
CSL> start cpt_oracle
4)DM 端查询:
SELECT * FROM SUN.LZL;
1)在 Oracle 源库插入数据:
INSERT INTO SUN.LZL VALUES (4);
INSERT INTO SUN.LZL VALUES (5);
COMMIT;
2)在 DM 端查询:
SELECT * FROM SUN.LZL;
确认新增数据已同步到 DM 数据库,即表示增量同步配置成功。
文章
阅读量
获赞
