航海日志(1) ----from Oracle to DB2
李俊杰
概述
Oracle和DB2是不同的数据库系统,从展现到内部实现机理都有比较大的差异,下面是结合财务公司项目具体情况及数据迁移中涉及到的问题给出具体的解决方案。本次迁移是从Oracle<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="10" numbertype="1" negative="False" unitname="g" w:st="on">10g</st1:chmetcnv> 迁移到DB2 9.1。本文并不是系统地介绍Oracle与DB2的差异性分析,也不是详细罗列转换过程SQL迁移如何转换,仅仅是我们在迁移中遇到这样或那样的问题,给出解决的方案。希望给读者以启发并能达到举一反三的效果。
数据库环境准备
数据库本身迁移及IBM数据迁移工具MTK
数据库表,视图,序列,索引等数据库本身的特性由IBM的数据迁移工具主要由完成,
Migration Toolkit (MTK) 都是从非 IBM 数据库迁移到 IBM 产品的一种强大的工具。使用IBM的MTK迁移工具,首先连接源数据源(oracle),获取数据源的表,视图,序列,index等数据库元信息,生成元数据脚本文件。把oracle的脚本文件转换成响应的DB2脚本,这儿要指定相应的字段类型映射,这个过程可以需要迭代几次,最终才能转换成合适的DB2数据库脚本。连接DB2数据库环境,执行数据库DB2脚本,创建相关的表、视图等。最后抽取oracle数据,生成相应的SQL脚本,把数据导入到DB2的环境中。下面是具体执行步骤:
为MTK数据迁移工具指定数据源 <o:p></o:p>
MTK 支持直接从源数据库提取源对象,或者导入包含要转换的 SQL 的脚本。一般在windows上需要首先创建数据库连接,如ODBC或者JDBC,配置Oracle数据源的IP,User,password,测试连接成功后,打开MTK,把相应的Oracle数据源配置到MTK。MTK(Migration Toolkit)是迁移工具,必须有原材料,经过加工,生成产品,那么原材料就是Oracle数据源,类似于我们常用的Oracle的PLSQL等数据库工具,MTK连接上Oracle数据库后,就可以看到Oracle数据库表,视图,序列,索引等信息。<o:p></o:p>
选择要导出的数据库表,视图,序列等数据库源信息,然后导出相关的文本文件,其内容是类似于“create table”等Oracle创建语句。<o:p></o:p>
<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_s1031" type="#_x0000_t75" alt="" style="WIDTH: 468pt; HEIGHT: 358.35pt; mso-position-horizontal-relative: char; mso-position-vertical-relative: line"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg" o:title="Figure1"></v:imagedata><w:wrap type="none"></w:wrap><w:anchorlock></w:anchorlock></v:shape><o:p></o:p>
<o:p> </o:p>
把Oracle创建语句的远信息转换成DB2类型的创建语句<o:p></o:p>
将数据提取到文件之后,在这里可以查看被提取到文件的 Oracle 信息。通过单击 Convert转换 按钮,可以将该脚本转换成能由 IDS 使用的脚本。<o:p></o:p>
在转换之前,将 Oracle 数据类型的默认映射更改为任何被允许的 IDS 映射。Advanced Options 可用于更改转换后的输出的格式,在这儿可以修改字段类型映射(Map)信息,因为Oracle和DB2的字段类型定义存在差异,如我们在Oracle设计表字段时,采用了Number类型,后面没有指定Number的大小,所以在转换成DB2的过程中就根据实际业务的需要,修改为“smallint, integer, bigint”。用户可以选择一个包含转换文件时所依赖的信息的上下文文件。 <o:p></o:p>
MTK 转换完 Oracle 文件后,会生成一个 IDS(.ids)文件和一个报告(.rpt)文件。.ids 文件包含在转换期间从 Oracle DDL 语句转换而来的 IDS DDL 语句。报告文件则包含一个错误列表,这些错误是在转换期间发现的。<o:p></o:p>
<o:p> </o:p>
<v:shape id="_x0000_s1029" type="#_x0000_t75" alt="" style="WIDTH: 459pt; HEIGHT: 346.35pt; mso-position-horizontal-relative: char; mso-position-vertical-relative: line"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.jpg" o:title="Figure2"></v:imagedata><w:wrap type="none"></w:wrap><w:anchorlock></w:anchorlock></v:shape><o:p></o:p>
<o:p> </o:p>
修改改进<o:p></o:p>
用户可以查看转换得到的输出,找到错误消息,并更改转换后得到的文件。可以通过单击源(Oracle)或目标(IDS)选项卡来进行这样的更改。如果在这一步作出了更改,那么必须重复转换(Convert)步骤,以便使这些更改在转换得到的文件中生效。<o:p></o:p>
表空间设置问题,我们在迁移过程中发现,我们大多数表的行大小都在4k,而有少数几张表在行大小32K以上,因为根据DB2的规定,表空间应该在4k页表空间,8k页表空间,16k页表空间, 32k页表空间,在迁移初期,为了简单,都按32K页建立表空间,但这就可能带来很大的性能问题,浪费缓冲区,后期我们将改变表空间的创建策略,创建4k页的表空间放置大多数4k的表,创建32K页的表空间放置32K的表,并且放置和该表业务逻辑非常密切的4k行大小的表,因为当查询或操作这些32K的表的同时,也会操作与之相关的4k行大小的表,有些4k行大小的表,虽然和32K的表也有外键的关系,但在业务操作上同时操作的几率很小,也会把这些表放置到4k页的表空间内。这样在数据库性能优化阶段将会做的工作,就表空间的页大小设置与缓冲区设置结合,减少IO次数,提高性能。<o:p></o:p>
缩表的问题,因为我们老系统在Oracle数据库上操作,所以当时在表的设计中存在一些问题,如为了使表的扩展性更强,在一个表的多个字段都使用VARCHAR2(1000)这样的数据类型定义,后来我了解到,因为原来设计表时定义的字段类型长度短,所以在后来的实际操作中经常会超过字段的长度,经常修改字段长度,为了少修改字段的长度,都缺少的把这些业务表的大多数字符字段定义为VARCHAR2(1000),物极必反,当我们再做迁移的过程中就发现这些表的行大小都大于32K,根据DB2的要求,无法创建这样的表空间,为此,不得不分析这些大表,并结合业务需求,把不必要定义这么长的字段缩小,这样就解决了某些表的字段类型过大的问题,当然,如果该字段必须很大,那么我们可以采取Blob,CLob字段类型来替换,因为在数据库内部的逻辑上,所谓的Blob,Clob字段,实际该字段存储的是该字段内容的一个地址。<o:p></o:p>
<o:p> </o:p>
<v:shape id="_x0000_s1028" type="#_x0000_t75" alt="" style="WIDTH: 443.65pt; HEIGHT: 348.45pt; mso-position-horizontal-relative: char; mso-position-vertical-relative: line"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.jpg" o:title="Figure3"></v:imagedata><w:wrap type="none"></w:wrap><w:anchorlock></w:anchorlock></v:shape><o:p></o:p>
<o:p> </o:p>
生成数据转换脚本<o:p></o:p>
生成用于提取数据的脚本,并且可以选择用于部署的客户机,您将通过该客户机将 SQL 脚本和生成的数据部署到目标服务器上。<o:p></o:p>
这种情况发生在,我们的应用系统在上线前,先会使用Oracle数据库做业务演示和培训,当应用熟练后,就可能在上面也做些业务,这样Oracle数据库中就保留有真实的业务数据,并且Oracle系统与DB2的系统会并行一段时间,这样当完全迁移过去后,就有必要把原来在Oracle中的数据导入到DB2中,导入成功后会停掉Oracle数据库,完全依赖于DB2数据库。<o:p></o:p>
<v:shape id="_x0000_s1027" type="#_x0000_t75" alt="" style="WIDTH: 459pt; HEIGHT: 343.65pt; mso-position-horizontal-relative: char; mso-position-vertical-relative: line"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image007.jpg" o:title="Figure4"></v:imagedata><w:wrap type="none"></w:wrap><w:anchorlock></w:anchorlock></v:shape><o:p></o:p>
<o:p> </o:p>
部署到 DB2<o:p></o:p>
部署到DB2数据库(DB2建表,Oracle数据脚本,DB2装载数据),在这个过程中如下图所示,可以把这个部署过程一起完成,也可以单独完成某一个,根据实际情况而定。
<o:p></o:p>
<v:shape id="_x0000_s1030" type="#_x0000_t75" alt="" style="WIDTH: 468pt; HEIGHT: 351.5pt; mso-position-horizontal-relative: char; mso-position-vertical-relative: line"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image009.jpg" o:title="Figure5"></v:imagedata><w:wrap type="none"></w:wrap><w:anchorlock></w:anchorlock></v:shape><o:p></o:p>
MTK工具在代码迁移阶段的使用
在开发过程中,即在代码迁移的阶段利用MTK工具也能提高生产效率,如下所示, 但有时工具也不是完全可靠,需要手工去修改,但总体上说,还是有很大的进步,再修改的量也不会很大。<o:p></o:p>
<o:p> </o:p>
<v:shape id="_x0000_s1026" type="#_x0000_t75" style="WIDTH: 468pt; HEIGHT: 307.55pt; mso-position-horizontal-relative: char; mso-position-vertical-relative: line"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image011.png" o:title=""></v:imagedata><w:wrap type="none"></w:wrap><w:anchorlock></w:anchorlock></v:shape>
创建视图的SQL问题
在创建视图(View)时发现了一些问题,哈哈!有时候工具也靠不住啊!因为创建View的SQL比较复杂,单独拿出来说一说,可能挂一漏万。<o:p></o:p>
1) 没有用to_number(ID),ID本身就是数字型, DB2转换是去掉了to_number();<o:p></o:p>
Oracle:“CREATE VIEW…from … where…and naccounttypeId in (select to_number(ID)…)”。<o:p></o:p>
DB2:“CREATE VIEW…from … where…and naccounttypeId in (select ID…)”。<o:p></o:p>
2)日期转换成指定格式的字符串,转换工具转成“ORA.TO_CHAR(a.DTSTARTDATE, 'yyyymmdd')”,需要手工修改,成如下形式<o:p></o:p>
Oracle: TO_CHAR(a.dtStartDate,'yyyymmdd') <o:p></o:p>
DB2:replace(substr(VARCHAR_FORMAT(a.DTSTARTDATE, 'YYYY-MM-DD HH24:MI:SS'),1,10),'-','')<o:p></o:p>
3)用MTK工具转换的时候 A.NACCOUNTID 被转换成了 A.NACCOUNTID1,这就直接改过来就行了。<o:p></o:p>
4)Oracle : to_number(b.ClassID) <o:p></o:p>
DB2 : dec(b.ClassID)<o:p></o:p>
5)Oracle: decode(TransactionTypeID,'1301','1101','1201') TransactionTypeID<o:p></o:p>
DB2 : CASE TRANSACTIONTYPEID WHEN 1301 THEN 1101 ELSE 1201 END AS TransactionTypeID
6)取的系统时间sysdate并设置为timestamp类型<o:p></o:p>
Oracle:to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') TransactionDate<o:p></o:p>
DB2:CURRENT TIMESTAMP AS TransactionDate (DB2在转换的时候日期类型都缺省设置为:TimeStamp 类型)<o:p></o:p>
7)别名问题,Oracle 在进行Union的时候只要数据类型一样,名称可以不一样,DB2必须都一样,如果不一样则必须使用as<o:p></o:p>
Oracle: mSuretyFeeRate SecutyFeeRate<o:p></o:p>
DB2:MSURETYFEERATE AS SecutyFeeRate<o:p></o:p>
8)Oracle to_char(n.executedate,'yyyy-mm-dd') PRDate<o:p></o:p>
MTK 生成:ORA.TO_CHAR(n.EXECUTEDATE, 'yyyy-mm-dd') AS PRDate<o:p></o:p>
DB2修改 :substr(VARCHAR_FORMAT(n.EXECUTEDATE, 'YYYY-MM-DD HH24:MI:SS'),1,10) AS PRDate<o:p></o:p>
9)tis.MINTEREST -->-- -tis.MINTEREST AS MINTEREST 加了一个别名<o:p></o:p>
10)名称问题<o:p></o:p>
用MTK工具转换的时候 aa.contractid 被转换成了 aa.contractid1 ,aa.contractid2<o:p></o:p>
11)Oracle : where lr.ncontractid = lc.id <o:p></o:p>
DB2 : WHERE dec(lr.NCONTRACTID) = lc.ID 因为 lr.ncontractid是字符型
<o:p></o:p>
努力,在于我热爱我的事业,与中国的软件一起走向成熟,走向世界。
联系作者:lijj_72@hotmail.com
分享到:
相关推荐
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-basiclite-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-jdbc-...
### Oracle与DB2的主要区别 本文旨在探讨Oracle与DB2这两种主流关系型数据库管理系统(RDBMS)之间的关键差异。Oracle由甲骨文公司开发,而DB2则由IBM推出。两者均广泛应用于企业级环境,提供了强大的数据管理能力。...
Oracle 和 DB2 是两种广泛应用的关系型数据库管理系统,...使用 `<sql apply-to="oracle"></sql>` 和 `<sql apply-to="db2"></sql>` 标签可以帮助区分针对不同数据库的特定代码段,确保代码能够在目标平台上正确运行。
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-basiclite-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-jdbc-...
compat-oracle-rhel4-1.0-5.i386.rpm
oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
tableau10.0-oracle-driver-x64.msi,tableau开发oracle必须包
### DB2 to Oracle 迁移培训知识点概览 #### 一、DB2 for Oracle Professionals Workshop Coursebook 概述 **DB2 for Oracle Professionals Workshop Coursebook** 是一份由 IBM 提供的专业培训材料,旨在帮助 ...
### DB2常用函数与Oracle比较 本文档旨在深入解析DB2和Oracle数据库中常用函数的异同之处,以便于从一种数据库系统迁移至另一种系统的人员能够快速掌握并适应新的环境。我们将从类型转换函数、时间日期相关的函数...
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus...
2. **安装依赖**:运行`yum install oracle-rdbms-server-11gR2-asm-*`来安装所有必要的ASM组件,包括kmod-oracleasm。 3. **加载内核模块**:使用`modprobe oracleasm`命令加载Oracle ASM内核模块。 4. **初始化ASM...
c3p0-oracle-thin-extras-0.9.2.1
标题中的"jdbc驱动(Oracle-sqlserver-db2-mysql-h2-sqlite)"指的是针对不同数据库系统的一系列JDBC驱动程序。以下是对这些数据库系统及其对应的JDBC驱动的详细解释: 1. **Oracle**:Oracle数据库是全球领先的商业...
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus...
1. `oracleasm-support-2.1.8-1.el6.x86_64.rpm`:这个包提供了Oracle ASM的支持库,它包含了必要的工具和驱动,使得Linux内核能够识别和操作ASM卷。安装这个包是启用ASM功能的第一步,它包含了一些系统服务和命令行...
oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
2021年6.29号打包,最新版本:kafka-connect-oracle-1.0.71.jar,用于根据oracle binglog日志同步数据到kafka
1. **依赖管理**:该包自动处理Oracle数据库所需的各种库和工具的安装,如GCC编译器、开发工具包、kernel-headers和kernel-devel等,确保系统满足所有必要的先决条件。 2. **系统调整**:预安装过程会检查并调整...
这个特定的版本,“oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm”,是针对64位Linux系统的,版本号为12.1.0.2.0,它包含了一些基本的组件,以支持客户端应用程序连接到Oracle数据库服务器。 Oracle ...
Oracle数据库和IBM的DB2是两个全球领先的商业关系型数据库管理系统(RDBMS),它们在很多方面都有各自的特点和优势。对于数据库管理员来说,理解两者之间的差异至关重要,以便选择最适合特定业务需求的解决方案。...