`
lijj_72
  • 浏览: 22007 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

航海日志(1) ----from Oracle to DB2

阅读更多

航海日志(1) ----from Oracle to DB2

      李俊杰

概述

OracleDB2是不同的数据库系统,从展现到内部实现机理都有比较大的差异,下面是结合财务公司项目具体情况及数据迁移中涉及到的问题给出具体的解决方案。本次迁移是从Oracle<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="10" numbertype="1" negative="False" unitname="g" w:st="on">10g</st1:chmetcnv> 迁移到DB2 9.1。本文并不是系统地介绍OracleDB2的差异性分析,也不是详细罗列转换过程SQL迁移如何转换,仅仅是我们在迁移中遇到这样或那样的问题,给出解决的方案。希望给读者以启发并能达到举一反三的效果。

数据库环境准备

数据库本身迁移及IBM数据迁移工具MTK

数据库表,视图,序列,索引等数据库本身的特性由IBM的数据迁移工具主要由完成,

Migration Toolkit (MTK) 都是从非 IBM 数据库迁移到 IBM 产品的一种强大的工具。使用IBMMTK迁移工具,首先连接源数据源(oracle),获取数据源的表,视图,序列,index等数据库元信息,生成元数据脚本文件。把oracle的脚本文件转换成响应的DB2脚本,这儿要指定相应的字段类型映射,这个过程可以需要迭代几次,最终才能转换成合适的DB2数据库脚本。连接DB2数据库环境,执行数据库DB2脚本,创建相关的表、视图等。最后抽取oracle数据,生成相应的SQL脚本,把数据导入到DB2的环境中。下面是具体执行步骤:

MTK数据迁移工具指定数据源 <o:p></o:p>

MTK 支持直接从源数据库提取源对象,或者导入包含要转换的 SQL 的脚本。一般在windows上需要首先创建数据库连接,如ODBC或者JDBC,配置Oracle数据源的IPUserpassword,测试连接成功后,打开MTK,把相应的Oracle数据源配置到MTKMTKMigration Toolkit)是迁移工具,必须有原材料,经过加工,生成产品,那么原材料就是Oracle数据源,类似于我们常用的OraclePLSQL等数据库工具,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)信息,因为OracleDB2的字段类型定义存在差异,如我们在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字段类型来替换,因为在数据库内部的逻辑上,所谓的BlobClob字段,实际该字段存储的是该字段内容的一个地址。<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)时发现了一些问题,哈哈!有时候工具也靠不住啊!因为创建ViewSQL比较复杂,单独拿出来说一说,可能挂一漏万。<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>

DB2replace(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>

Oracleto_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') TransactionDate<o:p></o:p>

DB2CURRENT TIMESTAMP  AS TransactionDate     (DB2在转换的时候日期类型都缺省设置为:TimeStamp 类型)<o:p></o:p>

7)别名问题,Oracle 在进行Union的时候只要数据类型一样,名称可以不一样,DB2必须都一样,如果不一样则必须使用as<o:p></o:p>

OraclemSuretyFeeRate SecutyFeeRate<o:p></o:p>

DB2MSURETYFEERATE AS SecutyFeeRate<o:p></o:p>

8Oracle    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>

9tis.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>

11Oracle : 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics