基于DB2及PHP的应用系统跨平台迁移实例讲解(2)_PHP教程
推荐:用PHP编程语言开发动态WAP网站WAP(无线通讯协议)是在数字移动电话、个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准协议。随着无线通讯的不断发展,静态的WAP页面在很多方面已经不能满足用户个性化的要求,因此开发者可以在WAP服务器端使用诸如PHP等语言产生动态的WML页面,来
清单 5. srcdb1_procedures.ddl语句
CREATE PROCEDURE " SRCDB1"." JAVA_PROCEDURE_1"
(
OUT SQLSTATE CHARACTER(5),
OUT ROWS_SUBMITED INTEGER,
IN BATCH_ID INTEGER,
IN LEVEL VARCHAR(4000)
)
DYNAMIC RESULT SETS 0
SPECIFIC SUBMIT_BATCH
EXTERNAL NAME 'Submit_batch!submit_batch'
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT DETERMINISTIC
FENCED THREADSAFE
MODIFIES SQL DATA
NO DBINFO;
CREATE PROCEDURE " SRCDB1"."JAVA_PROCEDURE_2" ……;
……
CREATE PROCEDURE " SRCDB1"."JAVA_PROCEDURE_N" ……;
SET CURRENT SCHEMA = " SRCDB1";
SET CURRENT PATH = "SYSIBM","SYSFUN"," SRCDB1";
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_1 (
IN hostname varchar(4000),
IN username varchar(4000),
OUT SQLCODE_OUT int )
SPECIFIC SRCDB1.SQL_PROCEDURE_1
LANGUAGE SQL
-------------------------------------------------
-- SQL Stored Procedure
-------------------------------------------------
P1: BEGIN
……
END P1 ;
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_2 ……;
……
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_N ……;
需要注意的是,db2 v6 版本的 db2look 尚未实现抽取如 UDF,TRIGGER,UserSpace,NodeGroup,BufferPool 等数据库对象的 ddl 语句。从 db2 v7 开始,db2look 可以抽取上述对象的 DDL,但是依然无法抽取创建存储过程对象的 ddl 语句。从 db2 v8.2 开始,完善了对 db2look 功能的支持,实现了存储过程 ddl 语句的抽取功能。由于本文所涉及的源数据库系统的版本较低(DB2 v8.1),因此需要采取上述方案获取所有数据库对象的 DDL 信息:
1). 从某个 DB2 v8.2 系统对 SRCDB1(DB2 v8.1 版本)执行 CATALOG 操作:
db2 catalog db SRCDB1 as SRCDB1;
2). 从 DB2 v8.2 系统对 SRCDB1 进行 db2look 抽取过程:
db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1;
这样就可以获取完整的数据库对象 DDL 信息。
3.生成数据导出export脚本
使用 shell 脚本生成并导出所有数据的 DML 脚本,并将其重定向到 srcdb1_export.sql 文件中。对于熟悉 DB2 的用户来说,应该知道数据库中创建的每个表、视图、别名均对应 SYSCAT.TABLES 中一行记录。因此可以通过相应的数据库 select 语句就可以获取所有需要的数据库表信息。根据需要,下述 shell 脚本将从系统表 SYSCAT.TABLES 中根据 tabname 字段选出 SRCDB1 中所有 tabschema 表模式是 SRCDB1,ASN,SQLDBA,DB2DBG 的表名字,并根据它们的名字生成相应的 export 导出语句,到达批量导出的目的。rtrim 函数用于去除 tabname 字段数据的右边的空格。
清单6. 生成export脚本
# db2 "select 'export to ' || rtrim(tabname) || '.ixf of ixf select * from ' ||
rtrim(tabname) || ';' from syscat.tables
where tabschema in('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')" > srcdb1_export.sql ;
编辑生成的 srcdb1_export.sql,删除头部和尾部所显示的统计信息,只保留必要的 export 语句。通过修改上述脚本中所包含的 tabschema 信息,可以指定需要导出的表的范围,也即迁移过程中需要的所有表名。所生成的 export 导出语句具有如下的命令形式:
db2 export to tablename.ixf of ixf select * from tablename;
4.生成数据导入 load 脚本
使用 shell 脚本生成 load 脚本用于将数据导入目标系统:srcdb1_load.sql
清单7. 生成 load 脚本
# db2 "select 'load from ' || rtrim(tabname) || '.ixf of ixf insert into ' ||
rtrim(tabname) || ';' from syscat.tables
where tabschema in ('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')" > srcdb1_load.sql;
编辑生成的 srcdb1_load.sql,删除头部和尾部的统计信息,只保留必要的 load 语句。与 export 导出语句类似,上述 shell 脚本从系统表中选出 SRCDB1 中所有表的名字,并根据它们的名字生成相应的 import 导入语句,到达批量导入的目的。所生成的 import 导入语句命令形式如下:
db2 load from tablename.ixf of ixf insert into tablename;
5.处理数据库表中的自增字段
对于需要加载的含有自增字段的表,即该表的 ixf 数据文件中有自增列的值, 可以在 load 命令中加入如下参数控制自增字段值:
1). modified by identityignore :加载的数据文件中有自增字段值,load 时忽略数据文件中自增字段值 ;
2). modified by identitymissing :加载的数据文件中没有自增字段值,load 时自动生成自增字段值 ;
3). modified by identityoverride :加载的数据文件中有自增字段值,load 时使用数据文件中的自增字段值 。
为了使目标数据库中含有自增字段的表中数据与源数据库中的数据保持一致,本文实例中选择使用 modified by identityoverride 参数,在导入数据时使用数据文件中的自增字段值。读者可以根据不同情况选择适当的控制参数。
首先,在 srcdb1_tables.ddl 文件中查找所有包自增字段的表名 ( 含有 GENERATED ALWAYS AS IDENTITY 字段的表 ),然后在 srcdb1_load.sql 中将 modified by identityoverride 语句片段插入到这些含有自增字段的表所对应的 load 命令行中。
清单8. load 脚本中自增字段处理
db2 load from test.ixf of ixf modified by identityoverride insert into TEST;
6.执行导出脚本
执行导出脚本,导出所有表的数据 。
# db2 -tvf srcdb1_export.sql
导出的表数据以 ixf 格式存放于当前路径下。
7.保存脚本和数据文件
将所有 DDL 脚本以及数据文件 *.ixf 复制到目标系统所在站点。
LINUX 系统上的操作
1.通过命令行处理器(CLP)创建实例 SRCDB1:
# db2icrt SRCDB1
2.使用 CREATE DATABASE 命令创建数据库 SRCDB1,创建必要的表空间及配置必要的数据库参数。
# db2 create database SRCDB1
3.连接到数据库 SRCDB1,执行 srcdb1_tables.ddl 脚本创建缓冲池,表空间,UDF,表以及 Index,Sequence,视图等数据库对象。
# db2 connect to srcdb1
# db2 -tvf srcdb1_tables.ddl
4.进入到放置 .ixf 数据文件的目录,执行下面的命令导入表数据。
# db2 -tvf srcdb1_load.sql
5.使用 srcdb1_foriegnkeys.ddl,srcdb1_triggers.ddl ,srcdb1_procedures.ddl 脚本文件创建外键约束,触发器和存储过程。
# db2 -tvf srcdb1_foriegnkeys.ddl
# db2 -tvf srcdb1_triggers.ddl
# db2 -tvf srcdb1_procedures.ddl
成功完成上述步骤后,数据库的迁移工作基本完成。
分享:学习PHP必备的知识及工具数据库操作:PEAR,这个里边的DB库大家都知道很好用,也很耐用。准推荐。PDO,这个在PHP。INI里配置一下,应该说是很不错,很推荐。 ADODB,老同志了,大家也可以用一用,效果也还是很明显,推荐。 框架: ZENDFRAMEWORK,这用说了,官方的大家伙,有了它就
- 相关链接:
- 教程说明:
PHP教程-基于DB2及PHP的应用系统跨平台迁移实例讲解(2)。