时,如果我们用 import、export 做数据的迁入迁出,对比生成的 data 文件我们会发现 oracle 和 db2 的数据格式完全不一样,因此对于数据规模比较大的表用 import、export 就不太现实,这时我们可以借助 IDMT 来进行表的定义以及数据的导出导入。这里我们借助 IDMT 来进行数据的导出导入, 其具体的使用说明可参 IDMT 的使用说明 http://www.ibm.com/developerworks/data/library/techarticle/dm-0906datamovement。
其数据导入后,用 datastudio 进行数据查询的结果。根据查询结果集的对比可知数据已经完全迁移过来。
图 5:DB2 中 Table Partition 表的数据查询结果集
Oracle 的 Hash partition 到 DB2 的 DPF
假设在一个 Oracle 数据库中有一个 Hash Partition 的表定义如下:
清单 13. Oracle 中 Hash table 的表定义
CREATE TABLE hash_sales
(
salesdate date,
protype varchar2(20),
proname varchar2(20)
)
PARTITION BY HASH(salesdate)
(
partition p0 tablespace tbhash,
partition p1 tablespace tbhash
);
该表以 hash_part 字段按照 HASH 算法分区,创建了两个分区 p1 和 p2 分别在表空间 tbsp1 和 tbsp2 中。用 select 语句查询出其数据结果集:
图 6.Oracle 中 Hash Partition 表的数据查询结果集
根据前面所说,我们可以把该 table 映射到 DB2 的 DPF 上。如果当前 DB 已经创建好了 DPF,那么我就直接创建 table 即可,但是做 migration 很多时候都需要自己创建逻辑分区,我们将按照下面的步骤创建 DPF、Table space 以及 Table。
- 用 db2start 添加 partition
我们可以用 db2start 来创建 partition,其命令格式如下:
db2start dbpartitionnum PARTITIONNUM add dbpartitionnum hostname port without tablespaces
这里我们已经有了一个 partition 0,我们再创建一个 partition 1。
db2start dbpartitionnum 1 add dbpartitionnum n4shost port 1 withoust tablespaces
- 创建 partition group
partition 添加完成之后,下面就需要为 partition 创建 partition group。其命令格式如下:
create database partition group on dbpartitionnums(, … )
这里我们创建的 group 为 grouphash。
Create database partition group grouphash on dbpartitionnums(0,1)
- 创建 tablespace
在该 partition group 中创建 tablespace。其命令格式如下:
Create tablespace in database partition group
这里我们创建表空间 tphash:
Create tablespace tphash in database partition group grouphash
- 创建 table
在 tbptest 中创建与 oracle 对应的 table,其 sql 语句如下:
清单 14. DB2 中与之映射的 DPF table
create table hash_sales(
salesdate date,
protype varchar(20),
proname varchar(20)
)
in tphash
distribute by hash(salesdate)
完成了表的创建,下面就是数据的导出与导入,与上一节相同我们同样可以采用工具 IDMT 来实现。但是在本次实验中的数据很少,因此这里我们就直接用 import 来实现数据的导入。数据导入完成之后通过 clp 查询的数据结果如下图所示。
图 7.db2 中映射的 DPF 表查询结果集
总结
本文分别对 Oracle 和 DB2 的分区模式进行了概述,并且对两种数据的分区方式进行对比,介绍了 Oracle 中的简单分区在 DB2 中我们可以采用什么样的分区方式与之映射。对于 Oracle 中的复合分区,本文也对 Range-list 和 Range-hash 进行了介绍以及提出了在 DB2 中与之映射的方案。同时我们也对 oracle 中的 range partition 和 hash partition 的表如何迁移到 db2 中进行了简单的描述,并且提供了相应的方法。
总之,本文对 oracle 的 partition 迁移到 db2 提供了一个整体的映射方案并且提供了一些简单的数据迁移方法,对于复杂的复合分区还有待于完善