oracle迁移达梦操作流程
文章目录
达梦数据库的安装参考:
- 官方文档:https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html
- 达梦数据库DM8-centos7环境安装(图文详情)_一笑嘴就歪的博客-CSDN博客
迁移参考:
官方提供的操作流程:https://eco.dameng.com/document/dm/zh-cn/start/migrate-oracle-dm.html 以及提供的pdf文档(更详细,pdf链接失效就在这个官方的里找):
数据准备
需要迁移Oracle中的用户”LONGER”的模式”LONGER”中的数据,其中包括:
-
2个Sequence:
- TEST_SEQ1
- TEST_SEQ2
-
5张表Table:
- EMPLOYEES → 8000条数据,一个索引
- DEPARTMENTS
- TEST_TABLE → 少量数据
- USER_DATABASE → 1个联合索引
- USER_PASSWD → 1个联合索引
其中EMPLOYEES和DEPARTMENTS的数据量较大,但也没有多到需要多台机器。因此还是简单的单机数据迁移
-
5个索引Index
- DEPARTMENT_ID_IDX
- EMPLOYEE_ID_IDX
- PK_IP_NAME
- PK_UNION
- SYS_C0011120
-
2个视图View
- EMPLOYEE_BASIC_INFO_VIEW
- EMPLOYEE_CONTACT_INFO_VIEW
-
1个Function:
- TEST_FUNC_ADD:简单的两数相加的函数
-
2个存储过程procedure:
- PROCEDURE_CALL 调用函数TEST_FUNC_ADD并通过DBMS_OUTPUT.PUT_LINE进行打印的存储过程
- PROCEDURE_LONGER_TEST 插入一条数据到test_table的存储过程
-
4个简单的包package(只有声明):
- PKG_BBA
- PKG_DEV
- PKG_DEV1
- PKG_TEST
-
1个表级触发器Trigger:
- MODIFY_TEST
-
1个物化视图
- EMPLOYEE_MVW
迁移步骤
使用达梦提供的迁移工具DTS进行迁移。
- 如果两个数据库在同一个局域网,能够互相通信,则可以直接使用迁移工具进行迁移
- 若不在同一个局域网,则需要一台中间机器,首先从Oracle迁移到中间机器,再迁移到目标机器上的达梦数据库。
本例中两个数据库能互通(192.168.226.200和192.168.226.103,在同一个子网192.168.226.1下),所以直接迁移。
新建工程和迁移
启动迁移工具
-
首先创建工程。
一个工程下可以创建多个迁移任务和对比任务
-
然后右键“迁移”来创建迁移任务
-
填写相关标识后创建成功,可以进行下一步
选择迁移类型
迁移工具提供了多种迁移种类,按照需求进行选择,这里选择将Oracle迁移到DM
连接到Oracle和DM数据库
输入Oracle和DM数据库的连接串信息来连接到两个数据库。一般是登录有“DBA”权限的用户,这样有权限迁移多个用户和对应的模式下面的数据。
查看数据类型映射关系
连接上数据库之后,点击下一步:
在“获取迁移对象方式”中选择“选择迁移对象”,这种方式允许我们在迁移工具加载完对象之后,手动选择要迁移的对象。
“迁移对象”中的选项通常默认,值得一提的是在“查看默认类型映射关系”中可以查看Oracle数据库到DM数据库的数据类型的映射关系,因为各自的数据类型并不完全一致,比如达梦中并没有date类型,取而代之的是使用TIMESTAMP时间戳类型。当然也可以自己定义映射关系。不过通常默认提供的就比较合适了。
选择迁移的schema
上步完成后,下一步中我们可以选择要迁移的schema以及其下的数据库对象。
注意:要迁移的schema最好要提前在达梦数据库中建立对应的表空间、用户和模式,否则直接迁移只会在DM中创建一个同名schema,不会创建用户,并且迁移的表都在默认的MAIN表空间下,这会造成管理混乱。
新建表空间可参考:https://eco.dameng.com/document/dm/zh-cn/start/dm-create-tablespace.html
创建用户、授权可参考:https://eco.dameng.com/document/dm/zh-cn/start/dm-user-tablespace.html
注意:此外,一般存储过程、函数、包中都会涉及各个数据库的方言,因此迁移通常着重迁移数据部分,也就是序列,表,视图、触发器等内容。对于存储过程、函数、包等数据库对象,可以通过PL/SQL或SQLPlus等工具将Oracle中相应的数据库对象导出到sql脚本,手动修改后在达梦中执行,达到迁移的目的。
PL/SQL导出对象可以选择:工具→导出用户对象,勾选相应的对象,之后便可导出到sql脚本中供修改使用。
不过本例中用来测试的存储过程、函数、包只有一些简单语法,可以直接正常迁移。
选定后,点击下一步
检查数据和转换内容
指定要转换的schema之后,迁移工具会分析并列举要迁移的数据库对象,在这里,我们可以进行预览和转换的设置:
↑选中一个table,【预览】能查看其中的部分数据
【转换】则允许我们对该对象的要转换的内容进行设定。
↑以一个table为例,【迁移策略选项】允许我们指定要迁移的内容,对于一些较大的表,可能需要将表定义、数据、索引等内容分开迁移,因此可以在这里指定,分多次迁移。
【列映射选项】里允许我们对列的映射情况进行检查和管理。比如调整列名,精度等
之后,下一步
检查确认
对要迁移的内容进一步检查,点击【完成】即可开始迁移。
检查报错与纠错
不出意外,迁移过程大概率会出现问题,要认真查看报错和官方文档找解决方法。就不一一列举(上面贴的pdf附件中有很多常见错误可参考)
比如,本次实验中,因为表数据设计的问题,出现以下报错:
分析:达梦数据库中没有DATE类型,均保存为TIMESTAMP时间戳类型。由于源表里的数据是批量生成的,规则是每生成一条数据,日期就减去一定的天数,导致出现了一部分不合法的公元前0年的数据,比如,在公元1年1月1日,减去25天得到的是公元前0年的12月7号,再转成日期类型看一下,就得到了报错中的非法日期值,导致迁移失败。不过直接往Oracle中插入公元前0年的数据也是不允许的。这种通过运算符得到公元前0年数据应该是Oracle的一个bug。
重新生成表的数据后,之后重新迁移数据(这个时候就可以在上面的【转换】中只选择数据)正常执行:
数据正常迁移
在迁移package时还出现了另一个错误:
有一个包在oracle只有简单的声明,这在oracle中是允许的:
create or replace package pkg_null is
end package;
但迁移到达梦中会报建包语法错误如下:
达梦不允许包内容为空,通过给包添加个简单的变量则来解决这个问题。不过实际上基本不会出现创建一个包却没有任何包体的情况
检查迁移后的模式内容
迁移完成后,可以对迁移的内容进行检查:
可以看到,新模式“LONGER”下的内容都正常迁移。
但是视图的图标上有红色的错误。那是因为该视图被先迁移了,导致没有找到表,按如下重新编译即可
所以,迁移过程中一般还要遵循一定的规则,一般来说:序列→表→视图→其他(存储过程,函数,包)
迁移完对比
也就是diff。在迁移完,还可以使用迁移工具中的【对比】,对迁移的内容进行diff。
类似迁移,简单流程如下:
-
先创建一个对比
-
选择对比方式
-
使用连接串登录两个数据库
-
选择对比选项(默认即可)
-
选择要对比的模式和其中的对象
-
【指定对象】界面中点击右上角的【添加源】会读取源模式中的对象,勾选想要对比的对象之后点确定,会列举与目的模式之间的对比的对应关系。勾选想要对比的项目,点击下一步。
-
检查对比概要之后点击完成即可开始对比
-
对比结果中可以看到一些diff信息,双击【不一致】下面的对应行的内容,可以打开具体diff详情:
-
再双击具体的不相等的内容可以查看细节:
这里以EMPLOYEES这个表为例。可以发现,只是表定义不同,因为将DATE类型转为了时间戳类型。数据量和数据内容都是没有不相等的。说明迁移是没问题的
-
同样的,可以检查一下其他数据库对象的不相等的原因,以确定是否可用。