从本地达梦迁移数据到 Docker Oracle

学习 DTS 工具时,不一定一上来就做复杂的双向迁移。对我来说,更适合先做一个小闭环:本地 Windows 上的达梦数据库作为源端,Docker 中的 Oracle 23c Free 作为目标端,通过 DTS 把一张测试表迁移过去,最后在 Oracle 里能查到数据。这样既能熟悉 DTS 的基本流程,也能顺手观察一下异构迁移里的类型转换。

来源: 《DM8 数据迁移工具 DTS》4 DTS 迁移、5 DTS 对比、附录二"DM->Oracle"类型映射关系。

一、实验目标

本次实验只做一条主线:

text 复制代码
Windows 本地达梦数据库 -> DTS 工具 -> Docker Oracle 23c Free

实验成功的判断标准也很直接:

  1. DTS 能同时连上本地 DM 和 Docker Oracle。
  2. DM 中的测试表能迁移到 Oracle。
  3. 在 Oracle 中可以查到迁移后的表和数据。
  4. 能大致看懂 DTS 在迁移过程中如何处理字段类型映射。

这篇文章重点不是深入 Oracle,而是感受 DTS 工具的迁移流程:连源端、连目标端、选对象、看映射、执行、验证。

二、实验环境

组件 环境 说明
源端数据库 Windows 本地 DM8 准备一张实验表和少量数据
目标端数据库 Docker Oracle 镜像使用 gvenzl/oracle-free:23-slim
迁移工具 DTS 图形化工具 使用 DM 安装目录下的 DTS
验证方式 Oracle SQL 查询 能查到表和数据即可

Oracle 对我来说不是重点,所以这里尽量少碰 Oracle 配置,只把它作为一个能连接、能建表、能查询的目标库。

三、确认 Oracle 容器并创建用户

本次实验中 Oracle 容器已经通过 Docker Desktop + WSL2 启动,不需要重新执行 docker run。这里重点是确认容器名称,并在运行中的容器里创建一个普通应用用户 DTS_ORA,后续 DTS 就使用这个用户连接 Oracle。

先在 PowerShell 或 WSL 终端中查看正在运行的容器:

bash 复制代码
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"

如果容器名称不是 oracle23free,下面命令中的容器名需要替换成实际名称。gvenzl/oracle-free 镜像提供了 createAppUser 命令,可以直接在运行中的容器里创建应用用户:

需要注意 PORTS 列。如果这里没有看到类似 0.0.0.0:1521->1521/tcp 的端口映射,说明 Oracle 容器没有把 1521 发布到 Windows 主机,后续 DTS 可能无法通过 127.0.0.1:1521 连接。实验容器没有重要数据时,建议重新创建容器并加上 -p 1521:1521

bash 复制代码
docker exec oracle23free createAppUser DTS_ORA YOUR_ORACLE_APP_PASSWORD FREEPDB1

其中:

  • DTS_ORA 是新建的 Oracle 普通用户。
  • YOUR_ORACLE_APP_PASSWORD 替换为实验密码,执行命令时不要保留尖括号。
  • FREEPDB1 是该镜像默认可用的 PDB 服务名。

创建完成后,可以测试登录:

bash 复制代码
docker exec -it oracle23free sqlplus DTS_ORA@//localhost:1521/FREEPDB1

执行后按提示输入密码。如果能进入 SQL 界面,说明 Oracle 目标用户已经准备好。

DTS 连接 Oracle 时使用下面的信息:

  • 主机名:127.0.0.1
  • 端口:1521
  • 服务名:FREEPDB1
  • 用户名:DTS_ORA
  • 密码:YOUR_ORACLE_APP_PASSWORD

如果连接不上,优先检查容器是否已经启动完成,以及端口 1521 是否已经映射到 Windows 主机。

四、在 DM 中准备源表

为了让 DTS 的类型转换有一点观察价值,源表里放几类常见字段:整数、字符串、金额、时间、长文本。

sql 复制代码
CREATE TABLE DTS_DM_ORDER (
  ORDER_ID      INT PRIMARY KEY,
  ORDER_NO      VARCHAR(50),
  CUSTOMER_NAME VARCHAR(50),
  ORDER_AMOUNT  DECIMAL(12,2),
  CREATE_TIME   TIMESTAMP,
  DESCRIPTION   CLOB
);

INSERT INTO DTS_DM_ORDER
VALUES (1, 'DM202605260001', '张三', 199.90, CURRENT_TIMESTAMP, '第一条 DM 到 Oracle 的 DTS 迁移测试数据');

INSERT INTO DTS_DM_ORDER
VALUES (2, 'DM202605260002', '李四', 299.50, CURRENT_TIMESTAMP, '用于验证中文、金额、时间和 CLOB 字段');

COMMIT;

