|
Priti Desai, DB2 UDB 顾问, IBM US Ltd.
Shaji Chandrashekhar, DB2 专家,IBM-Siebel ICC, IBM US Ltd.
2005 年 8 月 1 日
是时候扩展您的数据库环境了吗?本文将提供一个将数据库从 IBM® DB2® Universal Database™(DB2 UDB)Enterprise Server Edition V8.2 实际迁移到带有数据库分区功能(Database Partitioning Feature,DPF)的 DB2 UDB Enterprise Server Edition V8.2 的简单例子。
概述
Linux™、UNIX® 和 Windows® 上的 DB2 Universal Database 的几大优点之一就是它的可伸缩性。您可以很容易地启动单个分区上的小型 DB2 UDB Enterprise Server Edition(ESE)数据库,然后在需求增加时,迁移到多分区的环境中。
扩展到多台服务器需要 DB2 UDB V8.2 ESE 的数据库分区功能(Database Partitioning Feature,DPF),这是一个独立授权的功能。DPF 为在多个分区(逻辑的或物理的)上分布大型数据库提供了必要的可伸缩性,并利用了一个无共享(shared-nothing)结构。DPF 可以使独立的 SMP 服务器和包含多台服务器的环境都受益。通过 DPF“分治”的处理,可伸缩性可在单一服务器(纵向扩展)或跨服务器集群(横向扩展)中获得增强。
使用 DPF 最显而易见的理由之一就是提高查询工作负载和 INSERT/UPDATE/DELETE 操作的性能。DPF 还可以克服部分 DB2 的架构限制。例如,在 DB2 中,对 4 KB 的页面大小而言,表的最大大小是 64 GB;对于 8 KB 的页面大小而言,表的最大大小是 128 GB;对于 16 KB 的页面大小而言,表的最大大小是 256 GB;对于 32 KB 的页面大小而言,表的最大大小是 512 GB。在 DB2 中,表和表空间的大小限制是根据每个分区进行规定的。跨多个分区划分数据库将允许您根据环境中分区数目的因数来增加表的最大大小。
本文的目标就是提供简单而又详细的指导,向您展示如何将数据库从 DB2 UDB ESE V8.2 单个分区环境迁移到 DPF(逻辑分区)环境。我们将演示如何在脱机情况下划分数据库,以及如何将数据库从 ESE 迁移到 DPF 逻辑节点(纵向扩展)环境。我们已经为初学用户准备好了一些信息,但这些信息对于已经熟悉 DPF 架构的 IT 架构师和专家也同样有用。
按照下面的步骤,您可以将数据库从单个分区(DB2 ESE)迁移到 1000 个分区(DB2 DPF)。虽然在这个实例中,我们只使用一台 IBM eServer pSeries 630 机器将数据库迁移到两个逻辑分区上。
| 注意:下列易于遵循的详细指导是于 2005 年 2 月 18 日进行技能交流期间在业务合作伙伴的站点上测试的。在本文中,我们将用一个表作为例子,演示如何将数据库从 DB2 ESE 迁移到 DB2 DPF 环境中。在进行技能交流期间,我们将 15 个表划分成两个逻辑节点,将 4 个 IBM FAStT100 磁盘用于节点 0,并将 4 个 IBM FAStT100 磁盘用于节点 1。 |
图 1 说明了这个 DPF 环境。
图 1. 跨两台机器的分区数据库

