注册
基于 Apple M2 (ARM64) 架构搭建 Oracle 到达梦数据守护集群的实时同步链路 —— DRS V5 部署全纪录
培训园地/ 文章详情 /

基于 Apple M2 (ARM64) 架构搭建 Oracle 到达梦数据守护集群的实时同步链路 —— DRS V5 部署全纪录

KAl 2026/01/23 1918 5 0

文章摘要 (Abstract)

随着国产化替代的深入,基于 ARM 架构(如鲲鹏、飞腾、Apple Silicon)的服务器与终端越来越普及。本文打破常规 x86 部署思维,在 MacBook M2 环境下,利用 Docker 部署 Oracle 23ai(ARM版),利用麒麟 V10 虚拟机部署达梦数据守护集群(DW),并通过达梦数据复制软件 (DRS) V5 实现跨架构、跨网络的异构数据库实时同步。本文详细记录了从环境构建、归档配置、网络打通到数据校验的全过程,并针对数据守护环境下 DRS 的目标端选择策略进行了深度解析。


一、 实验拓扑与环境架构

本次实验环境极为特殊,模拟了完全基于 ARM 指令集的异构迁移场景。

角色 组件/版本 部署位置 网络地址 (示例) 端口 说明
源端数据库 Oracle 23ai Free Mac M2 (Docker) 10.211.55.2 (宿主机) 1521 运行于 Docker 容器,需开启归档
中间件 DRS V5 (ARM64) 麒麟 V10 VM 10.211.55.11 8080 负责数据捕获与投递
目的端(主) DM8 (ARM64) 麒麟 V10 VM 10.211.55.11 5236 数据守护主机 (Primary),可读写
目的端(备) DM8 (ARM64) 麒麟 V10 VM 10.211.55.11 5237 数据守护备机 (Standby),只读

在本地虚拟化网络中(Parallels Desktop 共享网络模式),虚拟机访问宿主机(Mac)通常通过网关 IP(如 10.211.55.2),而非 localhost。这是网络连通的关键。


二、 源端 Oracle 的配置

在 M2 芯片上运行 Oracle 曾是难题,但利用 gvenzl/oracle-free 镜像可以完美解决。DRS 对源端 Oracle 有三大硬性要求:归档模式、补充日志、权限

1.查询数据库归档模式

image20260105155717612.png

2. 开启归档模式 (Archivelog)

很多初学者使用 system 用户尝试开启归档会报错 insufficient privileges。这是因为修改数据库运行模式涉及实例的启停,必须使用 SYSDBA 身份。

image20260105155735221.png

操作步骤:
进入 Docker 容器并以 SYSDBA 登录:

docker exec -it oracle_db sqlplus / as sysdba

执行关键指令(注意:需重启实例):

SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;

验证: 执行 archive log list;,确保 Database log mode 显示为 Archive Mode

参考官方 DRS 手册时,我们注意到手册建议手动指定 log_archive_dest。但在 Docker 容器化部署 Oracle 的场景下,不需要手动修改此参数。原因在于官方镜像通常默认配置了闪回恢复区 (Flash Recovery Area) 或默认归档路径。

image20260105161422694.png

3. 查看数据库最小附加日志及全列日志是否开启

SQL> select supplemental_log_data_min from v$database; SQL> select supplemental_log_data_all from v$database;

image20260105161400606.png

4. 开启补充日志 (Supplemental Logging)

DRS 的 CPT(捕获)模块依赖 Redo Log 解析数据。为了确保 UPDATE/DELETE 操作能精确定位到行,必须开启补充日志。

-- 开启最小补充日志 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 开启全列补充日志 (强烈建议,避免无主键表同步失败) ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

5. 开启 GoldenGate Replication

在配置 Oracle 11.2.0.4 及以上版本(特别是本次实验使用的 Oracle 23ai)作为源端时,除了常规的归档和补充日志,我们强烈建议开启 enable_goldengate_replication 参数。

ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE;

在 Oracle 19c/23c 等高版本中,为了保障数据复制的完整性(特别是处理 UPDATE 操作和 LOB 大字段时),开启此参数可以显著降低 DRS 捕获模块 (CPT) 出现“日志缺失”或“无法解析”错误的概率,保障异构同步链路稳定性”。

6. 创建测试用户

CREATE USER SRC_USER IDENTIFIED BY Oracle123; GRANT DBA TO SRC_USER; -- 测试环境给 DBA 权限方便调试

三、 目的端达梦集群的特殊考量

