本文参考
https://eco.dameng.com/docs/zh-cn/start/tool-dm-migrate.html
https://eco.dameng.com/docs/zh-cn/faq/faq-oracle-dm8-migrate.html
https://eco.dameng.com/docs/zh-cn/faq/faq-import-export.html
概要
DTS是达梦的数据迁移工具,可实现以下几类迁移
源端 | 目标端 |
---|---|
DM数据库 | 其他数据库(Oracle、SQLServer、MySQL) |
DM数据库 | DM数据库 |
DM数据库 | 文件(SQL、TXT、EXCEL等) |
其他数据库(Oracle、SQLServer、MySQL) | DM数据库 |
文件(SQL、TXT、EXCEL等) | DM数据库 |
DTS的数据迁移对象可分为两类
- 数据库(例如:DM、Oracle、MySQL等)
- 文件(例如:SQL、XML、TXT等)
DTS可迁移上述两种对象之间的数据,具体能迁移哪些数据呢?
本文将尝试以下三类迁移
- DM => SQL文本
- DM => DM
- Oracle => DM
迁移时注意要点:
- 连接数据库的驱动要配置好
- 数据库的端口要开放,避免被防火墙拦截
示例库BOOKSHOP的创建
https://eco.dameng.com/docs/zh-cn/pm/example-description.html#
DM ⇒ SQL文本
使用DTS工具,将某张表导出为SQL文本
./dts
输入数据库的IP和端口,以及正确的用户名和密码
注意:
使用dts工具访问数据库,需要配置正确的驱动,此处用默认的驱动。(若默认驱动不可用,则需要解决驱动的问题,以便dts工具能访问源端数据库)
dm的tool目录里,有专门存放jdbc驱动的目录,里面存放了dts工具连接各种数据库所需的驱动(如dts工具连接dm数据库,需要DmJdbcDriver.jar;连接oracle数据库,需要oraclejdbc.jar)
我机器上的jdbc驱动如下:(这些都是安装DM数据库软件后,自带的)
如果默认驱动用不了的话,需根据数据库类型,准备合适的jdbc驱动,并使用自定义的驱动(即自行指定jdbc的路径及配置)
准备可用的驱动(以便dts工具连接数据库),url处填写好源端数据库的IP和端口
注意:
此处需要将DM的表导出成SQL文件,故dts需要与DM8交互。若自带的驱动(DmJdbcDriver.jar)不好使,则需下载可用的驱动
若选择错误的驱动,点击下一步时将报错(此处故意选择连接DM6的驱动Dm6JdbcDriver.jar,用此驱动连接DM8肯定会出错)
连接数据库失败,错误消息:网络通信异常
很明显,由于驱动错误,dts连不上源库,所以报错为"网络通信异常"
若默认驱动正确,或解决完驱动问题后,点击下一步
需要将表RESOURCES.EMPLOYEE的定义与数据导出到SQL文件中,故将SQL文件命名为TB_RESOURCES.EMPLOYEE.sql
为了简单起见,只导出表RESOURCES.EMPLOYEE,多余的都不选。(想导出其他对象,可勾选上自己测测)
把要导出的表(RESOURCES.EMPLOYEE)勾上
【注意】
点击转换按钮后,可控制表导出的内容
- 表定义
- 主键
- 表数据
- 约束
- 索引
点击转换按钮后,界面如下
【注意】
迁移的成败与否,很大程度看这里的配置,此处按默认来即可,不做过多讲解和测试(优先注意标红的内容!)
迁移对象、映射关系都选择完毕后,点击下一步
审阅迁移任务,若无误,则点击"完成",开始迁移
迁移任务完成后,将显示任务的执行情况(此处的任务都执行成功了)
若迁移失败,可以查看迁移日志,分析原因
查看迁移出来的SQL文件
[dmdba@dw1 sqlfile]$ cd /home/dmdba/sqlfile
[dmdba@dw1 sqlfile]$ head -15 TB_RESOURCES.EMPLOYEE.sql
CREATE TABLE "RESOURCES"."EMPLOYEE"
(
"EMPLOYEEID" INT IDENTITY(1,1) NOT NULL,
"NATIONALNO" VARCHAR(18) NOT NULL,
"PERSONID" INT NOT NULL,
"LOGINID" VARCHAR(256) NOT NULL,
"TITLE" VARCHAR(50) NOT NULL,
"MANAGERID" INT NULL,
"BIRTHDATE" DATE NOT NULL,
"MARITALSTATUS" CHAR(1) NOT NULL,
"PHOTO" IMAGE NULL,
"HAIRDATE" DATE NOT NULL,
"SALARY" DEC(19,4) NOT NULL
);
DM ⇒ DM
通过DTS,把示例库BOOKSHOP中的内容,从源库(dm8)迁移到目标库(dm8)
示例库BOOKSHOP的创建
https://eco.dameng.com/docs/zh-cn/pm/example-description.html#
- 源库
通过dminit创建了空库,并创建了示例库BOOKSHOP - 目标库
仅通过dminit创建了空库
注意:
由于dts需要与源库和目标库通信,故源库和目标库的端口要开放好,别被防火墙拦截了!
开放端口
https://blog.csdn.net/weixin_41709724/article/details/121236327
检查端口是否通畅(IP为目标IP,端口为目标端口)
telnet IP PORT
正确输出如下
[dmdba@dw1 sqlfile]$ telnet 192.168.1.100 5236
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.
Connection closed by foreign host.
新建一个迁移工程
输入源端信息(源端IP、数据库端口、数据库用户名、数据库用户口令)
输入目标端信息(目标端IP、数据库端口、数据库用户名、数据库用户口令)
【注意 1】
确保数据库的IP、端口正确,且端口没有被防火墙拦截
【注意 2】
确保数据库用户的用户名和口令正确,且权限充足
【注意 3】
确保驱动配置正确,且驱动可用
若上述条件不满足,点击"下一步"将报错,可能如下图所示
仅迁移模式RESOURCES中的所有表(其余的选项此处暂时不勾选)
把RESOURCES模式的所有表都勾选上,并点击"转换"
请按下图进行勾选(否则可能会迁移失败)
迁移对象和表映射关系勾选完毕后,点击"下一步"
审阅迁移任务,确认无误后,点击"完成",开始迁移
迁移任务如下:
迁移完成后,有2个任务失败了
下面查看下报错信息
也可以通过日志,查看错误信息
【注意】
报错说明创建外键出错了
- 表"RESOURCES".“EMPLOYEE"的PERSONID列需要参照表"PERSON”.“PERSON"的PERSONID列(即应该先导入表"PERSON”.“PERSON”,再导入表"RESOURCES".“EMPLOYEE”)
- 表"RESOURCES".“EMPLOYEE_ADDRESS"的ADDRESSID列需要参照表"PERSON”.“ADDRESS"的ADDRESSID列(即应该先导入表"PERSON”.“ADDRESS”,再导入表"RESOURCES".“EMPLOYEE_ADDRESS”)
那么,先把PERSON模式中的所有表,从源端迁到目标端,再把上面迁移失败的两个约束补上
迁移对象和表映射关系与迁移RESOURCES模式相同(此处跳过)
由于模式PERSON的表没有约束和索引,故迁移过程没有任何报错
现在,再迁移RESOURCES模式缺少的两个约束
迁移对象和表映射关系勾好后,点击"下一步"
迁移成功
注意:
若有失败的任务(例如EMPLOYEE_ADDRESS表的外键迁移成功,但EMPLOYEE表的外键迁移失败),就把失败的任务再单独执行一次(单独迁移EMPLOYEE的外键)
若不勾选"保留引用表原有模式信息",创建约束时,若引用表不在模式RESOURCE下,将无法创建。(此处的引用表为PERSON.ADDRESS,故无法创建引用该表的约束)
因为没有RESOURCE.ADDRESS表,故约束创建失败
总结:
表的迁移顺序很重要,先迁移引用表
对于单表,先迁移表定义,再迁移数据,最后迁移约束和索引