注意:在技能交流的练习中,我们在一台机器上设置了两个逻辑节点。
实例环境
操作系统
硬件
IBM eServer™ pSeries® 模型 p630:
- HS20 Blade Server
- 8 GB RAM
- 4 × 1 GHz POWER4™ 处理器
- 4 个内部磁盘
存储子系统
IBM 中间件
- 用于 AIX 的 IBM DB2 UDB Enterprise Server Edition V8.2 Fixpak 7a(带有 DPF 功能)
迁移步骤
以下是将数据库从 DB2 UDB ESE 环境成功迁移到 DB2 UDB DPF 环境所遵循的步骤:
- 备份 ESE 数据库
- 收集当前实例和数据库环境
- 生成 DDL
- 导出表
- 设置逻辑节点环境
- 在两个逻辑节点中创建系统临时表空间
- 在节点 0 和节点 1 上创建数据库分区组
- 创建缓冲池
- 在节点 0 和节点 1 上创建表空间
- 在 DPF 环境中创建和装入您的表
- 在 DPF 环境中检查表的分布
- 新节点上的数据库配置参数
- 备份数据库 — DPF 环境
步骤 1. 备份 ESE 数据库
首先要备份数据库,确保在发生错误时,可以恢复到前面的环境。从命令行输入下列命令。在本例中,“ABCDB”是数据库名,而 /db2backup 是存储该备份的路径。
db2stop force
db2start
db2 backup database ABCDB to /db2backup
|
步骤 2. 收集当前实例和数据库环境
从 DB2 命令行执行下列命令,以便搜集并存储当前环境的所有细节。
db2 connect to ABCDB
db2 get dbm cfg > dbm.out
db2 get db cfg for ABCDB > db.out
db2set –all > db2set.out
db2 "select * from syscat.bufferpools" > bp.out
db2 list tablespaces show detail > tblsp.out
db2look –d ABCDB –e –l –a –o db2look.out
|
步骤 3. 生成 DDL
接下来是生成数据定义。
- 从命令行执行
db2look 命令,以生成 DDL:
db2look -d ABCDB -t S_OPTY_POSTN -e -l -a -o S_OPTY_POSTN.ddl
|
- 将 ddl 文件复制到不同的文件中:
cp S_OPTY_POSTN.ddl S_OPTY_POSTN_tbl.sql
|
- 将 S_OPTY_POSTN_tbl.sql 修改为只保存表 ddl。
- 再次重复前面的操作,将这个 ddl 文件复制到不同的文件中:
cp S_OPTY_POSTN.ddl S_OPTY_POSTN_idx.sql
|
- 将 S_OPTY_POSTN_idx.sql 修改为只保存索引和约束条件 ddl。
- 再一次执行同样的操作,将这个 ddl 文件复制到用于视图的不同文件中:
cp S_OPTY_POSTN.ddl S_OPTY_POSTN_vw.sql
|
- 修改 S_OPTY_POSTN_vw.sql 来保存视图 ddl。
步骤 4. 导出表
下一步就是以 DEL 格式导出表。注意:无法使用 IXF 文件将导出表装入哈希分区数据库中定义的表。因此,请确保使用分隔的 ASCII(DEL)格式来导出表。
db2 "export to /dpf_staging/EXPORT_DPF/V8INST1.
S_OPTY_POSTN of del select * from V8INST1. S_OPTY_POSTN"
|
步骤 5. 设置逻辑节点环境
- 检查 vi ~/sqllib/db2nodes.cfg 中的条目:
注意:这表明数据库是在 ESE 环境的单个节点中。
- 验证 vi etc/services 文件中的可用端口:
DB2_v8inst1 60000/tcp
DB2_v8inst1_1 60001/tcp
DB2_v8inst1_2 60002/tcp
DB2_v8inst1_END 60003/tcp
db2c_v8inst1 58111/tcp
|
注意:分区的逻辑和/物理节点可以使用 4 个端口。
- 更新 .rhosts 文件:
vi ~/.rhosts file
ibm1104 v8inst1
|
- 添加 DBPARTITION:
db2start
dbpartitionnum 1 add dbpartitionnum hostname ibm1104 port 1 without tablespaces
db2 terminate
db2stop
db2start
|
- 验证 ~/sqllib/db2nodes.cfg 中的条目:
注意:1 ibm1104 1 逻辑端口是通过以下命令添加的:db2start dbpartitionnum 1 add …
- 基本的状态检查:验证节点 1 正常工作:
export DB2NODE=1
db2 terminate
db2 "values (current dbpartitionnum)"
|
注意:对于当前的分区数目(dbpartitionnum),values 命令应返回 1。
- 回到节点 0(协调节点):
export DB2NODE=0
db2 terminate
db2 "values (current dbpartitionnum)"
|
注意:对于当前的分区数目(dbpartitionnum),该命令应返回 0。
步骤 6. 在两个逻辑节点中创建系统临时表空间
在节点 1 上创建文件系统 /dpf_tmp_fs/temp_4k —— 物理磁盘:
db2 connect to ABCDB
db2 "alter tablespace tempspace1 add (/dpf_tmp_fs/temp_4k) on dbpartitionnum (1)"
|
如果将 8 KB、16 KB 或 32 KB 的页面大小用于 ESE 环境中的 ABCDB 数据库,那么需要发出下列用于 8K、16K、32K 页面临时表空间的命令。(请参阅 步骤 2. 收集当前实例和数据库环境 中的 tabsp.out,以验证页面大小。)
db2 "alter tablespace temp_8k add (/dpf_tmp_fs/temp_8k) on dbpartitionnum (1)"
db2 "alter tablespace temp_16k add (/dpf_tmp_fs/temp_16k) on dbpartitionnum (1)"
db2 "alter tablespace temp_32k add (/dpf_tmp_fs/temp_32k) on dbpartitionnum (1)"
|
步骤 7. 在节点 0 和节点 1 上创建数据库分区组
执行下列命令来创建分区组:
db2 "create database partition group pgr01 on dbpartitionnums (0,1)"
|
步骤 8. 创建缓冲池
执行下列命令来创建适当的缓冲池:
db2 “create bufferpool BP4K database partition group pgr01 size 10000"
db2 “create bufferpool BP8K database partition group pgr01 size 8000"
db2 “create bufferpool BP16K database partition group pgr01 size 5000"
|
步骤 9. 在节点 0 和节点 1 上创建表空间
执行下列命令在节点上创建表空间:
create regular tablespace TBS_BIGTBL_4K in database partition group pgr01
pagesize 4096 managed by database
using (DEVICE ' /dbvols/tbs_bigtbl_4k/p0cont1' 38G) on dbpartitionnum (0)
using (DEVICE ' /dbvols/tbs_bigtbl_4k/p1cont1' 38G) on dbpartitionnum (1)
extentsize 16 prefetchsize 32 bufferpool BP4K
create regular tablespace TBS_BIGTBL_IDX in database partition group pgr01
pagesize 16384 managed by database
using (DEVICE ' /dbvols /tbs_bigtbl_idx/p0cont1' 58G) on dbpartitionnum (0)
using (DEVICE ' /dbvols/tbs_bigtbl_idx/p1cont1' 58G) on dbpartitionnum(1)
extentsize 32 prefetchsize 64 bufferpool BP16K
|
步骤 10. 在 DPF 环境中创建和装入您的表
注意:请参阅 步骤 3. 生成表 DDL,以查看如何获得 S_OPTY_POSTN_tbl.sql、S_OPTY_POSTN_idx.sql 和 S_OPTY_POSTN_vw.sql。
例如: 我们通过列 OPTY_ID 上的分区键划分了 S_OPTY_POSTN 表。
可以按照下列方式修改 S_OPTY_POSTN_tbl.sql:
CREATE TABLE "V8INST1 "."S_OPTY_POSTN" (
"ROW_ID" VARGRAPHIC(15) NOT NULL ,
"CREATED" TIMESTAMP NOT NULL WITH DEFAULT CURRENT TIMESTAMP ,
"OPTY_ID" VARGRAPHIC(15) NOT NULL ,
"OPTY_NAME" VARGRAPHIC(100) NOT NULL WITH DEFAULT gx'0078' ,
"POSITION_ID" VARGRAPHIC(15) NOT NULL WITH DEFAULT gx'0078' ,
"EST_CMPNS_AMT" DECIMAL(22,7) ,
"OPTY_INACTIVE_FLG" GRAPHIC(1) NOT NULL WITH DEFAULT gx'0078' ,
"DOCK_FLG" GRAPHIC(1) WITH DEFAULT gx'004E' )
PARTITIONING KEY ("OPTY_ID")
IN "TBS_BIGTBL_4K" INDEX IN "TBS_BIGTBL_IDX" NOT LOGGED INITIALLY
|
在 DPF 环境中创建该表:
connect to ABCDB;
drop table V8INST1. S_OPTY_POSTN;
db2 –tvf S_OPTY_POSTN_tbl.sql > S_OPTY_POSTN_tbl.out
-- run script to create table in DPF environment
|
在 DPF 环境中载入来自导出文本文件的表:
db2 connect to ABCDB
load from /dpf_staging/EXPORT_DPF/V8INST1.
S_OPTY_POSTN of del insert into V8INST1.S_OPTY_POSTN CPU_PARALLELISM 4
|
创建索引:
db2 –tvf S_OPTY_POSTN_idx.sql > S_OPTY_POSTN_idx.sql.out
|
创建视图:
db2 –tvf S_OPTY_POSTN_vw.sql >S_OPTY_POSTN_vw.sqlout
|
在表上执行 runstats:
runstats on table V8INST1. S_OPTY_POSTN with distribution and detailed indexes all
|
步骤 11. 在 DPF 环境中检查表的分布
执行下列 SQL,以找到跨节点的表的分布:
select dbpartitionnum(OPTY_ID) as PARTITIONNUM_NUM, count(*)
as ROWS from V8INST1.S_OPTY_POSTN
group by dbpartitionnum(OPTY_ID)
order by dbpartitionnum (OPTY_ID)
|
结果将如下所示:
PARTITIONNUM_NUM ROWS
---------------- -----------
0 1663171
1 1668886
|
注意:如果您没有看到数据均匀分布在多个节点上,那就说明您没有指定正确的分区键。在不均匀的分布中,应用程序的执行性能较差。请停止执行,并返回绘图板(drawing board),通过正确的分区键指定要进行划分的正确的表。
步骤 12. 新节点上的数据库配置参数
注意:我们不推荐使用默认的数据库配置参数。您可以基于数据库活动,将它们设置为与节点 0 相关,并在需要时进行调优。
步骤 13. 备份数据库 — DPF 环境
创建脚本来备份 DPF 数据库 —— vi backup.sh。
db2_all '<<+0< db2 backup db ABCDB to dpf_backup/dpf_1,
/dpf_backup/dpf_2, /dpf_backup/dpf_3, /dpf_backup/dpf_4'
db2_all '<<-0< db2 backup db ABCDB to dpf_backup/dpf_1,
/dpf_backup/dpf_2, /dpf_backup/dpf_3, /dpf_backup/dpf_4'
db2stop force
db2start
./backup.sh < backup.out -- run script to backup database offline
|
结束语
我们已经展示了如何划分一个表。您需要根据应用程序的业务流程,确定用正确的分区键划分哪些表。使用我们所描述的步骤,可以很容易地将数据库从 DB2 ESE 环境迁移到 DB2 ESE DPF(逻辑节点)环境。 |