表映射到 db2 中呢?前面我们以说明可以把 Range partition 映射到 db2 的 table partition,list partition 可以映射到带生成列的 table partition。然而 db2 中没有复合分区的概念,因此我们可以考虑映射到 db2 中以 table partition 加 MDC 来与之映射。那么在 db2 中与之相对应的表定义如下: 清单 8. Db2 中 table-MDC 表示例
create table store(
store_id varchar(10),
store_distric varchar(20),
sales_date date,
revenue number(10)
)
in tbsp1, tbsp2, tbsp3, tbsp4
partition by range(sales_date)
(starting from ('01/01/2012') ending ('31/12/2012') every (3 month))
organize by dimension(store_district);
和 oracle 一样以 sales_date 字段作为 range 分区字段,以 store_district 字段做 MDC。
Range-hash 该分区方法就是 Range partition 和 hash partition 相结合的分区方法,就是先安一个字段进行 range partition 然后再按照 hash partition 进行子分区。考虑到 DB2 在分区数据库(DPF)中使用的 hash 方法,那么要在 DB2 中模拟这种复合分区,我们用到了 DPF 及表分区:我们建立了一个分区组,这个分区组包含多个数据库分区,然后在这个分区组下创建一个表空间,再在这个表空间下创建一张表,这样,我们就能够保证这个表中的数据将被分布到所有包含在内的分区上;同时我们用到了 DB2 的 Range 表分区,这样,在任何一个数据库分区内,数据也能够按照范围分区。
清单 9. Oracle 中 Range-hash 表示例
Create table car(
Car_id varchar2(10),
Sales_date date,
Sales_const number(10)
)
Partition by range(sales_date)
Subpartition by hash(car_id)
(partition s1 values less than (to_date( ‘ 01/04/2012 ’ , ’ DD/MM/YYYY ’ )),
partition s2 values less than (to_date( ‘ 01/07/2012 ’ , ’ DD/MM/YYYY ’ )),
partition s3 values less than (to_date( ‘ 01/10/2012 ’ , ’ DD/MM/YYYY ’ )),
partition s4 values less than (MAXVALUE))
DB2 中我们需要首先建立 DPF,然后再在此 DPF 上建立表分区,这里就不详细说明 DPF 的建立过程,DB2 中与上面表对应的表定义如下:
清单 10. DB2 中 Range-DPF 表示例
create table car(
car_id varchar(10),
sales_date date,
sales_cost number)
in tbsp1, tbsp2, tbsp3, tbsp4, tbsp5
distribute by hash(car_id)
partition by range(sales_date)
(starting from ('01/01/2012') ending ('31/12/2012') every (3 month));
Oracle Partition table 到 db2 的数据迁移
数据库的迁移工作相当繁复,本文主要介绍 oracle 中的 partition table 如何迁移到 db2 中,其中相应的 oracle 到 db2 的 partition 的映射已经在前一节中进行了说明,下面就以 oracle 中的 range partitionhe 和 hash partition 的 table 迁移到 db2 为例,介绍如何将一个 oracle 的分区表迁移到 db2 中 , 对于 oracle 数据迁移到 db2 的主要流程这里就不在赘述。除了对表完成映射外,还要完成表对象的部署、数据抽取、以及如何把数据部署到 db2 对应的分区表中。对于表 partition 表对象的部署我们还可以勉强手动创建来解决,然而对于数据的抽取和部署,却很难完成,因此我们可以借助 IBM 开发的一些辅助工具,如 Migration Toolkit(MTK)、Data Movement Tool 等。
oracle 的 range partition 到 DB2 的 table partition
下面我们假设 Oracle 数据库中有一个 range partition 的表,该表的定义如下,下面我们以此表为案例,把该表迁移到 DB2 的 table partition 中。
清单 11.Oracle 中 Range partition 表定义
CREATE TABLE usertest.sales
(
year int,
month int
)
PARTITION BY RANGE (year, month)
(PARTITION p1 VALUES LESS THAN (2009,4) tablespace tbsp1,
PARTITION p2 VALUES LESS THAN (2009,7) tablespace tbsp2,
PARTITION p3 VALUES LESS THAN (2009,10) tablespace tbsp3,
PARTITION p4 VALUES LESS THAN (2010,1) tablespace tbsp4,
);
其中 usertest 为该表的 schema, 这里我们创建了 4 个 partition 分别在 tbsp1、tbsp2、tbsp3、tbsp4 四个表空间内,通过 select 语句查询出数据集。
图 4.Oracle 中 Range Partition 表的数据查询结果集
下面就需要把这个 range partition 的表迁移到 db2 中,首先在 db2 中创建与之对应的 table partition 的表。在 oracle 中比当前日期小的值不包含在相应的 partition 中,如上面 sql 中的,这一点与 db2 不同。其中对应的 db2 中的建表语句如下:
清单 12. DB2 中 Table partition 的表定义
CREATE TABLE "USERTEST"."SALES"
(
"YEAR" DECFLOAT(16) ,
"MONTH" DECFLOAT(16)
)
PARTITION BY RANGE ("YEAR","MONTH")
(
PARTITION P1 STARTING (MINVALUE,MINVALUE) INCLUSIVE ENDING (2009, 4) INCLUSIVE
,PARTITION P2 ENDING (2009, 7) INCLUSIVE
,PARTITION P3 ENDING (2009, 10) INCLUSIVE
,PARTITION P4 ENDING (2010, 1) INCLUSIVE
)
在 DB2 中我们也定义了 4 个分区 P1、P2、P3、P4,在做数据迁移