随着国产化替代的深入,基于 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。这是网络连通的关键。
在 M2 芯片上运行 Oracle 曾是难题,但利用 gvenzl/oracle-free 镜像可以完美解决。DRS 对源端 Oracle 有三大硬性要求:归档模式、补充日志、权限。
很多初学者使用 system 用户尝试开启归档会报错 insufficient privileges。这是因为修改数据库运行模式涉及实例的启停,必须使用 SYSDBA 身份。
操作步骤:
进入 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) 或默认归档路径。
SQL> select supplemental_log_data_min from v$database;
SQL> select supplemental_log_data_all from v$database;
DRS 的 CPT(捕获)模块依赖 Redo Log 解析数据。为了确保 UPDATE/DELETE 操作能精确定位到行,必须开启补充日志。
-- 开启最小补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
-- 开启全列补充日志 (强烈建议,避免无主键表同步失败)
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
在配置 Oracle 11.2.0.4 及以上版本(特别是本次实验使用的 Oracle 23ai)作为源端时,除了常规的归档和补充日志,我们强烈建议开启 enable_goldengate_replication 参数。
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE;
在 Oracle 19c/23c 等高版本中,为了保障数据复制的完整性(特别是处理 UPDATE 操作和 LOB 大字段时),开启此参数可以显著降低 DRS 捕获模块 (CPT) 出现“日志缺失”或“无法解析”错误的概率,保障异构同步链路稳定性”。
CREATE USER SRC_USER IDENTIFIED BY Oracle123;
GRANT DBA TO SRC_USER; -- 测试环境给 DBA 权限方便调试
本次实验的目标端是一个基于 ARM64 的达梦主备数据守护集群 (Data Watch)。为了保障数据能够正确写入并同步,我们需要在**主库 (Primary) **上进行以下配置。
虽然作为目的端主要负责执行 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);
在生产环境中,为了避免同步数据撑满系统表空间 (MAIN),强烈建议为同步用户创建独立的表空间。
-- 创建一个名为 TBS_DRS 的表空间,初始大小 128M,自动扩展
CREATE TABLESPACE TBS_DRS DATAFILE 'TBS_DRS_01.DBF' SIZE 128 AUTOEXTEND ON NEXT 128;
我们需要创建一个用户,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;
这是集群环境下的配置核心。
[技术辨析】目的端需要开启归档吗?
在参考部分技术文档时,我们发现有“开启目的端归档”的步骤。对此我们需要区分场景理解:
- 从 DRS 角度:DRS 的目的端模块 (EXEC) 仅负责执行 SQL,并不依赖归档日志,因此纯单机目标端可不开启。
- 从架构角度:本次实验的目标端是 达梦数据守护集群。主备同步的核心机制依赖于归档日志的实时传输。因此,在配置集群环境时,主库必然已开启归档模式 (ARCH_MODE='Y'),无需在 DRS 部署阶段重复配置。
- 从扩展性角度:若未来计划以该达梦库为源进行级联同步(如 A->B->C),则必须开启归档及逻辑追加日志 (RLOG_APPEND_LOGIC)。
在麒麟 V10 ARM64 环境下安装 DRS V5,建议采用“全家桶”模式:即同时安装 Agent (代理) 和 管理平台 (Web Console)。
在配置 Oracle 源端连接时,我们遇到了一个典型问题:DRS Agent 运行在虚拟机内,而 Oracle 运行在宿主机的 Docker 中。由于 DRS 界面默认只允许选择已安装 Agent 的主机 IP,导致无法直接通过 UI 选择宿主机 IP。
解决方案:利用“自定义 URL”功能
jdbc:oracle:thin:@10.211.55.2:1521/FREEPDB1
实战技巧:此处服务名应填写 Oracle 23ai 容器默认的 FREEPDB1,而非传统的 ORCL。
在配置目的端(Target)时,由于我们的架构是 达梦数据守护 (Data Watch) 主备集群,配置方式与单机有所不同。
关键配置参数:
数据源准备就绪后,我们进入“编辑同步工程”界面,采用 “一对一场景” 模板,构建从 Oracle 到 DM 的完整同步逻辑。
Step 1: 拓扑规划
系统自动生成了 node1 (源端服务) 和 node2 (目的端服务) 的互联拓扑。
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.*
Step 3: 部署准备
完成映射配置后,点击“确定”,系统进入部署就绪状态(如下图)。此时,DRS 管理平台已生成了完整的 XML 配置文件,点击上方的 “立即部署” 按钮,即可将配置下发至后端 Agent 并启动数据同步进程。
在点击“启动”按钮之前,我们必须解决本次异构架构中最大的技术挑战:DRS 如何读取 Docker 容器内部的 Redo Log 文件?
DRS 的增量捕获模块 (CPT) 在高性能模式下,会尝试通过文件系统直接读取 Oracle 的 Redo 日志。然而,Oracle 运行在 Mac 宿主机的 Docker 容器中,向 DRS 报告的日志路径是 /opt/oracle/oradata/...(容器内路径)。运行在麒麟虚拟机中的 DRS 拿着这个路径去本地寻找,自然会报 DRS-5119 错误。
为了解决这个问题,我们采用 “存储映射 + 软链接欺骗” 的三级跳方案。
避坑指南:
切勿在 Docker 容器运行时直接使用 docker cp 拷贝数据文件!Oracle 运行时的文件是不一致的,直接拷贝会导致新容器启动时报 ORA-00600 [kcratr_scan_lastbwr] 错误。
正确操作步骤(Cold Copy):
docker stop oracle_dbdocker cp oracle_db:/opt/oracle/oradata/. /Users/chenkai/oracle_data/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 与容器内的数据实现了物理实时同步。
利用 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
经过前期的环境构建与网络穿透配置,我们将启动 DRS 任务,并验证数据在 Oracle (Docker/ARM) -> DRS -> 达梦主库 -> 达梦备库 这一条长异构链路上的实时流转。
在经历了虚拟机重启或网络变更后,DRS 的 Agent 可能会出现状态假死。实战经验表明,最有效的恢复手段是直接重启 DRS 服务。
当 Web 控制台显示链路状态为蓝色(运行中),且日志中无报错时,说明 LogMiner 已经成功 Hook 住了 Oracle 的日志流。
我们在 Mac 宿主机的 Oracle 源端执行一条插入操作,模拟业务新增数据:
-- 源端:Oracle 23ai (Docker)
INSERT INTO SRC_USER.T_TEST_DRS VALUES(1005, 'Real-time Sync on M2', SYSDATE);
COMMIT;
在数据提交的瞬间(无需手动切换日志),我们在麒麟虚拟机的达梦集群中进行查询。
达梦主库 (Port 5236) 查询:
数据已落地,证明 DRS 解析与入库正常。
达梦备库 (Port 5237) 查询:
-- 目的端:DM8 备库 (Standby, 只读模式)
SELECT * FROM TGT_USER.T_TEST_DRS;
验证结果:
如上图所示,ID 为 1005 的数据在 Oracle 提交后,几乎是 “瞬时” 出现在了达梦的主库和备库中。
这不仅证明了 DRS 的捕获效率,也验证了达梦数据守护集群(Data Watch)内部的主备日志传输机制(MAL)在 ARM 虚拟化环境下依然高效稳定。
本次部署跨越了 MacOS、Docker、Linux 虚拟机等多重环境,以下是本次实战沉淀的 避坑经验:
随着 “信创”(信息技术应用创新)战略的全面铺开,基于 ARM 架构的国产服务器芯片(如华为鲲鹏 920、飞腾 S2500 等)已逐渐成为金融、能源、政务等核心领域的算力底座。
本文通过构建极端的 ARM64 纯虚拟化环境,成功验证了 Oracle 到 达梦数据守护集群 的实时同步链路。虽然实验平台采用的是开发级 ARM 终端,但其底层的指令集架构与国产鲲鹏、飞腾服务器完全同源。
文章
阅读量
获赞
