【IT168 技术】本文主要讲解从DB2 v9.7 PHSDB库迁移到K-DB11G最佳实践,迁移数据库名为PHSDB,数据库架构为单机。首先在目标主机上安装K-DB11g软件,并创建PHSDB库,具体安装过程请参考管理手册。本次迁移范围包括数据库对象和数据两部分,以下分两部分别进行介绍。

注意:保证源库和目标数据库字符集一致。整个迁移流程如下:

第一部分介绍数据库对象迁移

实际迁移中需要把DB2的一个schema分别对应K-DB一个用户,schema和用户名称建议一致。首先进行DB2数据库对象种类分析、数据类型分析、数据量分析等,通过Sql develper工具连接到 DB2 数据库进行数据对象分析,捕获源数据库对象,并在制定目录中自动生成K-DB支持的建用户、表、主键、索引、约束外键、列默认值和标识列语句的脚本;如果存在其他对象类型,需要人工参与修改。经分析源PHSDB库包括表、主键、索引、外键约束、序列、视图、函数、列默认值和标识列对象,脚本中把DB2 schema PHS映射成K-DB PHS用户,所有对象通过PHS用户创建,并授予K-DB PHS用户CREATE SESSION, RESOURCE, CREATE VIEW, CREATE MATERIALIZED VIEW, CREATE SYNONYM系统权限,表空间使用user表空间,临时表空间使用temp。

DB2和K-DB数据类型转换格式如下:

注意:IBM DB2完整性约束语句支持ON DELETE and ON UPDATE写法,K-DB仅支持ON DELETE完整性约束,工具已经完成自动装换。

具体DB2和K-DB约束对比如下:

在本次迁移过程中,所有外键约束语法只包括ON UPDATE RESTRICT,ON DELETE RESTRICT约束,通过工具已经自动转换全部符合K-DB约束语法。例如:

DB2语句:

ALTER TABLE "PHS"."P_PACKAGE_GROUP"

ADD CONSTRAINT "FK2_P_PACKAGE_GROUP" FOREIGN KEY

(

"PACKAGEID"

)

REFERENCES "PHS"."P_PACKAGE"

(

"PACKAGEID"

)

ON UPDATE RESTRICT

ON DELETE RESTRICT

;

转换后K-DB语句:

ALTER TABLE P_PACKAGE_GROUP

ADD CONSTRAINT P_PG_PACK_FK FOREIGN KEY

(

PACKAGEID

)

REFERENCES P_PACKAGE (

PACKAGEID

)

ENABLE

;

本例中列默认值转换语法如下,DB2语句:

ALTER TABLE "PHS"."P_INSTANCE" ALTER COLUMN "PERSONID" SET WITH DEFAULT -1 ; ALTER TABLE "PHS"."CHRONIC_TEMPLATE" ALTER COLUMN "MEDEVENT" SET WITH DEFAULT 8 ;

转换后K-DB语句:

ALTER TABLE "PHS"."CHRONIC_TEMPLATE" MODIFY "MEDEVENT" DEFAULT 8 ; ALTER TABLE "PHS"."P_INSTANCE" MODIFY "PERSONID" DEFAULT -1 ;

在DB2中存在自动递增标识列,K-DB使用序列和触发器模仿DB2标识列,针对DB2的每个带有标识列创建语句分别增加相对应创建序列和触发器语句。

源PHSDB数据库带有自增标识列语法如下:

CREATE TABLE "PHS"."BATCH_TASK_RECORDS"

(

"ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 41, INCREMENT BY 1, CACHE 20),

"STATUS" INTEGER ,

"JOBSTARTTIME" TIMESTAMP ,

"JOBENDTIME" TIMESTAMP ,

"SDATE" TIMESTAMP ,

"EDATE" TIMESTAMP ,

"TYPE" VARCHAR(50)

)

;

K-DB转换后使用序列和触发器解决提供解决方案:

CREATE TABLE BATCH_TASK_RECORDS (

ID NUMBER(10,0) NOT NULL,

STATUS NUMBER(10,0),

JOBSTARTTIME TIMESTAMP(9),

JOBENDTIME TIMESTAMP(9),

SDATE TIMESTAMP(9),

EDATE TIMESTAMP(9),

TYPE VARCHAR2(50 CHAR)

);

CREATE SEQUENCE BATCH_TASK_RECORDS_ID_SEQ

MINVALUE 1 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE ;

