虽然全备份恢复或者恢复前滚等数据库迁移较为常用并且也较为简单,但是这类携带已经配置好的数据库管理器一起迁移数据库在很多时候并不适用,例如windows上的数据库管理器肯定无法迁移到Unix上,再如数据库管理器配置参数pagesize设置之后就无法更改,而单个表的最大容量是由pagesize决定的,4KB的pagesize最大表容量只能为2GB,如果需要pagesize为32KB,你得重新安装配置数据库,这个时候只能通过数据层面的迁移来移动数据库了。


下面来讨论如何实现DB2数据库data level移动:
 我们知道数据库中有table,view,index,sequence等对象,这些对象是在最初创建设计数据库的时候通过DDL创建的,创建完成之后,DB2的数据字典记录了这些对象(这为后面的重建提供了依据),同时,数据字典记录了这些表之间的彼此参考约束,自身的完整性约束和用户定义约束;数据库中还有用户定义的函数和用户定义的存储过程,同样,DB2数据库通过DDL创建了这些函数和存储过程之后就在数据字典中有了记录,包括对表对象,视图对象,sequence对象,函数,存储过程的用户授权都会在DB2数据库字典中存在记录。这些保存在DB2数据库字典中的信息为我们进行DB2数据层面的迁移提供了依据。要利用这些信息,DB2为我们提供了几个函数和工具:db2look,export,load.通过export和load我们可以对DB2数据库中的表数据导出和导入;
通过db2look,我们可以提取到数据库字典中的DDL语句,即定义数据库框架和对象的语句;
假如把DB2数据库分为两大部分:一部分是真正有价值的部分——数据,另一部分是用于存放和维护数据的框框盒子和约束规章制度等东西,那么export/load便是用于针对数据部分,而db2look便是用于提取DB2中的那些框框萝萝和规章制度的定义方法及语句,有了这个东西,把它拿到任何地方都可以再重现一套数据库出来,如果把这些提取出来的框框条条根据自己需要更改一下,那还可以得到一个自定义的数据库(如pagesize大小不一样的数据库)。
export语法大致如下:
db2 "export to path of ixf messages message_name select * from table_name"
load语法大致如下:
db2 "load from path/of/data of ixf messages message_name replace into table_name "


export和load相对简单,本文主要讨论db2look的使用:
db2look的参数较多,通常,如果除了必须的对象DDL还需要表空间的DDL语句, 可以使用如下参数:
db2look -d db_name -e -l -xd -o /path/db2look.ddl
具体参数可以db2look -h查看。


db2look.ddl的输出中,开头部分是表空间tablespace的DDL语句:


CONNECT TO MY_DB; 



 ------------------------------------ 

 -- DDL Statements for TABLESPACES -- 

 ------------------------------------ 



 CREATE LARGE TABLESPACE "MY_DATA" IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 8192 MANAGED BY DATABASE  

USING (DEVICE '/dev/ratmp_data'2097152) 

EXTENTSIZE 16 

PREFETCHSIZE AUTOMATIC 

BUFFERPOOL IBMDEFAULTBP 

OVERHEAD 7.500000 

TRANSFERRATE 0.060000  

FILE SYSTEM CACHING   

DROPPED TABLE RECOVERY ON;


 
其次是sequence的DDL语句:

--------------------------------- 

 -- DDL Statements for Sequences 

 --------------------------------- 





 CREATE SEQUENCE "MY    "."ALM_SEQ" AS INTEGER 

MINVALUE 1 MAXVALUE 999999999 

START WITH 81143 INCREMENT BY 1 

CACHE 1000 CYCLE NO ORDER; 



 ALTER SEQUENCE "MY    "."ALM_SEQ" RESTART WITH 199142;




后面是用户定义函数和存储过程:


--------------------------------- 

 -- DDL statements for User Defined Functions 

 --------------------------------- 

 x 

 x 



 --------------------------------- 

 -- DDL statements for stored procedures 

 --------------------------------- 

 x 

 x






之后是很多表及视图的DDL语句,其中包括了完整性约束,参考性约束,索引创建等的DDL:

------------------------------------------------ 

 -- DDL Statements for table "SCHREMA_name     "."TABLE_name" 

 ------------------------------------------------ 

 x 

 x 

 x 

 ------------------------------------------------ 

 -- DDL Statements for table "SCHREMA_name     "."TABLE_name" 

 ------------------------------------------------ 

 x 

 x 

 x 

 ---------------------------- 



 -- DDL Statements for Views 



 ----------------------------