本次实验的目标端是一个基于 ARM64 的达梦主备数据守护集群 (Data Watch)。为了保障数据能够正确写入并同步,我们需要在**主库 (Primary) **上进行以下配置。

1. 开启逻辑复制支持 (推荐)

虽然作为目的端主要负责执行 SQL,但开启逻辑追加日志参数 RLOG_APPEND_LOGIC 是达梦数据同步的最佳实践。它能确保如果未来这台机器需要作为“级联同步”的源端时,链路是就绪的。

-- 检查参数状态 SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC'; -- 如果未开启(0),则修改为1(该参数为动态参数,即改即生效) SP_SET_PARA_VALUE(1, 'RLOG_APPEND_LOGIC', 1);

2. 创建专用表空间

在生产环境中,为了避免同步数据撑满系统表空间 (MAIN),强烈建议为同步用户创建独立的表空间。

-- 创建一个名为 TBS_DRS 的表空间,初始大小 128M,自动扩展 CREATE TABLESPACE TBS_DRS DATAFILE 'TBS_DRS_01.DBF' SIZE 128 AUTOEXTEND ON NEXT 128;

3. 创建同步用户并赋权

我们需要创建一个用户,DRS 将使用该用户的身份登录达梦数据库并执行 INSERT/UPDATE/DELET操作。

-- 创建用户,指定默认表空间 CREATE USER TGT_USER IDENTIFIED BY Dameng123 DEFAULT TABLESPACE TBS_DRS; -- 赋予权限 -- 1. 基础连接权限 GRANT RESOURCE TO TGT_USER; -- 2. 因为是实验/POC环境,直接授予 DBA 权限以避免表结构差异导致的权限报错 GRANT DBA TO TGT_USER;

4. DRS 目标端连接策略深度解析

这是集群环境下的配置核心。

  • 现象:集群包含主机 (5236) 和备机 (5237)。
  • 机制:达梦数据守护中,备机通常处于 OPEN (只读) 或 MOUNT 状态,拒绝任何写操作。
  • 配置策略:DRS 的 EXEC(执行)模块必须连接主机 (5236)
    • 数据流向:Oracle -> DRS -> DM 主机 (5236) -> (MAL内网传输) -> DM 备机 (5237)。
    • 验证方法:配置完成后,我们只需查询备机表数据,若有数据,即证明主备同步正常。