这张表不复杂,但覆盖了实验需要观察的几个点:

  • INT 用来观察整数类型迁移。
  • VARCHAR 用来观察字符字段和中文内容。
  • DECIMAL(12,2) 用来观察金额精度。
  • TIMESTAMP 用来观察时间字段。
  • CLOB 用来观察长文本字段。

五、使用 DTS 迁移到 Oracle

打开 DTS 后,新建迁移工程,迁移方向选择从 DM 到 Oracle。整体流程可以理解为"配置连接 -> 选择对象 -> 确认映射 -> 执行迁移"。

1. 配置源端 DM

源端数据库选择 DM,填写本地达梦实例信息:

  • 主机:127.0.0.1
  • 端口:<DM_PORT>
  • 用户:<DM_USER>
  • 密码:<DM_PASSWORD>

连接成功后,DTS 会读取源端模式和对象列表。

2. 配置目标端 Oracle

目标端数据库选择 Oracle,填写 Docker Oracle 的连接信息:

  • 主机:127.0.0.1
  • 端口:1521
  • 服务名:FREEPDB1
  • 用户:DTS_ORA
  • 密码:YOUR_ORACLE_APP_PASSWORD

3. 选择迁移对象

对象选择时只选 DTS_DM_ORDER

在对象映射页面,重点看两处:

  • 目标表名是否仍然是 DTS_DM_ORDER
  • 字段类型是否按预期映射到了 Oracle 类型。

4. 观察类型转换

DTS 会根据源端和目标端数据库类型做默认映射。结合 DM->Oracle 的默认类型映射关系,本实验中比较直观的转换如下:

DM 源端类型 Oracle 目标端常见类型 观察点
INT NUMBER Oracle 没有完全相同的 INT 存储类型,通常转成 NUMBER
DECIMAL NUMBER 重点看精度和小数位是否保留
TIMESTAMP TIMESTAMP 重点看时间值是否正常
CLOB / TEXT / LONGVARCHAR CLOB 长文本一般迁移为 Oracle 的 CLOB
IMAGE / LONGVARBINARY BLOB 二进制大字段一般迁移为 BLOB

字符字段在迁移时重点关注长度和字符集。实验数据里有中文,所以迁移后要查一下 CUSTOMER_NAMEDESCRIPTION 是否正常显示。

5. 执行迁移

确认对象和字段映射后执行任务。DTS 执行页面需要重点看:

  • 是否成功创建目标表。
  • 是否成功插入数据。
  • 是否有字段类型转换警告。
  • 是否有主键、索引创建失败。
  • 迁移报告中成功对象数和失败对象数。

这一步是体验 DTS 工具最明显的地方:它不是单纯导出导入数据,而是把建表、数据插入、约束索引处理、日志报告组织成一个迁移任务。

六、在 Oracle 中查询验证

迁移完成后,可以直接进入容器,用 Oracle 自带的 sqlplus 查询目标表。

bash 复制代码
docker exec -it oracle23free sqlplus DTS_ORA@//localhost:1521/FREEPDB1

进入 SQL 界面后查询表是否存在:

sql 复制代码
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = 'DTS_DM_ORDER';

再查询迁移后的数据:

sql 复制代码
SELECT ORDER_ID, ORDER_NO, CUSTOMER_NAME, ORDER_AMOUNT
FROM DTS_DM_ORDER
ORDER BY ORDER_ID;

如果要验证长文本字段,可以查 CLOB 的长度:

sql 复制代码
SELECT ORDER_ID, DBMS_LOB.GETLENGTH(DESCRIPTION) AS DESC_LEN
FROM DTS_DM_ORDER
ORDER BY ORDER_ID;

此处出现张三变成了?3,但是sql建表语句正常,dm源端也是?3。

未解决问题。先改为李三,重新迁移完成实验。

看到表存在、行数正确、中文和金额正常,说明这次 DM 到 Oracle

的 DTS 小实验已经跑通。

七、这次实验对 DTS 的理解

通过这个实验,可以把 DTS 先理解成一个"迁移任务编排工具"。它把数据库迁移拆成了几个可视化步骤:先配置源端和目标端,再选择对象,再处理类型映射和对象映射,最后执行并生成日志。

第一次使用 DTS 时,我觉得最值得关注的是类型映射页面。因为异构迁移不是简单复制文件,DM 和 Oracle 的字段类型并不完全一致。例如 DM 的 INTDECIMAL 迁移到 Oracle 后通常会落到 NUMBER,长文本会落到 CLOB。如果只是看迁移成功,很容易忽略目标表结构是否符合预期。

这类小实验的好处是成本低,出错也容易定位。先用一张表跑通流程,再逐步增加视图、索引、序列、大字段和更多数据量,会比一开始迁移整套 schema 更稳。

八、常见问题

1. Oracle 容器还没启动完成

Oracle 容器第一次启动需要初始化数据库,不能看到容器 running 就马上连接。建议先看 docker logs -f oracle23free,等初始化完成后再用 DTS 测试连接。