最后是数据库对象使用权限的用户授权DDL:

-------------------------------------------- 

 -- Authorization Statements on Tables/Views  

 -------------------------------------------- 



   

 GRANT CONTROL ON TABLE "MY    "."ACEMAP" TO USER "ATMDBUSR" ; 



 GRANT CONTROL ON TABLE "MY    "."ADJUSTJAM" TO USER "ATMDBUSR" ; 



 --------------------------------------- 

 -- Authorization Statements on Schemas  

 --------------------------------------- 



   

 GRANT CREATEIN ON SCHEMA "DBUSR" TO  PUBLIC   ; 



 GRANT CREATEIN ON SCHEMA "MY    " TO  PUBLIC   ; 



 ---------------------------------------- 

 -- Authorization Statements on Database  

 ---------------------------------------- 



   

 GRANT CREATETAB ON DATABASE  TO USER "ATMDBUSR" ; 



 GRANT BINDADD ON DATABASE  TO USER "ATMDBUSR" ; 



 ----------------------------------------------------- 

 -- Authorization Statements on User Defined Functions  

 ----------------------------------------------------- 



   

 GRANT EXECUTE ON FUNCTION "MY    "."MAT"(VARCHAR(),VARCHAR()) TO USER "DBUSR" WITH GRANT OPTION; 



 GRANT EXECUTE ON FUNCTION "MY    "."ONDS"(VARCHAR(),VARCHAR()) TO USER "DBUSR" WITH GRANT OPTION; 



 ----------------------------------------------------- 

 -- Authorization Statements on Stored Procedures  

 ----------------------------------------------------- 



   

 GRANT EXECUTE ON PROCEDURE "MY    "."BSPECTRSVIEW"(INTEGER,CHAR()) TO USER "DBUSR" WITH GRANT OPTION; 



 GRANT EXECUTE ON PROCEDURE "MY    "."BUIIEW"(INTEGER,CHAR()) TO USER "DBUSR" WITH GRANT OPTION; 



 --------------------------------------- 

 -- Authorization statement on table space  

 --------------------------------------- 



   

 GRANT USE OF TABLESPACE "MY_DATA" TO USER "DBUSR" ; 



 GRANT USE OF TABLESPACE "MY_IDX" TO USER "DBUSR" ; 



 --------------------------------------- 

 -- Authorization statement on sequence  

 --------------------------------------- 



   

 GRANT USAGE ON SEQUENCE "OWK     "."PROCESS_INST_SEQ" TO USER "DBUSR" WITH GRANT OPTION; 



 GRANT ALTER ON SEQUENCE "OWK     "."PROCESS_INST_SEQ" TO USER "DBUSR" WITH GRANT OPTION;




完成之后,就commit DDL语句:
COMMIT WORK;


CONNECT RESET;


TERMINATE;




从db2look提取到的信息中,我们如果要重建一个数据库,那么应该按照如下顺序将db2look.ddl文件分为几个部分按照先后顺序来执行:
1.根据自己需要创建一定大小的pagesize和bufferpool和表空间,表空间可以通过修改表空间的DDL语句实现自定义,将修改之后的表空间DDL语句隔离出来形成新的文件取名为create_tablespace.ddl
2.将sequence对象的DDL提取出来形成新的文件create_sequence.ddl
3.将用户定义函数和存储过程部分提取出来形成新的文件create_userfunction_storage.ddl
4.将表及视图等数据库对象的DDL语句提取出来形成create_object.ddl
4.将原DB2数据库授权DDL语句提取出来形成新的文件authorization_object.ddl


每个DDL的开头是数据库连接语句:CONNECT TO DB_NAME;结尾是DDL提交语句:COMMIT WORK;CONNECT RESET;TERMINATE;
这几个DDL文件的执行顺序为:
1)create_tablespace.ddl
2)create_sequence.ddl
3)create_object.ddl
4) create_userfunction_storage.ddl
5) authorization_object.ddl


一切数据库对象都是存放在表空间之上,因此先创建表空间,用户定义函数和存储过程需要用到数据库中的表,视图和sequence等对象,在创建用户定义的函数和存储过程之前,需要先创建数据库的他表,视图和sequence等对象,对象创建完成之后,可以定义用户函数和存储过程,全部完成之后,最后对全部数据库授权用户使用。

待新建的数据库中的这些条条框框都准备好之后,便可以使用load往数据库里面装入数据了。