"替换成Windows系统下的一个文件名称,每一个表空间使用不同的文件名。也可以根据对数据库中数据分布的估计,调整表空间的大小。
重建数据库
按以下步骤重建数据库:
1、编辑db2move.lst,删除在新库中已不使用的表。
根据上述步骤中得到的仅在旧数据库中存在的表,编辑db2move.lst,删除该表所在的行。
2、删除旧数据库。
执行以下命令,删除旧数据库:db2 drop database cusgadev
3、创建数据库,执行以下命令,创建新数据库:
db2 create database cusgadev using codeset iso8859-1 territory cn
其中,"iso8859-1"表示数据库使用的字符集,"cn"表示数据库使用的地域。
4、连接数据库:执行以下命令,连接新数据库:db2 connect to cusgadev
5、修改物理日志参数,执行以下命令,修改数据库的日志参数:
db2 update database configuration using logfilsiz 25000 deferred
创建数据时,默认的日志空间比较小,对于大事务的处理有影响,所以,需要根据应用的需要及PC机的配置适当调整日志空间的值。
可以使用"GET DATABASE CONFIGURATION"命令查看数据库的当前配置。
6、创建缓冲池,执行以下命令,为数据库创建缓冲池:db2 create bufferpool BF81 size 10000 pagesize 8 K。
7、创建表空间,执行以下命令,为数据库创建表空间:
db2 CREATE TABLESPACE "DATATBS00_8K" PAGESIZE
8K MANAGED BY DATABASE USING
(FILE '<filename>' 50000) bufferpool bf81
db2 CREATE TABLESPACE "DATATBS01_8K" PAGESIZE
8K MANAGED BY DATABASE USING
(FILE '<filename>' 50000) bufferpool bf81
db2 CREATE TABLESPACE "DATATBS02_8K" PAGESIZE
8K MANAGED BY DATABASE USING
(FILE '<filename>' 50000) bufferpool bf81
db2 CREATE TABLESPACE "IDXTBS00_8K" PAGESIZE
8K MANAGED BY DATABASE USING
(FILE '<filename>' 50000) bufferpool bf81
db2 CREATE TABLESPACE "IDXTBS02_8K" PAGESIZE
8K MANAGED BY DATABASE USING
(FILE '<filename>' 50000) bufferpool bf81
db2 CREATE TABLESPACE "STATICTBS00_8K" PAGESIZE
8K MANAGED BY DATABASE USING
(FILE '<filename>' 50000) bufferpool bf81
db2 CREATE TABLESPACE "USERSPACE1" PAGESIZE
8K MANAGED BY DATABASE USING
(FILE '<filename>' 50000) bufferpool bf81
其中,tablespace的名称是从新数据库的SCHEMA文件中提取出来的。本例中,它们都使用同一个缓冲池。""需要按照PC机硬盘空余空间的情况,修改为实际的全路径文件名称。
8、用新的SCHEMA创建数据库:
执行以下命令,按照新数据库的SCHEMA创建其中的各种对象,如表、索引等:db2 -tvf cusnew.sql。
9、装入数据,执行以下命令,将旧数据库的数据装入到刚创建的新数据库中:db2move cusgadev load。
该命令使用的修改后的db2move.lst作为装入表的清单。
有选择的将新库中独有的表的数据导入到本地新数据库中对于仅在新数据库中存在的表,可以根据需要有选择的将其数据从SIT环境导入到单元测试环境。本文中,不考虑新表对于其他表的外键关联。
假设某个仅在新数据库中存在的表的名称为"newtable",在SIT环境执行以下命令卸出数据:
db2 unload to newtable.ixf of ixf select * from newtable。将文件“newtable.ixf”传输到单元测试环境所在的PC机上,执行以下命令:db2 load from newtable.ixf of ixf insert into newtable。如果这个新表对于其他表有外键关联,还需要导入其他相关表的数据。
检查数据库的完整性
检查完整性的SHELL程序以下是"CheckIntegrity.sh"的源代码。该程序用于在数据load结束以后,检查数据库的完整性。
#!/usr/bin/sh
# 在数据load结束后,检查数据库的完整性
# Copyright: SI HITECH 2006
# 作 者: 郑靖华
# 创建日期: 2006 年 8 月 2 日
# 指定数据库名称
if [ $# -lt 1 ]
then
DBNAME=ccdb
else
DBNAME=$1
fi
# 检查db2move的lst文件
if [ ! -r db2move.lst ]
then
echo "当前目录下没有db2move的清单文件
[ db2move.lst ],请确保目录正确并再次执行本命令!"
exit 1
fi
# 生成执行完整性检查的SHELL程序
awk -F"!" -v_dbname=${DBNAME} 'BEGIN{
printf("connect to %s;\n", _dbname);
}{
printf("set integrity for %s immediate checked;\n", $2);
}' db2move.lst > $DBNAME.integrity.sql
# 执行检查程序
db2 -tvf $DBNAME.integrity.sql
echo "完整性检查完毕,请仔细查看检查结果!"
exit 0
所谓外键关联链,是指A表依赖于B表,B表依赖于C表。只有当C表的外键关联检查成功以后,才能检查B表;同样的,只有当B表的外键关联检查成功以后,才能检查A表。即为了检查A表,可能需要多次执行上述SHELL程序。
所谓外键关联环,是指A表直接或者间接依赖于自身(A表)。比如,A表的a1字段依赖于A表的a2字段,同时,A表的a2字段也依赖于A表的a3字段(其中,a1、a2、a3可以相同,也可以不同),这是一个直接关联的环。再如,A表的a1字段依赖于B表的b1字段,同时,B表的b2字段依赖于A表的a2字段(其中,a1和a2、b1和b2可以相同,也可以不同),这是一个间接关联的环。如果存在这样的环,我们必须通过删除其中的某一个或几个依赖来打破这个环,在完整性检查结束以后,再重建那些被临时删除的依赖。
验证完整性的SHELL程序
我们通过查询所有表的记录数,来验证所有表的完整性是否都已经检查成功。以下是“CntDb.sh”的源码。
#!/usr/bin/sh
# 在数据load结束后,取得数据库每一个表的记录数
# Copyright: SI HITECH 2006
# 作 者: 郑靖华
# 创建日期: 2006 年 8 月 3 日
# 指定数据库名称
if [ $# -lt 1 ]
then
DBNAME=ccdb
else
DBNAME=$1
fi
# 检查db2move的lst文件
if [ ! -r db2move.lst ]
then
echo "当前目录下没有
db2move的清单文件 [ db2move.lst
],请确保目录正确并再次执行本命令!"
exit 1
fi
# 生成执行完整性检查的SHELL程序
awk -F"!" -v_dbname=${DBNAME} 'BEGIN{
printf("connect to %s;\n", _dbname);
}{
tbname = $2;
gsub("\"", "", tbname);
gsub(" ", "", tbname);
printf("select count(*) from %s;\n", tbname);
}' db2move