2. DTS 连接 Oracle 失败

先检查端口映射是否是 1521:1521,再确认服务名填写 FREEPDB1。主机侧连接 Docker Oracle 时,主机一般写 127.0.0.1

3. 表迁移成功但字段类型和预期不一致

回到 DTS 的类型映射页面检查默认映射。简单实验可以接受默认值,正式迁移前要逐字段核对,尤其是金额、时间、大字段和字符长度。

4. Oracle 中查不到表

确认连接的是迁移目标用户 DTS_ORA,而不是 SYSTEM 或其他用户。Oracle 的表属于具体 schema,换用户查询时可能看不到。

5. DTS 报 ORA-01017

如果 DTS 测试连接时报 ORA-01017: invalid credential or not authorized; logon denied,说明主机、端口和服务名大概率已经连通,问题主要集中在用户名或密码。可以先用 SQL*Plus 验证同一组账号密码:

bash 复制代码
docker exec -it oracle23free sqlplus DTS_ORA@//localhost:1521/FREEPDB1

如果 SQL*Plus 能登录,而 DTS 不能登录,先重新输入 DTS 密码,注意不要带引号、不要多空格。必要时用 SYS 用户在 FREEPDB1 中重置 DTS_ORA 密码,并解除锁定:

sql 复制代码
ALTER USER DTS_ORA IDENTIFIED BY "YOUR_ORACLE_APP_PASSWORD" ACCOUNT UNLOCK;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE TO DTS_ORA;

重置后,DTS 中密码填写 YOUR_ORACLE_APP_PASSWORD,不要填写双引号。

九、实验小插曲:用户已存在和端口映射确认

实验过程中还有一个小插曲。第一次创建 Oracle 用户时,命令返回了 ORA-01920

bash 复制代码
docker exec oracle23free createAppUser DTS_ORA YOUR_ORACLE_APP_PASSWORD FREEPDB1

返回结果中出现:

text 复制代码
ERROR at line 1:
ORA-01920: user name 'DTS_ORA' conflicts with another user or role name

这个报错不是容器异常,而是说明 DTS_ORA 这个用户或角色名已经存在。因为启动容器时如果已经通过 APP_USER 创建过用户,再执行一次 createAppUser DTS_ORA ... 就会触发这个错误。

随后用当前容器名确认运行状态和端口映射:

bash 复制代码
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"

输出中可以看到:

text 复制代码
NAMES          IMAGE                        PORTS
oracle23free   gvenzl/oracle-free:23-slim   0.0.0.0:1521->1521/tcp, [::]:1521->1521/tcp

这说明当前容器名已经是 oracle23free,并且 1521 端口已经映射到 Windows 主机。再执行:

bash 复制代码
docker port oracle23free

可以看到:

text 复制代码
1521/tcp -> 0.0.0.0:1521
1521/tcp -> [::]:1521

最后通过 SQL*Plus 验证用户可用:

bash 复制代码
docker exec -it oracle23free sqlplus DTS_ORA@//localhost:1521/FREEPDB1

成功连接后,说明 DTS_ORA 用户已经存在且可登录,后续 DTS 可以直接使用 127.0.0.1:1521/FREEPDB1 连接 Oracle。这个过程也提醒我,Docker 实验中要先确认两个信息:当前容器名和端口映射,不要继续使用已经删除的旧容器名。

十、总结

本次实验从本地 DM 迁移一张测试表到 Docker Oracle,并通过 Oracle 查询验证迁移结果。整个过程不需要深入学习 Oracle,只要能启动容器、连上服务、查到目标表即可。

对 DTS 的学习重点可以放在三个地方:连接配置是否正确、对象选择是否准确、类型映射是否符合预期。先把这个小闭环跑通,再继续扩展到多表、约束、索引、视图和数据对比,学习路径会更清楚。

参考资料

相关推荐
网宿安全演武实验室2 分钟前
当AI跑进容器:全链路容器安全检测与智能运营实
人工智能·安全·容器·k8s
BlackHeart12034 小时前
【SQL】Oracle中序列(Sequence)作为默认值引发的ORA-00979
数据库·sql·oracle
一点事4 小时前
docker:安装oracle 19c
docker·oracle·容器
安当加密5 小时前
Kubernetes Secret不安全?External Secrets Operator接入凭据管理服务实战,自动轮转零停机
安全·容器·kubernetes
Drache_long6 小时前
CentOS7安装Oracle数据库
数据库·oracle
u0119608237 小时前
k8s-helm命令
linux·容器·kubernetes
qq_452396237 小时前
第四篇:《Docker 镜像:分层结构、拉取与推送》
运维·docker·容器
身如柳絮随风扬8 小时前
Docker 部署 Nginx:从入门到生产级配置实战
nginx·docker·容器
木雷坞8 小时前
dwz-server Docker 部署短链接服务:多域名、A/B 测试和统计配置
运维·docker·容器