http://www.itpub.net/thread-2059650-1-1.html
本文主要讲解从 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\",'
from PHS.\"APPROLE\""
db2 export to data/PHS_UTS_CHRONIC_MED.TXT of DEL modified by coldel"#" datesiso
nochardel " select
\"MEDID\",'
'
……
Import_kdb.sh 导入数据脚本语句如下:
kdloader userid=$username/$password@$tnsname control=control/PHS.APPROLE.ctl log=log/PHS.APPROLE.log
kdloader userid=$username/$password@$tnsname control=control/PHS.UTS_CHRONIC_MED.ctl log=log/PHS.UTS_CHRONIC_MED.log
kdloader userid=$username/$password@$tnsname control=control/PHS.PES_UPLOAD_JOB.ctl log=log/PHS.PES_UPLOAD_JOB.log
kdloader userid=$username/$password@$tnsname control=control/PHS.P_INST_DISEASE.ctl
利用 batch_ctl.sh 脚本批量生成 tbloader 使用的控制文件,该脚本是通过抓取目标数据库已经生成的表结构,利用 shell 语句封装成控制文件。
kdloader 控制文件内容如下:
# 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 '
(
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 脚本初始和结尾中。