学习 DTS 工具时,不一定一上来就做复杂的双向迁移。对我来说,更适合先做一个小闭环:本地 Windows 上的达梦数据库作为源端,Docker 中的 Oracle 23c Free 作为目标端,通过 DTS 把一张测试表迁移过去,最后在 Oracle 里能查到数据。这样既能熟悉 DTS 的基本流程,也能顺手观察一下异构迁移里的类型转换。
来源: 《DM8 数据迁移工具 DTS》4 DTS 迁移、5 DTS 对比、附录二"DM->Oracle"类型映射关系。
一、实验目标
本次实验只做一条主线:
text
Windows 本地达梦数据库 -> DTS 工具 -> Docker Oracle 23c Free
实验成功的判断标准也很直接:
- DTS 能同时连上本地 DM 和 Docker Oracle。
- DM 中的测试表能迁移到 Oracle。
- 在 Oracle 中可以查到迁移后的表和数据。
- 能大致看懂 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_NAME 和 DESCRIPTION 是否正常显示。

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 的 INT、DECIMAL 迁移到 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 的学习重点可以放在三个地方:连接配置是否正确、对象选择是否准确、类型映射是否符合预期。先把这个小闭环跑通,再继续扩展到多表、约束、索引、视图和数据对比,学习路径会更清楚。
参考资料
- 《DM8 数据迁移工具 DTS》:4 DTS 迁移、5 DTS 对比、附录二 DM->Oracle 类型映射关系。
- gvenzl/oracle-free Docker Hub:https://hub.docker.com/r/gvenzl/oracle-free