CREATE OR REPLACE TRIGGER BATCH_TASK_RECORDS_ID_TRG BEFORE INSERT ON BATCH_TASK_RECORDS

FOR EACH ROW

DECLARE

v_newVal NUMBER(12) := 0;

v_incval NUMBER(12) := 0;

BEGIN

IF INSERTING AND :new.ID IS NULL THEN

SELECT BATCH_TASK_RECORDS_ID_SEQ.NEXTVAL INTO v_newVal FROM DUAL;

-- If this is the first time this table have been inserted into (sequence == 1)

IF v_newVal = 1 THEN

--get the max indentity value from the table

SELECT NVL(max(ID),0) INTO v_newVal FROM BATCH_TASK_RECORDS;

v_newVal := v_newVal + 1;

--set the sequence to that value

LOOP

EXIT WHEN v_incval>=v_newVal;

SELECT BATCH_TASK_RECORDS_ID_SEQ.nextval INTO v_incval FROM dual;

END LOOP;

END IF;

--used to help get last identity value

db2_utilities.identity := v_newVal;

-- assign the value from the sequence to emulate the identity column

:new.ID := v_newVal;

END IF;

END;

DB2 PHSDB库中包括序列、视图、函数对象,无法通过Sql developer完成自动转换。利用IBM IDMT工具首先进行对象脚本卸载,脚本生成在用户指定目录结构中,由于DB2和K-DB在rownum使用、取系统日期、空值转换、数据类型函数、数值转换函数和子查询等语法使用上存在差异,需要人工把视图和函数改成K-DB支持的语法,具体更改过程参照K-DB语法解释。

序列创建语句对比例子如下:

最后通过在K-DB数据库依次运行建表和修改后数据对象创建脚本,完成整个PHSDB数据对象的迁移。

第二部分进行数据迁移

数据迁移脚本主要包括Db2_data.sh卸载数据脚本和Import_kdb.sh加载数据脚本。Db2_data.sh进行DB2数据卸载,Import_kdb.sh完成K-DB数据导入操作。

Db2_data.sh卸载脚本语句如下:

db2 export to data/PHS_APPROLE.TXT of DEL modified by coldel"#" datesiso nochardel "select \"ID\",'',\"ROLENAME\",'',\"DESCRIPTION\",'', '' from PHS.\"APPROLE\""

db2 export to data/PHS_UTS_CHRONIC_MED.TXT of DEL modified by coldel"#" datesiso nochardel "select \"MEDID\",'',\"MEDICATION\",'',\"SPECIFICATION\",'',\"SPELLING\",

'',\"MEDUNIT\",'', '' from PHS.\"UTS_CHRONIC_MED\""

……

Import_kdb.sh导入数据脚本语句如下:

tbloader userid=$username/$password@$tnsname control=control/PHS.APPROLE.ctl log=log/PHS.APPROLE.log

tbloader userid=$username/$password@$tnsname control=control/PHS.UTS_CHRONIC_MED.ctl log=log/PHS.UTS_CHRONIC_MED.log tbloader userid=$username/$password@$tnsname control=control/PHS.PES_UPLOAD_JOB.ctl log=log/PHS.PES_UPLOAD_JOB.log

tbloader userid=$username/$password@$tnsname control=control/PHS.P_INST_DISEASE.ctl

利用batch_ctl.sh脚本批量生成tbloader使用的控制文件,该脚本是通过抓取目标数据库已经生成的表结构,利用shell语句封装成控制文件。

tbloader控制文件内容如下:

# load data by tbloader

load data

infile 'PHS.APPROLE.dat'

logfile 'log/PHS.APPROLE.log'

badfile 'log/PHS.APPROLE.bad'

append

into table PHS.APPROLE

fields terminated by '##'

LINES TERMINATED BY '\n'

(

ID ,

ROLENAME ,

DESCRIPTION )

最后运行Import_kdb.sh脚本进行数据加载,确认脚本执行完成后,使用gather_data.sh脚本进行数据校验分析,确认迁移数据成功,至此本次迁移完成。

注意:由于约束会造成部分数据导入不成功,我们在执行数据加载前分别执行Pro_load.sh和Modify_null.sh两个脚本,把外键约束禁用和冗许字段为空;执行Import_data.sh迁移数据后,再执行Post_load.sh和Modify_not_null.sh启用约束,脚本分别放到Import_kdb.sh脚本初始和结尾中。

