预迁移步骤非常重要,是实现成功迁移的关键。在本节中,实际上将执行三项任务:
-
在开始迁移之前,搜集有关当前数据库和环境的最重要信息(给出了一些有用的脚本和示例)。这样一来,如果在迁移过程中出现了问题,您可以很轻易地恢复到迁移前的状态。同样,如果您需要使用这些信息并且这些参数值在迁移后还有用的话,您还可以应用它们。
-
查看您的机器是否兼容以及是否能够安全地安装和使用 DB2 9。
-
停止 DB2 服务器,准备进行迁移。
-
运行数据库的脱机备份。
Check if there is any application or user connected to the database by issuing db2 list application Disconnect any user or application before issuing the offline backup by running db2 force application all Issue a backup either to TSM, to a directory or a device db2 backup database dbname use TSM To TSM db2 backup database dbname to directory/device To a directory or to a device
-
将数据库配置信息保存为 db cfg、dbm cfg 和数据行计数。
-
对数据库中的所有表格进行行计数并保存结果。下面的脚本将帮助实现此操作。
-
对数据库运行
db2 get db cfg for dbname
并保存结果。 -
运行
db2 get dbm cfg
并保存结果。 -
运行
db2set -all
并保存结果。 -
对数据库运行
db2 list tablespaces show detail
和db2 list packages for all show detail
并保存结果。 -
运行
db2look -d $dbname -e -a -m -o $outputfilename
。 -
运行
db2dart dbname /DB /V Y /RPT . /RPTF E
并保存结果。运行这个命令将占用一些时间。
清单 1. 在 UNIX 平台上实现表行计数的示例。脚本名:get_table_count.sh
if [ $# -lt 1 ]; then echo "This script need a database name as a parameter " echo echo "Example $0 dbname " exit 1 fi db2 "connect to $1 " if [ $? -ne 0 ]; then echo "ERROR connecting to the database $1" echo;echo exit 1 fi db2 "select tabname from syscat.tables where tabschema = 'SIEBEL' order by 1" > x export rownums=`cat x | wc -l` export headrows=$(($rownums-3)) export tailrows=$(($headrows-3)) cat x | head -$headrows | tail -$tailrows > y echo; echo while read tabname do db2 "select count(*) from siebel.$tabname " > x1 rownums=`cat x1 | wc -l` if [ $rownums -gt 3 ]; then headrows=$(($rownums-3)) tailrows=$(($headrows-3)) cat x1 | head -$headrows | tail -$tailrows > y1 nb=$(cat y1) else nb=0 fi echo "--------------- Number of rows in table ... $tabname $nb" echo done < y rm x y x1 y1 db2 terminate -
如果 Siebel 模式名不是 SIEBEL,则应该对脚本和循环中的第一个查询做出相应地修改。
清单 2. 在迁移前获得所有 db 信息的脚本。脚本名:get_db_info.sh
if [ $# -lt 1 ]; then echo "This script need a database name as a parameter " echo echo "Example $0 dbname " echo;echo exit 1 fi export db_name=$1 date echo;echo "-------------- Table counts" nohup get_table_count.sh $db_name | tee table_count.log db2 connect to $db_name echo;echo "-------------- Tablespace lists with detail" db2 list tablespaces show detail | tee tbspace_detail.log echo;echo "-------------- Package lists with detail" db2 list packages show detail | tee package_detail.log echo;echo "-------------- DBM CFG" db2 get dbm cfg | tee dbmcfg.log echo;echo "-------------- DB CFG" db2 get db cfg for $db_name | tee dbcfg.log echo;echo "-------------- DB2 SET" db2set -all | tee db2set.log echo;echo "-------------- db2look for all db objects" db2look -d $db_name -e -a -m -o db2look.log db2 terminate echo;echo "-------------- db2dart on all database. This will take time" db2 force application all db2dart $db_name /DB /V Y /RPT . /RPTF E date
-
查看磁盘空间需求。数据库迁移需要额外的磁盘空间,如下所示:
-
SQLSPCS.1 和 SQLSPCS.2 文件包含表空间信息,并且在迁移过程中会增长为初始大小的四倍。如果这两个文件的总大小是 512KB,那您至少需要 2MB 的自由空间。
-
确保系统目录和系统临时表空间中具有足够的自由空间。然而,磁盘空间会发生变化,建议您应用下面的原则。将 SYSCATSPACE 和 TEMPSPACE1(这里是默认名称,可以改变)的总大小增加为目前的两倍。对于 SMS 表空间,增加容器文件的大小,而对于 DMS,则要增加额外的容器文件(这将使数据重新进行平衡)。只有进行迁移操作时才需要额外的空间,因此成功完成迁移后可以减少表空间的大小。以下的示例基于 AIX 和 Siebel 77 DB2 数据库,展示了如何确定 SYSCATSPACE 所占的空间大小。
$ db2 list tablespaces show detail Tablespaces for Current Database Tablespace ID = 0 Name = SYSCATSPACE Type = System managed space Contents = All permanent data. Regular table space. State = 0x0000 Detailed explanation: Normal Total pages = 229882 Useable pages = 229882 Used pages = 229882 Free pages = Not applicable High water mark (pages) = Not applicable Page size (bytes) = 4096 Extent size (pages) = 32 Prefetch size (pages) = 32 Number of containers = 1 229882 pages x 4096 bytes per page which is about 898 MB. Next, you need to find out where the containers for this tablespace are located. $ db2 list tablespace containers for 0 Tablespace Containers for Tablespace 0 Container ID = 0 Name = /V9_FS/sia77u_v9/catalog Type = Path You now need to find out if the free space is at least twice of the used space. $ df -k /V9_FS Filesystem 1024-blocks Free %Used Iused %Iused Mounted on /dev/V9_LV 70909952 67149124 6% 704 1% /V9_FS You can see that you have 67GB free space in this file system, which is enough -
将 logfilsiz、logprimary 和 logsecond 的值增加为当前大小的两倍。迁移在单个事务中改变系统目录对象,并且这些更改需要足够的日志空间来包含该事务。如果空间不够的话,该事务将回滚并且也不能成功实现迁移。
-
-
只针对 Linux:将裸设备(raw device)改为块设备(block device)。
-
发出以下命令停止 DB2 服务器:
db2licd -end db2 force application all check if there is any application still connecting by issuing db2 list applications db2stop (to be issued for each instance) db2admin stop (to be issued as the DAS user) db2_kill ps -eaf | grep db2 (make sure there are no DB2 processes up)
-
在安装 DB2 9 之前,要确保您的机器是兼容的,并且已经安装好了所有的修正程序和补丁