[技术辨析】目的端需要开启归档吗?
在参考部分技术文档时,我们发现有“开启目的端归档”的步骤。对此我们需要区分场景理解:

  1. 从 DRS 角度:DRS 的目的端模块 (EXEC) 仅负责执行 SQL,并不依赖归档日志,因此纯单机目标端可不开启。
  2. 从架构角度:本次实验的目标端是 达梦数据守护集群。主备同步的核心机制依赖于归档日志的实时传输。因此,在配置集群环境时,主库必然已开启归档模式 (ARCH_MODE='Y'),无需在 DRS 部署阶段重复配置。
  3. 从扩展性角度:若未来计划以该达梦库为源进行级联同步(如 A->B->C),则必须开启归档及逻辑追加日志 (RLOG_APPEND_LOGIC)。

四、 DRS V5 部署与链路配置

1. DRS 服务端安装要点

在麒麟 V10 ARM64 环境下安装 DRS V5,建议采用“全家桶”模式:即同时安装 Agent (代理)管理平台 (Web Console)

  • 网络策略:安装时代理 IP 建议绑定虚拟机实际局域网 IP(如 10.211.55.11),而非回环地址,以便 Mac 宿主机浏览器访问。
  • 防火墙设置:安装完成后若无法访问 8080 端口,需临时关闭防火墙验证:systemctl stop firewalld。

2. 源端配置:突破 Docker 网络隔离

在配置 Oracle 源端连接时,我们遇到了一个典型问题:DRS Agent 运行在虚拟机内,而 Oracle 运行在宿主机的 Docker 中。由于 DRS 界面默认只允许选择已安装 Agent 的主机 IP,导致无法直接通过 UI 选择宿主机 IP。
解决方案:利用“自定义 URL”功能

  1. 代理选择:在主机列表选择 Agent 所在的虚拟机 IP(作为执行主体)。
  2. 模式切换:开启“启用自定义 URL”开关。
  3. 连接串构造:手动输入 JDBC 连接串。此处需使用 Mac 宿主机在 Parallels Desktop 共享网络中的网关 IP (10.211.55.2) 以实现跨次元通讯。
jdbc:oracle:thin:@10.211.55.2:1521/FREEPDB1

image20260107000940652.png

实战技巧:此处服务名应填写 Oracle 23ai 容器默认的 FREEPDB1,而非传统的 ORCL。

3. 目的端配置:接入达梦数据守护集群

在配置目的端(Target)时,由于我们的架构是 达梦数据守护 (Data Watch) 主备集群,配置方式与单机有所不同。
关键配置参数:

  • 连接端口:务必填写 主库 (Primary) 端口 5236
    • 技术解析:数据守护集群中只有主库处于 OPEN 状态并允许写入。若错误连接至备库 (5237),同步任务将因 只读模式 报错而中断。
  • 节点配置 (Cluster Nodes)
    • 我们在界面下方的“节点配置”中,显式添加了集群内的所有成员节点:10.211.55.11:5236 (主) 和 10.211.55.11:5237 (备)。这使得 DRS 的驱动层能够获取集群完整拓扑,在发生主备切换时具备自动重连能力。

image20260106172057989.png

4. 构建复制链路与映射策略

数据源准备就绪后,我们进入“编辑同步工程”界面,采用 “一对一场景” 模板,构建从 Oracle 到 DM 的完整同步逻辑。

Step 1: 拓扑规划
系统自动生成了 node1 (源端服务) 和 node2 (目的端服务) 的互联拓扑。

  • 架构亮点:虽然两个服务均运行在同一台麒麟虚拟机上 (10.211.55.11),但我们通过端口隔离(源端 21521,目的端 25236)实现了进程级的解耦,避免了端口冲突。

image20260105212221958.png

Step 2: 核心难点——跨 PDB 的模式映射 (Schema Mapping)
在配置 通配符规则 时,由于 Oracle 源端采用了多租户架构 (CDB/PDB),直接使用 Schema.Table 格式会导致校验失败。

  • 问题现象:配置 SRC_USER.==TGT_USER. 报错“格式错误”。

  • 深度排查:DRS 在 Oracle 23ai 环境下,要求必须显式指定数据库/容器名称。尽管 GUI 有时显示为 CDB$ROOT,但实际业务数据位于 PDB 中。

  • 解决方案:采用三级命名结构,显式指定 PDB 名称 FREEPDB1。

    FREEPDB1.SRC_USER.*==TGT_USER.*
    • 含义:将源库 FREEPDB1 容器中 SRC_USER 用户下的所有表,映射并同步至目标达梦数据库的 TGT_USER 用户下。这一配置完美解决了异构数据库间的模式名(Schema Name)不一致问题。

Step 3: 部署准备
完成映射配置后,点击“确定”,系统进入部署就绪状态(如下图)。此时,DRS 管理平台已生成了完整的 XML 配置文件,点击上方的 “立即部署” 按钮,即可将配置下发至后端 Agent 并启动数据同步进程。

image20260105211918419.png

image20260105212729273.png


五、 进阶实战:突破 Docker 与虚拟化的文件隔离(核心难点)

在点击“启动”按钮之前,我们必须解决本次异构架构中最大的技术挑战:DRS 如何读取 Docker 容器内部的 Redo Log 文件?

DRS 的增量捕获模块 (CPT) 在高性能模式下,会尝试通过文件系统直接读取 Oracle 的 Redo 日志。然而,Oracle 运行在 Mac 宿主机的 Docker 容器中,向 DRS 报告的日志路径是 /opt/oracle/oradata/...(容器内路径)。运行在麒麟虚拟机中的 DRS 拿着这个路径去本地寻找,自然会报 DRS-5119 错误。

为了解决这个问题,我们采用 “存储映射 + 软链接欺骗” 的三级跳方案。

1. Mac 宿主机侧:正确的 Docker 卷挂载

避坑指南:
切勿在 Docker 容器运行时直接使用 docker cp 拷贝数据文件!Oracle 运行时的文件是不一致的,直接拷贝会导致新容器启动时报 ORA-00600 [kcratr_scan_lastbwr] 错误。

正确操作步骤(Cold Copy):

  1. 停止旧容器:docker stop oracle_db
  2. 拷贝数据:docker cp oracle_db:/opt/oracle/oradata/. /Users/chenkai/oracle_data/
  3. 启动新容器并挂载卷:
docker run -d --name oracle_db \ -p 1521:1521 \ -e ORACLE_PASSWORD=Oracle123 \ -v /Users/chenkai/oracle_data:/opt/oracle/oradata \ gvenzl/oracle-free

此时,Mac 本地的 /Users/chenkai/oracle_data 与容器内的数据实现了物理实时同步。

2. 虚拟机侧:建立路径欺骗

利用 Parallels Desktop 的共享文件夹功能,将 Mac 的 /Users/chenkai/oracle_data 挂载到麒麟虚拟机中。然后,通过 Linux 软链接(Symlink)“伪造”出 Oracle 报告的路径。

# 1. 确认 Parallels 共享挂载点(通常在 /media/psf/ 下) ls -l /media/psf/Home/oracle_data # 2. 创建 Oracle 预期的目录结构 mkdir -p /opt/oracle/oradata # 3. 建立软链接 (核心魔法步骤) # 让 DRS 以为它在访问 /opt/oracle/...,实际直接读到了 Mac 宿主机的文件 ln -s /media/psf/Home/oracle_data/FREE /opt/oracle/oradata/FREE

验证: 使用 DRS 运行用户 (dmdba) 检查文件权限。

ls -l /opt/oracle/oradata/FREE/redo01.log # 必须确保 dmdba 用户有读权限,否则需调整共享文件夹权限或以 root 运行 DRS

image20260106224215285.png


六、 启动同步与全链路验证 (The Moment of Truth)

经过前期的环境构建与网络穿透配置,我们将启动 DRS 任务,并验证数据在 Oracle (Docker/ARM) -> DRS -> 达梦主库 -> 达梦备库 这一条长异构链路上的实时流转。

1. 服务重启与状态确认

在经历了虚拟机重启或网络变更后,DRS 的 Agent 可能会出现状态假死。实战经验表明,最有效的恢复手段是直接重启 DRS 服务。
当 Web 控制台显示链路状态为蓝色(运行中),且日志中无报错时,说明 LogMiner 已经成功 Hook 住了 Oracle 的日志流。

image20260106234230508.png

2. 增量数据写入验证

我们在 Mac 宿主机的 Oracle 源端执行一条插入操作,模拟业务新增数据:

-- 源端:Oracle 23ai (Docker) INSERT INTO SRC_USER.T_TEST_DRS VALUES(1005, 'Real-time Sync on M2', SYSDATE); COMMIT;

3. 主备集群实时核验

在数据提交的瞬间(无需手动切换日志),我们在麒麟虚拟机的达梦集群中进行查询。

达梦主库 (Port 5236) 查询:
数据已落地,证明 DRS 解析与入库正常。

达梦备库 (Port 5237) 查询:

-- 目的端:DM8 备库 (Standby, 只读模式) SELECT * FROM TGT_USER.T_TEST_DRS;

image20260106234331172.png

验证结果:
如上图所示,ID 为 1005 的数据在 Oracle 提交后,几乎是 “瞬时” 出现在了达梦的主库和备库中。
这不仅证明了 DRS 的捕获效率,也验证了达梦数据守护集群(Data Watch)内部的主备日志传输机制(MAL)在 ARM 虚拟化环境下依然高效稳定。


七、 避坑指南与实战经验总结

本次部署跨越了 MacOS、Docker、Linux 虚拟机等多重环境,以下是本次实战沉淀的 避坑经验

  1. Docker 文件隔离的突破
    • 问题:DRS Agent 无法读取 Docker 容器内的 Redo Log。
    • 解法:采用 "Cold Copy (冷拷贝) + 挂载卷" 方式将 Oracle 数据暴露给宿主机,再通过 Parallels 共享文件夹 + Linux 软链接 (ln -s) 欺骗 DRS,使其能访问到物理日志文件。
  2. Oracle 多租户的权限陷阱
    • 问题:在 PDB 用户下无法切换日志,导致某些场景下同步延迟。
    • 解法:日志切换 (Switch Logfile) 是实例级操作,必须连接到 CDB$ROOT 容器执行。但在 DRS 配置正确(开启 use_logminer)且负载较低时,Oracle 的自动触发机制通常足以实现秒级同步,无需人工干预。
  3. 虚拟机重启后的“失联”
    • 问题:重启虚拟机后 DRS 报错连接超时。
      • 解法:重点检查两处——Linux 防火墙 (firewalld) 是否自动复活拦截了端口;
      • 宿主机共享文件夹 是否自动挂载成功(软链接是否失效)。

八、 总结与展望

随着 “信创”(信息技术应用创新)战略的全面铺开,基于 ARM 架构的国产服务器芯片(如华为鲲鹏 920、飞腾 S2500 等)已逐渐成为金融、能源、政务等核心领域的算力底座。

本文通过构建极端的 ARM64 纯虚拟化环境,成功验证了 Oracle 到 达梦数据守护集群 的实时同步链路。虽然实验平台采用的是开发级 ARM 终端,但其底层的指令集架构与国产鲲鹏、飞腾服务器完全同源。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服