oracle到kdb迁移,DB2迁移到K-DB最佳实践相关推荐

  1. DB2 Workload Management 工作负载管理最佳实践

    转自:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0912db2workloadm/index.html 概要介 ...

  2. Oracle 12c数据库优化器统计信息收集的最佳实践

    Oracle 12c数据库优化器统计信息收集的最佳实践 转载自     沃趣科技(ID:woqutech) 作者         刘金龙(译) 原文链接   http://www.oracle.com ...

  3. Oracle SaaS精准营销,Eloqua 结合微信的最佳实践

    市场部如何驱动业绩增长,保证销售团队拥有高质量的潜在客户?升级营销自动化体系需要重点关注: 客户精准画像:把握精准的客户画像与分类,根据客户购买旅程,提供定制化的内容. 打通多元渠道:与客户互动的渠道 ...

  4. Openstack迁移DDH最佳实践

    简介:将OpenStack上的虚拟机迁移到专有宿主机DDH,大幅降低成本. 直达最佳实践:[Openstack迁移DDH] 最佳实践频道:[点击查看更多上云最佳实践] 这里有丰富的企业上云最佳实践,从 ...

  5. DB2 最佳实践: 性能调优和问题诊断最佳实践

    最佳实践的相关文章可见:http://www.ibm.com/developerworks/cn/data/bestpractices/ DB2 最佳实践: 性能调优和问题诊断最佳实践,第 1 部分 ...

  6. db2 迁移mysql,mysql 迁移 db2

    我该怎样迁移数据呢?如果用于非 IBM 平台的数据库模式与用于 DB2 的模式相同(或非常类似),那么可 以通过使用 IBM Migration Toolkit (MTK) 来完成数据迁移.因此... ...

  7. ssma5.3_适用于Oracle的Microsoft SQL Server迁移助手(SSMA)v7.1

    ssma5.3 介绍 (Introduction) SQL Server Migration Assistant (SSMA) is a free supported tool from Micros ...

  8. OceanBase 业务数据库实践(二)── DB2 迁移

    IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX).Linux.IBM i(旧称OS/400).z/OS,以及Windows服务器版本 ...

  9. MySql建表语句迁移DB2方法总结(踩坑记录)

    一.前言 最近需要把mysql数据库中的表迁移到DB2数据库,表内的数据用kettle可以实现迁移,但是建表语句却怎么也搞不好. 百度半天,发现并没有什么好的方法或工具能把mysql建表语句转成DB2 ...

最新文章

  1. 大规模落地:AI安防仍存两大痛点
  2. struct ifconf和struct ifreq,获取网线插入状态
  3. Linux疑难杂症解决方案100篇(四)-SHELL编程预留题目解析
  4. mongodb更新某个字段_直播 | MongoDB开源数据库的云上之路
  5. Memory and Trident
  6. 行动力决定了一个人的成败,有想法,就去做! C#的内存管理原理解析+标准Dispose模式的实现
  7. 安装scrapy 出现Failed building wheel for Twisted(总是显示此错误)解决办法
  8. django之开发环境关于settins.py里面的DEBUG的设置和静态文件的关系
  9. 学习笔记-模块之xml文件处理
  10. Sql Server2005分离数据库
  11. 小米路由pro php,完全拆解小米路由器Pro:无接口,预加硬盘无望
  12. eclipse jade插件安装
  13. 1200兆路由器网速_1200m路由器有必要吗 只要我们选择5GHz频段就可
  14. 安装配置Axis2,为Eclipse安装配置Axis2插件教程
  15. 读书笔记:《你拿什么定义自己》
  16. Liunx配置tomcat
  17. html分列代码,科学网—EXCEL 分列 (TextToColumns) 的C#代码 - 丁祥欢的博文
  18. Linux:安装和配置tomcat详细教程
  19. Android 微光闪烁效果
  20. WPF入门8:模板(Template)

热门文章

  1. html5给页面添加树叶特效,html5 canvas树叶光标动画特效
  2. 微信分享到朋友圈接口用法
  3. 名帖293 张瑞图 行书《书米芾西园雅集图记十二条屏》
  4. Java初级应用——编写西游记人物类,属性包括,身高,名字,武器。用一个测试类测试。
  5. 【榜单公布】新星计划·第三季获奖名单出炉(第一批)
  6. 开发商降价促销 上海楼市拐点已现?
  7. PDF转换成Word后乱码怎么办?
  8. 在HTML代码中要如何插入空格?
  9. web服务端和游戏服务端的区别
  10. 迅雷CEO陈磊 | 迅雷的区块链生态梦